From e864b1f3fb30d916ee5f3d7ef43e76e5de316a62 Mon Sep 17 00:00:00 2001
From: Alexander Polyankin <alexander.polyankin@metabase.com>
Date: Fri, 6 May 2022 17:32:32 +0300
Subject: [PATCH] Make it possible to convert relative filters to expressions
 (#22456)

---
 .../src/metabase/lib/expressions/config.js    | 10 ++++++
 .../lib/expressions/helper_text_strings.js    | 32 +++++++++++++++++++
 .../lib/expressions/suggest.unit.spec.js      |  1 +
 3 files changed, 43 insertions(+)

diff --git a/frontend/src/metabase/lib/expressions/config.js b/frontend/src/metabase/lib/expressions/config.js
index 6b06c47f8b2..dd635594152 100644
--- a/frontend/src/metabase/lib/expressions/config.js
+++ b/frontend/src/metabase/lib/expressions/config.js
@@ -226,12 +226,22 @@ export const MBQL_CLAUSES = {
     type: "boolean",
     args: ["expression", "expression", "expression"],
   },
+  interval: {
+    displayName: "timeSpan",
+    type: "number",
+    args: ["number", "string"],
+  },
   "time-interval": {
     displayName: `interval`,
     type: "boolean",
     args: ["expression", "number", "string"],
     hasOptions: true,
   },
+  "relative-datetime": {
+    displayName: "relativeDateTime",
+    type: "expression",
+    args: ["number", "string"],
+  },
   "is-null": {
     displayName: `isnull`,
     type: "boolean",
diff --git a/frontend/src/metabase/lib/expressions/helper_text_strings.js b/frontend/src/metabase/lib/expressions/helper_text_strings.js
index 22fece8a64e..92b1c11cfd4 100644
--- a/frontend/src/metabase/lib/expressions/helper_text_strings.js
+++ b/frontend/src/metabase/lib/expressions/helper_text_strings.js
@@ -440,6 +440,22 @@ const helperTextStrings = [
       { name: t`end`, description: t`The end of the range.` },
     ],
   },
+  {
+    name: "interval",
+    structure: "timeSpan(" + t`number` + ", " + t`text` + ")",
+    description: t`Gets a time interval of specified length`,
+    example: 'timeSpan(7, "day")',
+    args: [
+      {
+        name: t`number`,
+        description: t`Period of interval, where negative values are back in time.`,
+      },
+      {
+        name: t`text`,
+        description: t`Type of interval like "day", "month", "year".`,
+      },
+    ],
+  },
   {
     name: "time-interval",
     structure:
@@ -461,6 +477,22 @@ const helperTextStrings = [
       },
     ],
   },
+  {
+    name: "relative-datetime",
+    structure: "relativeDateTime(" + t`number` + ", " + t`text` + ")",
+    description: t`Gets a timestamp relative to the current time`,
+    example: 'relativeDateTime(-30, "day")',
+    args: [
+      {
+        name: t`number`,
+        description: t`Period of interval, where negative values are back in time.`,
+      },
+      {
+        name: t`text`,
+        description: t`Type of interval like "day", "month", "year".`,
+      },
+    ],
+  },
   {
     name: "is-null",
     structure: "isnull(" + t`column` + ")",
diff --git a/frontend/test/metabase/lib/expressions/suggest.unit.spec.js b/frontend/test/metabase/lib/expressions/suggest.unit.spec.js
index 9c651efa9f3..2eed1aa01f4 100644
--- a/frontend/test/metabase/lib/expressions/suggest.unit.spec.js
+++ b/frontend/test/metabase/lib/expressions/suggest.unit.spec.js
@@ -147,6 +147,7 @@ describe("metabase/lib/expression/suggest", () => {
           [
             { text: "True", type: "literal" },
             { text: "[Total] ", type: "fields" },
+            { text: "timeSpan(", type: "functions" },
             { text: "trim(", type: "functions" },
           ].sort(suggestionSort),
         );
-- 
GitLab