From bd4f2073650e382e4caa150516e33eb87a08ea6f Mon Sep 17 00:00:00 2001 From: firest Date: Fri, 30 Jun 2023 18:24:28 +0800 Subject: [PATCH] fix(ruleengine): fix duplicate `payload` problems --- .../src/emqx_rule_runtime.erl | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl index 4a1477a1c..f83aa2920 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl @@ -36,7 +36,7 @@ ] ). --compile({no_auto_import, [alias/1]}). +-compile({no_auto_import, [alias/2]}). -type columns() :: map(). -type alias() :: atom(). @@ -204,7 +204,7 @@ select_and_transform([{as, Field, Alias} | More], Columns, Action) -> ); select_and_transform([Field | More], Columns, Action) -> Val = eval(Field, Columns), - Key = alias(Field), + Key = alias(Field, Columns), select_and_transform( More, nested_put(Key, Val, Columns), @@ -228,11 +228,11 @@ select_and_collect([{as, Field, Alias} | More], Columns, {Action, LastKV}) -> ); select_and_collect([Field], Columns, {Action, _}) -> Val = eval(Field, Columns), - Key = alias(Field), + Key = alias(Field, Columns), {nested_put(Key, Val, Action), {'item', ensure_list(Val)}}; select_and_collect([Field | More], Columns, {Action, LastKV}) -> Val = eval(Field, Columns), - Key = alias(Field), + Key = alias(Field, Columns), select_and_collect( More, nested_put(Key, Val, Columns), @@ -401,38 +401,36 @@ eval({'case', CaseOn, CaseClauses, ElseClauses}, Columns) -> eval({'fun', {_, Name}, Args}, Columns) -> apply_func(Name, [eval(Arg, Columns) || Arg <- Args], Columns). -handle_alias({path, [{key, <<"payload">>} | _]}, #{payload := Payload} = Columns) -> - Columns#{payload => may_decode_payload(Payload)}; -handle_alias({path, [{key, <<"payload">>} | _]}, #{<<"payload">> := Payload} = Columns) -> - Columns#{<<"payload">> => may_decode_payload(Payload)}; -handle_alias(_, Columns) -> - Columns. - -alias({var, Var}) -> +alias({var, Var}, _Columns) -> {var, Var}; -alias({const, Val}) when is_binary(Val) -> +alias({const, Val}, _Columns) when is_binary(Val) -> {var, Val}; -alias({list, L}) -> +alias({list, L}, _Columns) -> {var, ?ephemeral_alias(list, length(L))}; -alias({range, R}) -> +alias({range, R}, _Columns) -> {var, ?ephemeral_alias(range, R)}; -alias({get_range, _, {var, Key}}) -> +alias({get_range, _, {var, Key}}, _Columns) -> {var, Key}; -alias({get_range, _, {path, Path}}) -> - {path, Path}; -alias({path, Path}) -> - {path, Path}; -alias({const, Val}) -> +alias({get_range, _, {path, _Path} = Path}, Columns) -> + handle_path_alias(Path, Columns); +alias({path, _Path} = Path, Columns) -> + handle_path_alias(Path, Columns); +alias({const, Val}, _Columns) -> {var, ?ephemeral_alias(const, Val)}; -alias({Op, _L, _R}) when ?is_arith(Op); ?is_comp(Op) -> +alias({Op, _L, _R}, _Columns) when ?is_arith(Op); ?is_comp(Op) -> {var, ?ephemeral_alias(op, Op)}; -alias({'case', On, _, _}) -> +alias({'case', On, _, _}, _Columns) -> {var, ?ephemeral_alias('case', On)}; -alias({'fun', Name, _}) -> +alias({'fun', Name, _}, _Columns) -> {var, ?ephemeral_alias('fun', Name)}; -alias(_) -> +alias(_, _Columns) -> ?ephemeral_alias(unknown, unknown). +handle_path_alias({path, [{key, <<"payload">>} | Rest]}, #{payload := _Payload} = _Columns) -> + {path, [{key, payload} | Rest]}; +handle_path_alias(Path, _Columns) -> + Path. + eval_case_clauses([], ElseClauses, Columns) -> case ElseClauses of {} -> undefined; @@ -515,8 +513,7 @@ safe_decode_and_cache(MaybeJson) -> ensure_list(List) when is_list(List) -> List; ensure_list(_NotList) -> []. -nested_put(Alias, Val, Columns0) -> - Columns = handle_alias(Alias, Columns0), +nested_put(Alias, Val, Columns) -> emqx_rule_maps:nested_put(Alias, Val, Columns). inc_action_metrics(RuleId, Result) ->