You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ja...@apache.org on 2024/04/25 23:14:32 UTC

(pinot) branch master updated: fix TextMatchFilterOperator boolean grouping (#13009)

This is an automated email from the ASF dual-hosted git repository.

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 97a2e6d95e fix TextMatchFilterOperator boolean grouping (#13009)
97a2e6d95e is described below

commit 97a2e6d95eb87c67405cd661371a51acc478adec
Author: Christopher Peck <27...@users.noreply.github.com>
AuthorDate: Thu Apr 25 16:14:26 2024 -0700

    fix TextMatchFilterOperator boolean grouping (#13009)
---
 .../optimizer/filter/TextMatchFilterOptimizer.java |  2 +-
 .../core/query/optimizer/QueryOptimizerTest.java   | 29 ++++++++++++----------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/TextMatchFilterOptimizer.java b/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/TextMatchFilterOptimizer.java
index aca4e2d5cc..8c742cfc98 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/TextMatchFilterOptimizer.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/query/optimizer/filter/TextMatchFilterOptimizer.java
@@ -162,7 +162,7 @@ public class TextMatchFilterOptimizer implements FilterOptimizer {
         mergedTextMatchFilter = String.join(SPACE + operator + SPACE, literals);
       }
       Expression mergedTextMatchExpression = RequestUtils.getFunctionExpression(FilterKind.TEXT_MATCH.name());
-      Expression mergedTextMatchFilterExpression = RequestUtils.getLiteralExpression(mergedTextMatchFilter);
+      Expression mergedTextMatchFilterExpression = RequestUtils.getLiteralExpression("(" + mergedTextMatchFilter + ")");
       mergedTextMatchExpression.getFunctionCall()
           .setOperands(Arrays.asList(entry.getKey(), mergedTextMatchFilterExpression));
 
diff --git a/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/QueryOptimizerTest.java b/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/QueryOptimizerTest.java
index 337075f974..848f458742 100644
--- a/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/QueryOptimizerTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/core/query/optimizer/QueryOptimizerTest.java
@@ -178,7 +178,7 @@ public class QueryOptimizerTest {
     List<Expression> operands = filterFunction.getOperands();
     assertEquals(operands.size(), 2);
     assertEquals(operands.get(0), RequestUtils.getIdentifierExpression("string"));
-    assertEquals(operands.get(1), RequestUtils.getLiteralExpression("foo AND bar OR baz"));
+    assertEquals(operands.get(1), RequestUtils.getLiteralExpression("((foo AND bar) OR baz)"));
   }
 
   private static Expression getRangeFilterExpression(String column, String rangeString) {
@@ -268,32 +268,35 @@ public class QueryOptimizerTest {
 
     // TextMatchFilterOptimizer
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo') AND TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo AND bar')");
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '(foo AND bar)')");
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, '\"foo bar\"') AND TEXT_MATCH(string, 'baz')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '\"foo bar\" AND baz')");
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '(\"foo bar\" AND baz)')");
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, '\"foo bar\"') AND TEXT_MATCH(string, '/.*ooba.*/')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '\"foo bar\" AND /.*ooba.*/')");
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '(\"foo bar\" AND /.*ooba.*/)')");
     testQuery("SELECT * FROM testTable WHERE int = 1 AND TEXT_MATCH(string, 'foo') AND TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE int = 1 AND TEXT_MATCH(string, 'foo AND bar')");
+        "SELECT * FROM testTable WHERE int = 1 AND TEXT_MATCH(string, '(foo AND bar)')");
     testQuery("SELECT * FROM testTable WHERE int = 1 OR TEXT_MATCH(string, 'foo') AND TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE int = 1 OR TEXT_MATCH(string, 'foo AND bar')");
+        "SELECT * FROM testTable WHERE int = 1 OR TEXT_MATCH(string, '(foo AND bar)')");
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo') AND NOT TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo AND NOT bar')");
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '(foo AND NOT bar)')");
     testQuery("SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, 'foo') AND TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string, 'NOT foo AND bar')");
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string, '(NOT foo AND bar)')");
     testQuery("SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, 'foo') AND NOT TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, 'foo OR bar')");
+        "SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, '(foo OR bar)')");
     testQuery("SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, 'foo') OR NOT TEXT_MATCH(string, 'bar')",
-        "SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, 'foo AND bar')");
+        "SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, '(foo AND bar)')");
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo') AND TEXT_MATCH(string, 'bar') OR "
-        + "TEXT_MATCH(string, 'baz')", "SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo AND bar OR baz')");
+        + "TEXT_MATCH(string, 'baz')", "SELECT * FROM testTable WHERE TEXT_MATCH(string, '((foo AND bar) OR baz)')");
+    testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo') AND (TEXT_MATCH(string, 'bar') OR "
+        + "TEXT_MATCH(string, 'baz'))", "SELECT * FROM testTable WHERE TEXT_MATCH(string, '(foo AND (bar OR baz))')");
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string1, 'foo1') AND TEXT_MATCH(string1, 'bar1') OR "
             + "TEXT_MATCH(string1, 'baz1') AND TEXT_MATCH(string2, 'foo')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string1, 'foo1 AND bar1') OR TEXT_MATCH(string1, 'baz1') AND "
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string1, '(foo1 AND bar1)') OR TEXT_MATCH(string1, 'baz1') AND "
             + "TEXT_MATCH(string2, 'foo')");
     testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string1, 'foo1') AND TEXT_MATCH(string1, 'bar1')"
             + "AND TEXT_MATCH(string2, 'foo2') AND TEXT_MATCH(string2, 'bar2')",
-        "SELECT * FROM testTable WHERE TEXT_MATCH(string1, 'foo1 AND bar1') AND TEXT_MATCH(string2, 'foo2 AND bar2')");
+        "SELECT * FROM testTable WHERE TEXT_MATCH(string1, '(foo1 AND bar1)') AND TEXT_MATCH(string2, '(foo2 AND "
+            + "bar2)')");
     testCannotOptimizeQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string1, 'foo') OR TEXT_MATCH(string2, 'bar')");
     testCannotOptimizeQuery(
         "SELECT * FROM testTable WHERE int = 1 AND TEXT_MATCH(string, 'foo') OR TEXT_MATCH(string, 'bar')");


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org