소스 검색

Merge pull request #10858 from kjellwinblad/kjell/rule_engine_funcs/add_timezone_to_second/EMQX-10058

feat: add timezone_to_second/1 function to rule engine
Kjell Winblad 2 년 전
부모
커밋
5cfe04956d
3개의 변경된 파일29개의 추가작업 그리고 1개의 파일을 삭제
  1. 9 1
      apps/emqx_rule_engine/src/emqx_rule_funcs.erl
  2. 19 0
      apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl
  3. 1 0
      changes/ce/feat-10858.en.md

+ 9 - 1
apps/emqx_rule_engine/src/emqx_rule_funcs.erl

@@ -228,7 +228,9 @@
     format_date/3,
     format_date/4,
     date_to_unix_ts/3,
-    date_to_unix_ts/4
+    date_to_unix_ts/4,
+    timezone_to_second/1,
+    timezone_to_offset_seconds/1
 ]).
 
 %% MongoDB specific date functions. These functions return a date tuple. The
@@ -1104,6 +1106,12 @@ date_to_unix_ts(TimeUnit, Offset, FormatString, InputString) ->
     OffsetDelta = erlang:convert_time_unit(OffsetSecond, second, Unit),
     date_to_unix_ts(Unit, FormatString, InputString) - OffsetDelta.
 
+timezone_to_second(TimeZone) ->
+    timezone_to_offset_seconds(TimeZone).
+
+timezone_to_offset_seconds(TimeZone) ->
+    emqx_calendar:offset_second(TimeZone).
+
 %% @doc This is for sql funcs that should be handled in the specific modules.
 %% Here the emqx_rule_funcs module acts as a proxy, forwarding
 %% the function handling to the worker module.

+ 19 - 0
apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl

@@ -1012,6 +1012,25 @@ prop_format_date_fun() ->
     Args3DTUS = [<<"second">>, <<"+04:00">>, <<"--%m--%d--%Y---%H:%M:%S">>, Formatters3],
     Second == apply_func(date_to_unix_ts, Args3DTUS).
 
+t_timezone_to_offset_seconds(_) ->
+    timezone_to_offset_seconds_helper(timezone_to_offset_seconds),
+    %% The timezone_to_second function is kept for compatibility with 4.X.
+    timezone_to_offset_seconds_helper(timezone_to_second).
+
+timezone_to_offset_seconds_helper(FunctionName) ->
+    ?assertEqual(120 * 60, apply_func(FunctionName, [<<"+02:00:00">>])),
+    ?assertEqual(-120 * 60, apply_func(FunctionName, [<<"-02:00:00">>])),
+    ?assertEqual(102, apply_func(FunctionName, [<<"+00:01:42">>])),
+    ?assertEqual(0, apply_func(FunctionName, [<<"z">>])),
+    ?assertEqual(0, apply_func(FunctionName, [<<"Z">>])),
+    ?assertEqual(42, apply_func(FunctionName, [42])),
+    ?assertEqual(0, apply_func(FunctionName, [undefined])),
+    %% Check that the following does not crash
+    apply_func(FunctionName, [<<"local">>]),
+    apply_func(FunctionName, ["local"]),
+    apply_func(FunctionName, [local]),
+    ok.
+
 %%------------------------------------------------------------------------------
 %% Utility functions
 %%------------------------------------------------------------------------------

+ 1 - 0
changes/ce/feat-10858.en.md

@@ -0,0 +1 @@
+A new utility function timezone_to_offset_seconds/1 has been added to the rule engine SQL language. This function converts a timezone string (for example, "+02:00", "Z" and "local") to the corresponding offset in seconds.