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