|
|
@ -44,7 +44,7 @@ |
|
|
|
%% %% Select all events where both 'a' and 'b' exists and are greater than 0. |
|
|
|
%% glc:all([glc:gt(a, 0), glc:gt(b, 0)]). |
|
|
|
%% %% Select all events where 'a' or 'b' exists and are greater than 0. |
|
|
|
%% glc:any([glc:get(a, 0), glc:gt(b, 0)]). |
|
|
|
%% glc:any([glc:gt(a, 0), glc:gt(b, 0)]). |
|
|
|
%% ''' |
|
|
|
%% |
|
|
|
%% === Handling output events === |
|
|
@ -74,7 +74,8 @@ |
|
|
|
lt/2, |
|
|
|
eq/2, |
|
|
|
gt/2, |
|
|
|
wc/1 |
|
|
|
wc/1, |
|
|
|
nf/1 |
|
|
|
]). |
|
|
|
|
|
|
|
-export([ |
|
|
@ -85,6 +86,9 @@ |
|
|
|
]). |
|
|
|
|
|
|
|
-export([ |
|
|
|
input/1, |
|
|
|
output/1, |
|
|
|
filter/1, |
|
|
|
union/1 |
|
|
|
]). |
|
|
|
|
|
|
@ -110,6 +114,10 @@ gt(Key, Term) -> |
|
|
|
wc(Key) -> |
|
|
|
glc_ops:wc(Key). |
|
|
|
|
|
|
|
-spec nf(atom()) -> glc_ops:op(). |
|
|
|
nf(Key) -> |
|
|
|
glc_ops:nf(Key). |
|
|
|
|
|
|
|
%% @doc Filter the input using multiple filters. |
|
|
|
%% |
|
|
|
%% For an input to be considered valid output the all filters specified |
|
|
@ -192,6 +200,22 @@ compile(Module, Query, Reset) -> |
|
|
|
handle(Module, Event) -> |
|
|
|
Module:handle(Event). |
|
|
|
|
|
|
|
%% @doc The number of input events for this query module. |
|
|
|
-spec input(atom()) -> non_neg_integer(). |
|
|
|
input(Module) -> |
|
|
|
Module:info(input). |
|
|
|
|
|
|
|
%% @doc The number of output events for this query module. |
|
|
|
-spec output(atom()) -> non_neg_integer(). |
|
|
|
output(Module) -> |
|
|
|
Module:info(output). |
|
|
|
|
|
|
|
%% @doc The number of filtered events for this query module. |
|
|
|
-spec filter(atom()) -> non_neg_integer(). |
|
|
|
filter(Module) -> |
|
|
|
Module:info(filter). |
|
|
|
|
|
|
|
|
|
|
|
%% @doc Release a compiled query. |
|
|
|
%% |
|
|
|
%% This releases all resources allocated by a compiled query. The query name |
|
|
@ -392,9 +416,35 @@ events_test_() -> |
|
|
|
?assertEqual(1, Mod:info(output)) |
|
|
|
end |
|
|
|
}, |
|
|
|
{"opfilter wildcard test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod8, glc:wc(a)), |
|
|
|
glc:handle(Mod, gre:make([{b, 2}], [list])), |
|
|
|
?assertEqual(1, Mod:info(input)), |
|
|
|
?assertEqual(1, Mod:info(filter)), |
|
|
|
?assertEqual(0, Mod:info(output)), |
|
|
|
glc:handle(Mod, gre:make([{a, 2}], [list])), |
|
|
|
?assertEqual(2, Mod:info(input)), |
|
|
|
?assertEqual(1, Mod:info(filter)), |
|
|
|
?assertEqual(1, Mod:info(output)) |
|
|
|
end |
|
|
|
}, |
|
|
|
{"opfilter notfound test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod9, glc:nf(a)), |
|
|
|
glc:handle(Mod, gre:make([{a, 2}], [list])), |
|
|
|
?assertEqual(1, Mod:info(input)), |
|
|
|
?assertEqual(1, Mod:info(filter)), |
|
|
|
?assertEqual(0, Mod:info(output)), |
|
|
|
glc:handle(Mod, gre:make([{b, 2}], [list])), |
|
|
|
?assertEqual(2, Mod:info(input)), |
|
|
|
?assertEqual(1, Mod:info(filter)), |
|
|
|
?assertEqual(1, Mod:info(output)) |
|
|
|
end |
|
|
|
}, |
|
|
|
{"opfilter greater than test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod8, glc:gt(a, 1)), |
|
|
|
{compiled, Mod} = setup_query(testmod10, glc:gt(a, 1)), |
|
|
|
glc:handle(Mod, gre:make([{'a', 2}], [list])), |
|
|
|
?assertEqual(1, Mod:info(input)), |
|
|
|
?assertEqual(0, Mod:info(filter)), |
|
|
@ -406,7 +456,7 @@ events_test_() -> |
|
|
|
}, |
|
|
|
{"opfilter less than test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod9, glc:lt(a, 1)), |
|
|
|
{compiled, Mod} = setup_query(testmod11, glc:lt(a, 1)), |
|
|
|
glc:handle(Mod, gre:make([{'a', 0}], [list])), |
|
|
|
?assertEqual(1, Mod:info(input)), |
|
|
|
?assertEqual(0, Mod:info(filter)), |
|
|
@ -419,7 +469,7 @@ events_test_() -> |
|
|
|
}, |
|
|
|
{"allholds op test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod10, |
|
|
|
{compiled, Mod} = setup_query(testmod12, |
|
|
|
glc:all([glc:eq(a, 1), glc:eq(b, 2)])), |
|
|
|
glc:handle(Mod, gre:make([{'a', 1}], [list])), |
|
|
|
glc:handle(Mod, gre:make([{'a', 2}], [list])), |
|
|
@ -437,7 +487,7 @@ events_test_() -> |
|
|
|
}, |
|
|
|
{"anyholds op test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod11, |
|
|
|
{compiled, Mod} = setup_query(testmod13, |
|
|
|
glc:any([glc:eq(a, 1), glc:eq(b, 2)])), |
|
|
|
glc:handle(Mod, gre:make([{'a', 2}], [list])), |
|
|
|
glc:handle(Mod, gre:make([{'b', 1}], [list])), |
|
|
@ -452,7 +502,7 @@ events_test_() -> |
|
|
|
{"with function test", |
|
|
|
fun() -> |
|
|
|
Self = self(), |
|
|
|
{compiled, Mod} = setup_query(testmod12, |
|
|
|
{compiled, Mod} = setup_query(testmod14, |
|
|
|
glc:with(glc:eq(a, 1), fun(Event) -> Self ! gre:fetch(a, Event) end)), |
|
|
|
glc:handle(Mod, gre:make([{a,1}], [list])), |
|
|
|
?assertEqual(1, Mod:info(output)), |
|
|
@ -461,7 +511,7 @@ events_test_() -> |
|
|
|
}, |
|
|
|
{"delete test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod13, glc:null(false)), |
|
|
|
{compiled, Mod} = setup_query(testmod15, glc:null(false)), |
|
|
|
?assert(is_atom(Mod:table(params))), |
|
|
|
?assertMatch([_|_], gr_param:info(Mod:table(params))), |
|
|
|
?assert(is_list(code:which(Mod))), |
|
|
@ -481,7 +531,7 @@ events_test_() -> |
|
|
|
}, |
|
|
|
{"reset counters test", |
|
|
|
fun() -> |
|
|
|
{compiled, Mod} = setup_query(testmod14, |
|
|
|
{compiled, Mod} = setup_query(testmod16, |
|
|
|
glc:any([glc:eq(a, 1), glc:eq(b, 2)])), |
|
|
|
glc:handle(Mod, gre:make([{'a', 2}], [list])), |
|
|
|
glc:handle(Mod, gre:make([{'b', 1}], [list])), |
|
|
@ -510,7 +560,7 @@ events_test_() -> |
|
|
|
{"ets data recovery test", |
|
|
|
fun() -> |
|
|
|
Self = self(), |
|
|
|
{compiled, Mod} = setup_query(testmod15, |
|
|
|
{compiled, Mod} = setup_query(testmod17, |
|
|
|
glc:with(glc:eq(a, 1), fun(Event) -> Self ! gre:fetch(a, Event) end)), |
|
|
|
glc:handle(Mod, gre:make([{a,1}], [list])), |
|
|
|
?assertEqual(1, Mod:info(output)), |
|
|
|