Boolean logic, and some other small enhancements: an {equals, A, B} query which just compares strings for equality, and a shortcut ability to use a string constant "foo" instead of {string, "foo"}.

This commit is contained in:
Simon MacMullen 2013-08-07 17:02:12 +01:00
parent 5e6ee7b90f
commit 2cd07a3c07
3 changed files with 58 additions and 1 deletions

View File

@ -27,7 +27,15 @@
{string, "can-declare-queues"}}
},
{permission, write, {constant, true}},
{permission, read, {constant, true}}
{permission, read,
{'or',
[{'and',
{equals, "${name}", "test1"},
{equals, "${username}", "Simon MacMullen"}},
{'and',
{equals, "${name}", "test2"},
{'not', {equals, "${username}", "Mike Bridgen"}}}
]}}
]}}
]}}
]}

View File

@ -132,6 +132,41 @@ evaluate0({in_group, DNPattern, Desc}, Args,
?L1("evaluated in_group for \"~s\": ~p", [DN, R], State),
R;
evaluate0({'not', SubQuery}, Args, User, LDAP, State) ->
R = evaluate(SubQuery, Args, User, LDAP, State),
?L1("negated result to ~s", [R], State),
not R;
evaluate0({'and', SubQuery1, SubQuery2}, Args, User, LDAP, State) ->
evaluate0({'and', [SubQuery1, SubQuery2]}, Args, User, LDAP, State);
evaluate0({'and', Queries}, Args, User, LDAP, State) when is_list(Queries) ->
R = lists:foldl(fun (Q, true) -> evaluate(Q, Args, User, LDAP, State);
(_Q, false) -> false
end, true, Queries),
?L1("'and' result: ~s", [R], State),
R;
evaluate0({'or', SubQuery1, SubQuery2}, Args, User, LDAP, State) ->
evaluate0({'or', [SubQuery1, SubQuery2]}, Args, User, LDAP, State);
evaluate0({'or', Queries}, Args, User, LDAP, State) when is_list(Queries) ->
R = lists:foldl(fun (_Q, true) -> true;
(Q, false) -> evaluate(Q, Args, User, LDAP, State)
end, false, Queries),
?L1("'or' result: ~s", [R], State),
R;
evaluate0({equals, StringQuery1, StringQuery2}, Args, User, LDAP, State) ->
safe_eval(fun (String1, String2) ->
R = String1 =:= String2,
?L1("evaluated equals \"~s\", \"~s\": ~s",
[String1, String2, R], State),
R
end,
evaluate(StringQuery1, Args, User, LDAP, State),
evaluate(StringQuery2, Args, User, LDAP, State));
evaluate0({match, StringQuery, REQuery}, Args, User, LDAP, State) ->
safe_eval(fun (String, RE) ->
R = case re:run(String, RE) of
@ -145,6 +180,9 @@ evaluate0({match, StringQuery, REQuery}, Args, User, LDAP, State) ->
evaluate(StringQuery, Args, User, LDAP, State),
evaluate(REQuery, Args, User, LDAP, State));
evaluate0(StringPattern, Args, User, LDAP, State) when is_list(StringPattern) ->
evaluate0({string, StringPattern}, Args, User, LDAP, State);
evaluate0({string, StringPattern}, Args, _User, _LDAP, State) ->
R = fill(StringPattern, Args, State),
?L1("evaluated string for \"~s\"", [R], State),

View File

@ -59,6 +59,16 @@ string_match_test_() ->
{?SIMON, B(<<"abc123">>), fail},
{?SIMON, B(<<"xch-Someone Else-abc123">>), fail}]].
boolean_logic_test_() ->
Q1 = [#'queue.declare'{queue = <<"test1">>},
#'basic.consume'{queue = <<"test1">>}],
Q2 = [#'queue.declare'{queue = <<"test2">>},
#'basic.consume'{queue = <<"test2">>}],
[test_resource_fun(PTR) || PTR <- [{?SIMON, Q1, ok},
{?SIMON, Q2, ok},
{?MIKEB, Q1, fail},
{?MIKEB, Q2, fail}]].
test_resource_fun({Person, Things, Result}) ->
fun() ->
{ok, Conn} = amqp_connection:start(Person),
@ -66,6 +76,7 @@ test_resource_fun({Person, Things, Result}) ->
?assertEqual(Result,
try
[amqp_channel:call(Ch, T) || T <- Things],
amqp_connection:close(Conn),
ok
catch exit:_ -> fail
end)