From 8ffacc38774daa342158b2d0e60ac486c48eb66b Mon Sep 17 00:00:00 2001 From: Luka Peschke Date: Tue, 4 Oct 2022 14:25:42 +0200 Subject: [PATCH] fix(server/pypika/filter): Fix "notmatches" operator for backends using REGEXP (#1507) relates to TCTC-3808 Signed-off-by: Luka Peschke --- .../pypika_translator/translators/base.py | 2 +- .../fixtures/filter/notmatches_pypika.yaml | 30 +++++++++++++++++++ .../test_filter_translators.py | 6 ++-- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 server/tests/backends/fixtures/filter/notmatches_pypika.yaml diff --git a/server/src/weaverbird/backends/pypika_translator/translators/base.py b/server/src/weaverbird/backends/pypika_translator/translators/base.py index cebdf06f89..c8dfb3d3c5 100644 --- a/server/src/weaverbird/backends/pypika_translator/translators/base.py +++ b/server/src/weaverbird/backends/pypika_translator/translators/base.py @@ -954,7 +954,7 @@ def _get_single_condition_criterion( elif condition.operator == "notmatches": match self.REGEXP_OP: case RegexOp.REGEXP: - return column_field.regexp(condition.value).negate() + return column_field.regexp(compliant_regex).negate() case RegexOp.SIMILAR_TO: return BasicCriterion( RegexpMatching.not_similar_to, diff --git a/server/tests/backends/fixtures/filter/notmatches_pypika.yaml b/server/tests/backends/fixtures/filter/notmatches_pypika.yaml new file mode 100644 index 0000000000..be1dd60f6c --- /dev/null +++ b/server/tests/backends/fixtures/filter/notmatches_pypika.yaml @@ -0,0 +1,30 @@ +exclude: +- mongo +- pandas +- snowflake +step: + pipeline: + - condition: + column: name + operator: notmatches + value: beer + name: filter + - columns: + - name + name: select +expected: + data: + - name: Ninkasi Ploploplop + - name: Brewdog Nanny State Alcoholvrij + - name: Ardwen Blonde + - name: "Cuv\xE9e des Trolls" + - name: Weihenstephan Hefe Weizen Alcoholarm + - name: Bellfield Lawless Village IPA + - name: Pauwel Kwak + - name: Brasserie De Sutter Brin de Folie + - name: Brugse Zot blonde + schema: + fields: + - name: name + type: string + pandas_version: 1.4.0 diff --git a/server/tests/backends/sql_translator_unit_tests/test_filter_translators.py b/server/tests/backends/sql_translator_unit_tests/test_filter_translators.py index 6e505b2fb7..c1ee94192e 100644 --- a/server/tests/backends/sql_translator_unit_tests/test_filter_translators.py +++ b/server/tests/backends/sql_translator_unit_tests/test_filter_translators.py @@ -177,7 +177,7 @@ def test_notmatches_regexp_filter( ctx = regexp_translator.filter(step=step, columns=selected_columns, **default_step_kwargs) expected_query = ( Query.from_(previous_step) - .where(Field(column).regexp(regex).negate()) + .where(Field(column).regexp(f"%{regex}%").negate()) .select(*selected_columns) ) @@ -358,7 +358,7 @@ def test_notmatches_regexp__like_filter( ctx = regexp_translator.filter(step=step, columns=selected_columns, **default_step_kwargs) expected_query = ( Query.from_(previous_step) - .where(Field(column).regexp(regex).negate()) + .where(Field(column).regexp(f"%{regex}%").negate()) .select(*selected_columns) ) @@ -417,7 +417,7 @@ def test_notmatches_regexp__contains_filter( ctx = regexp_translator.filter(step=step, columns=selected_columns, **default_step_kwargs) expected_query = ( Query.from_(previous_step) - .where(Field(column).regexp(regex).negate()) + .where(Field(column).regexp(f"%{regex}%").negate()) .select(*selected_columns) )