From da8fc88e8c150b6abf17350d1a7f9b1f0eac8f9a Mon Sep 17 00:00:00 2001 From: Valentin Herrmann Date: Wed, 5 Feb 2025 11:15:10 +0100 Subject: [PATCH 1/3] Fix condition conversion to NOT LIKE Fixes #21 Update `sql_testing_tools/TokenProcessing.py` to convert `!=` and `<>` to `NOT LIKE`. * Modify `_condition` function to include logic for converting `!=` and `<>` to `NOT LIKE`. * Add test cases in `sql_testing_tools/tests/NormalizeQuery_test.py` for `!=` and `<>` to `NOT LIKE` conversion. * Add SQL files `a23.sql` and `a24.sql` in `sql_testing_tools/tests/v1/` and `sql_testing_tools/tests/v2/` for testing the new conversion logic. --- For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/ValentinHerrmann/sql_testing_tools/issues/21?shareId=XXXX-XXXX-XXXX-XXXX). --- sql_testing_tools/TokenProcessing.py | 3 +++ sql_testing_tools/tests/NormalizeQuery_test.py | 8 ++++++++ sql_testing_tools/tests/v1/a23.sql | 3 +++ sql_testing_tools/tests/v1/a24.sql | 3 +++ sql_testing_tools/tests/v2/a23.sql | 3 +++ sql_testing_tools/tests/v2/a24.sql | 3 +++ 6 files changed, 23 insertions(+) create mode 100644 sql_testing_tools/tests/v1/a23.sql create mode 100644 sql_testing_tools/tests/v1/a24.sql create mode 100644 sql_testing_tools/tests/v2/a23.sql create mode 100644 sql_testing_tools/tests/v2/a24.sql diff --git a/sql_testing_tools/TokenProcessing.py b/sql_testing_tools/TokenProcessing.py index b77c61a..41b0437 100644 --- a/sql_testing_tools/TokenProcessing.py +++ b/sql_testing_tools/TokenProcessing.py @@ -143,6 +143,9 @@ def _condition(token, alias_map, baseDict: dict): left = _identifier(left, alias_map, baseDict) right = _identifier(right, alias_map, baseDict) + if operator.value in ("!=", "<>"): + return f"NOT {left} LIKE {right}" + if flipAllowed and left.lower() >= right.lower(): left, right = right, left if operator.value == ">": diff --git a/sql_testing_tools/tests/NormalizeQuery_test.py b/sql_testing_tools/tests/NormalizeQuery_test.py index 625ce1a..b695d9b 100644 --- a/sql_testing_tools/tests/NormalizeQuery_test.py +++ b/sql_testing_tools/tests/NormalizeQuery_test.py @@ -175,3 +175,11 @@ def test_a22_GroupIsolated(self): if res == "": self.fail("Different grouping not recognized") + + def test_a23_not_equal(self): + nr = '23' + self.helperEqual(nr) + + def test_a24_not_equal(self): + nr = '24' + self.helperEqual(nr) diff --git a/sql_testing_tools/tests/v1/a23.sql b/sql_testing_tools/tests/v1/a23.sql new file mode 100644 index 0000000..6a1ae69 --- /dev/null +++ b/sql_testing_tools/tests/v1/a23.sql @@ -0,0 +1,3 @@ +SELECT name, einwohner_m, einwohner_w +FROM Gemeinde +WHERE name != 'München' diff --git a/sql_testing_tools/tests/v1/a24.sql b/sql_testing_tools/tests/v1/a24.sql new file mode 100644 index 0000000..b22b73a --- /dev/null +++ b/sql_testing_tools/tests/v1/a24.sql @@ -0,0 +1,3 @@ +SELECT name, einwohner_m, einwohner_w +FROM Gemeinde +WHERE name <> 'München' diff --git a/sql_testing_tools/tests/v2/a23.sql b/sql_testing_tools/tests/v2/a23.sql new file mode 100644 index 0000000..70f9b5a --- /dev/null +++ b/sql_testing_tools/tests/v2/a23.sql @@ -0,0 +1,3 @@ +SELECT name, einwohner_m, einwohner_w +FROM Gemeinde +WHERE NOT name LIKE 'München' diff --git a/sql_testing_tools/tests/v2/a24.sql b/sql_testing_tools/tests/v2/a24.sql new file mode 100644 index 0000000..9545111 --- /dev/null +++ b/sql_testing_tools/tests/v2/a24.sql @@ -0,0 +1,3 @@ +SELECT name, einwohner_m, einwohner_w +FROM Gemeinde +WHERE name NOT LIKE 'München' From bc2c618a27f92e8ca9e04f7e73ffdaae6991fad2 Mon Sep 17 00:00:00 2001 From: Valentin Herrmann Date: Wed, 5 Feb 2025 11:26:48 +0100 Subject: [PATCH 2/3] Fixed NOT LIKE --- sql_testing_tools/TokenProcessing.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql_testing_tools/TokenProcessing.py b/sql_testing_tools/TokenProcessing.py index 41b0437..3703291 100644 --- a/sql_testing_tools/TokenProcessing.py +++ b/sql_testing_tools/TokenProcessing.py @@ -145,6 +145,8 @@ def _condition(token, alias_map, baseDict: dict): if operator.value in ("!=", "<>"): return f"NOT {left} LIKE {right}" + if operator.value in ("NOT LIKE"): + return f"NOT {left} LIKE {right}" if flipAllowed and left.lower() >= right.lower(): left, right = right, left From 6ce879eb2354a1c4c207a022cb14b5b92705cad0 Mon Sep 17 00:00:00 2001 From: Valentin Herrmann Date: Wed, 5 Feb 2025 11:28:27 +0100 Subject: [PATCH 3/3] V 0.2.7 --- README.md | 4 ++++ setup.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35276f4..6a0d754 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,10 @@ res = checkEquality() ### Changelog + +##### V 0.2.7 +- Normalize String unequality: ...<>..., ...!=..., ...NOT LIKE... --> NOT...LIKE... + ##### V 0.2.6 - Fixed bug in checkKeywords: if keyword was present in one query and not in the other, the comparison was not performed correctly. diff --git a/setup.py b/setup.py index fc8a8f2..71c1edd 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setup( name='sql_testing_tools', - version='0.2.6', + version='0.2.7', packages=find_packages(), install_requires=[ 'sqlparse>=0.5.1',