From 339643489146d4357494bc2e0df6021bd8a6f9dd Mon Sep 17 00:00:00 2001
From: Alexander Polyankin <alexander.polyankin@metabase.com>
Date: Mon, 16 Jan 2023 17:46:49 +0200
Subject: [PATCH] Fix navigating from dashboard to card with string filters
 (#27687)

---
 .../src/metabase-lib/parameters/utils/mbql.js | 10 +++++--
 .../parameters/utils/mbql.unit.spec.js        | 27 ++++++++++++++++---
 .../metabase-lib/lib/Question.unit.spec.js    |  1 +
 ...ontains-filter-case-sensitivity.cy.spec.js |  2 +-
 4 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/frontend/src/metabase-lib/parameters/utils/mbql.js b/frontend/src/metabase-lib/parameters/utils/mbql.js
index 4b2a80ff721..005b0a3a63b 100644
--- a/frontend/src/metabase-lib/parameters/utils/mbql.js
+++ b/frontend/src/metabase-lib/parameters/utils/mbql.js
@@ -13,7 +13,10 @@ import {
   isDateParameter,
 } from "metabase-lib/parameters/utils/parameter-type";
 import { isTemplateTagReference } from "metabase-lib/references";
-import { getParameterOperatorName } from "metabase-lib/parameters/utils/operators";
+import {
+  deriveFieldOperatorFromParameter,
+  getParameterOperatorName,
+} from "metabase-lib/parameters/utils/operators";
 import { hasParameterValue } from "metabase-lib/parameters/utils/parameter-values";
 
 const withTemporalUnit = (fieldRef, unit) => {
@@ -145,10 +148,13 @@ export function dateParameterValueToMBQL(parameterValue, fieldRef) {
 
 export function stringParameterValueToMBQL(parameter, fieldRef) {
   const parameterValue = parameter.value;
+  const operator = deriveFieldOperatorFromParameter(parameter);
   const subtype = getParameterSubType(parameter);
   const operatorName = getParameterOperatorName(subtype);
 
-  return [operatorName, fieldRef].concat(parameterValue);
+  return [operatorName, fieldRef]
+    .concat(parameterValue)
+    .concat(operator?.optionsDefaults ?? []);
 }
 
 export function numberParameterValueToMBQL(parameter, fieldRef) {
diff --git a/frontend/src/metabase-lib/parameters/utils/mbql.unit.spec.js b/frontend/src/metabase-lib/parameters/utils/mbql.unit.spec.js
index e70370148de..aa0143ee41d 100644
--- a/frontend/src/metabase-lib/parameters/utils/mbql.unit.spec.js
+++ b/frontend/src/metabase-lib/parameters/utils/mbql.unit.spec.js
@@ -183,7 +183,14 @@ describe("parameters/utils/mbql", () => {
             { type: "string/starts-with", value: "1" },
             null,
           ),
-        ).toEqual(["starts-with", null, "1"]);
+        ).toEqual([
+          "starts-with",
+          null,
+          "1",
+          {
+            "case-sensitive": false,
+          },
+        ]);
       });
     });
 
@@ -278,12 +285,19 @@ describe("parameters/utils/mbql", () => {
         fieldFilterParameterToMBQLFilter(
           {
             target: ["dimension", ["field", PRODUCTS.CATEGORY.id, null]],
-            type: "string/starts-with",
+            type: "string/contains",
             value: "foo",
           },
           metadata,
         ),
-      ).toEqual(["starts-with", ["field", PRODUCTS.CATEGORY.id, null], "foo"]);
+      ).toEqual([
+        "contains",
+        ["field", PRODUCTS.CATEGORY.id, null],
+        "foo",
+        {
+          "case-sensitive": false,
+        },
+      ]);
 
       expect(
         fieldFilterParameterToMBQLFilter(
@@ -294,7 +308,12 @@ describe("parameters/utils/mbql", () => {
           },
           metadata,
         ),
-      ).toEqual(["starts-with", ["field", PRODUCTS.CATEGORY.id, null], "foo"]);
+      ).toEqual([
+        "starts-with",
+        ["field", PRODUCTS.CATEGORY.id, null],
+        "foo",
+        { "case-sensitive": false },
+      ]);
     });
 
     it("should return mbql filter for category parameter", () => {
diff --git a/frontend/test/metabase-lib/lib/Question.unit.spec.js b/frontend/test/metabase-lib/lib/Question.unit.spec.js
index 8d94fbc54ad..79f404547ed 100644
--- a/frontend/test/metabase-lib/lib/Question.unit.spec.js
+++ b/frontend/test/metabase-lib/lib/Question.unit.spec.js
@@ -1227,6 +1227,7 @@ describe("Question", () => {
         "starts-with",
         ["field", PRODUCTS.CATEGORY.id, null],
         "abc",
+        { "case-sensitive": false },
       ]);
     });
   });
diff --git a/frontend/test/metabase/scenarios/dashboard-filters/reproductions/25908-contains-filter-case-sensitivity.cy.spec.js b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/25908-contains-filter-case-sensitivity.cy.spec.js
index 30e237e72e6..cba8b9c0a34 100644
--- a/frontend/test/metabase/scenarios/dashboard-filters/reproductions/25908-contains-filter-case-sensitivity.cy.spec.js
+++ b/frontend/test/metabase/scenarios/dashboard-filters/reproductions/25908-contains-filter-case-sensitivity.cy.spec.js
@@ -24,7 +24,7 @@ const dashboardDetails = {
 
 const CASE_INSENSITIVE_ROWS = 30;
 
-describe.skip("issue 25908", () => {
+describe("issue 25908", () => {
   beforeEach(() => {
     cy.intercept("POST", "/api/dataset").as("dataset");
 
-- 
GitLab