From 7b38c66538ebf7aa5867de34324243ab0c361a3e Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Thu, 19 May 2022 13:47:56 +0800 Subject: [PATCH] feat: add rule engine function float2str/2 --- CHANGES-4.3.md | 1 + apps/emqx_rule_engine/src/emqx_rule_engine.appup.src | 12 ++++++++---- apps/emqx_rule_engine/src/emqx_rule_funcs.erl | 4 ++++ apps/emqx_rule_engine/src/emqx_rule_utils.erl | 4 ++++ apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl | 7 +++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 18ac43deb..acc6c550e 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -28,6 +28,7 @@ File format: * SSL closed error bug fixed for redis client. * Fix mqtt-sn client disconnected due to re-send a duplicated qos2 message * rule-engine function hexstr2bin/1 support half byte +* add rule-engine function float2str/2, user can specify the float output precision. * Improved resilience against autocluster partitioning during cluster startup. [#7876] diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src index 24a4a5358..4c2f653d9 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.appup.src @@ -2,7 +2,8 @@ %% Unless you know what you are doing, DO NOT edit manually!! {VSN, [{"4.3.9", - [{load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}, {add_module,emqx_rule_date}, {load_module,emqx_rule_maps,brutal_purge,soft_purge,[]}, @@ -10,7 +11,8 @@ {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]}, {"4.3.8", - [{add_module,emqx_rule_date}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {add_module,emqx_rule_date}, {load_module,emqx_rule_maps,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_cli,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]}, @@ -134,7 +136,8 @@ {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], [{"4.3.9", - [{load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_events,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_maps,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]}, @@ -142,7 +145,8 @@ {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}, {delete_module,emqx_rule_date}]}, {"4.3.8", - [{load_module,emqx_rule_maps,brutal_purge,soft_purge,[]}, + [{load_module,emqx_rule_utils,brutal_purge,soft_purge,[]}, + {load_module,emqx_rule_maps,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_engine_cli,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_sqltester,brutal_purge,soft_purge,[]}, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}, diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index 5800c19d0..282c8929d 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -93,6 +93,7 @@ , bool/1 , int/1 , float/1 + , float2str/2 , map/1 , bin2hexstr/1 , hexstr2bin/1 @@ -537,6 +538,9 @@ int(Data) -> float(Data) -> emqx_rule_utils:float(Data). +float2str(Float, Precision) -> + emqx_rule_utils:float2str(Float, Precision). + map(Data) -> emqx_rule_utils:map(Data). diff --git a/apps/emqx_rule_engine/src/emqx_rule_utils.erl b/apps/emqx_rule_engine/src/emqx_rule_utils.erl index dc08ad0c3..d287f1ad0 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_utils.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_utils.erl @@ -32,6 +32,7 @@ %% type converting -export([ str/1 + , float2str/2 , bin/1 , bool/1 , int/1 @@ -265,6 +266,9 @@ str(List) when is_list(List) -> end; str(Data) -> error({invalid_str, Data}). +float2str(Float, Precision) when is_float(Float) and is_integer(Precision)-> + float_to_binary(Float, [{decimals, Precision}, compact]). + utf8_bin(Str) when is_binary(Str); is_list(Str) -> unicode:characters_to_binary(Str); utf8_bin(Str) -> diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 116c99f29..98f6ad0b7 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -125,6 +125,13 @@ t_float(_) -> ?assertError({invalid_number, {a, v}}, emqx_rule_funcs:float({a, v})), ?assertError(_, emqx_rule_funcs:float("a")). + +t_float2str(_) -> + ?assertEqual(<<"20.2">>, emqx_rule_funcs:float2str(20.2, 1)), + ?assertEqual(<<"20.2">>, emqx_rule_funcs:float2str(20.2, 10)), + ?assertEqual(<<"20.199999999999999">>, emqx_rule_funcs:float2str(20.2, 15)), + ?assertEqual(<<"20.1999999999999993">>, emqx_rule_funcs:float2str(20.2, 16)). + t_map(_) -> ?assertEqual(#{ver => <<"1.0">>, name => "emqx"}, emqx_rule_funcs:map([{ver, <<"1.0">>}, {name, "emqx"}])), ?assertEqual(#{<<"a">> => 1}, emqx_rule_funcs:map(<<"{\"a\":1}">>)),