From 7d0abb6146f976be25437179593d1e74dc880656 Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Thu, 8 Jun 2023 08:56:24 +0300 Subject: [PATCH] feat(emqx): add `emqx_topic:match_any/2` utility --- apps/emqx/src/emqx_topic.erl | 7 +++++++ apps/emqx_plugin_libs/src/emqx_plugin_libs_rule.erl | 12 ------------ apps/emqx_rule_engine/src/emqx_rule_engine.erl | 2 +- apps/emqx_rule_engine/src/emqx_rule_sqltester.erl | 3 +-- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/emqx/src/emqx_topic.erl b/apps/emqx/src/emqx_topic.erl index 62dca99c7..c1515e14b 100644 --- a/apps/emqx/src/emqx_topic.erl +++ b/apps/emqx/src/emqx_topic.erl @@ -21,6 +21,7 @@ %% APIs -export([ match/2, + match_any/2, validate/1, validate/2, levels/1, @@ -86,6 +87,12 @@ match([_H1 | _], []) -> match([], [_H | _T2]) -> false. +-spec match_any(Name, [Filter]) -> boolean() when + Name :: topic() | words(), + Filter :: topic() | words(). +match_any(Topic, Filters) -> + lists:any(fun(Filter) -> match(Topic, Filter) end, Filters). + %% @doc Validate topic name or filter -spec validate(topic() | {name | filter, topic()}) -> true. validate(Topic) when is_binary(Topic) -> diff --git a/apps/emqx_plugin_libs/src/emqx_plugin_libs_rule.erl b/apps/emqx_plugin_libs/src/emqx_plugin_libs_rule.erl index b3e3507f0..fd792310b 100644 --- a/apps/emqx_plugin_libs/src/emqx_plugin_libs_rule.erl +++ b/apps/emqx_plugin_libs/src/emqx_plugin_libs_rule.erl @@ -49,10 +49,6 @@ tcp_connectivity/3 ]). --export([ - can_topic_match_oneof/2 -]). - -compile({no_auto_import, [float/1]}). -type uri_string() :: iodata(). @@ -288,11 +284,3 @@ number_to_list(Int) when is_integer(Int) -> integer_to_list(Int); number_to_list(Float) when is_float(Float) -> float_to_list(Float, [{decimals, 10}, compact]). - -can_topic_match_oneof(Topic, Filters) -> - lists:any( - fun(Fltr) -> - emqx_topic:match(Topic, Fltr) - end, - Filters - ). diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.erl b/apps/emqx_rule_engine/src/emqx_rule_engine.erl index 24ad2c5f0..ff6636b9a 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.erl @@ -206,7 +206,7 @@ get_rules_for_topic(Topic) -> [ Rule || Rule = #{from := From} <- get_rules(), - emqx_plugin_libs_rule:can_topic_match_oneof(Topic, From) + emqx_topic:match_any(Topic, From) ]. -spec get_rules_with_same_event(Topic :: binary()) -> [rule()]. diff --git a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl index 455efe389..f3b4e2790 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl @@ -14,7 +14,6 @@ -module(emqx_rule_sqltester). --include("rule_engine.hrl"). -include_lib("emqx/include/logger.hrl"). -export([ @@ -31,7 +30,7 @@ test(#{sql := Sql, context := Context}) -> case lists:all(fun is_publish_topic/1, EventTopics) of true -> %% test if the topic matches the topic filters in the rule - case emqx_plugin_libs_rule:can_topic_match_oneof(InTopic, EventTopics) of + case emqx_topic:match_any(InTopic, EventTopics) of true -> test_rule(Sql, Select, Context, EventTopics); false -> {error, nomatch} end;