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 f640957eff Fix TextMatchFilterOptimizer `or not` behavior (#13533)
f640957eff is described below

commit f640957effbee767dc5d697c65d7c37d5d9648b5
Author: Christopher Peck <27231838+itschrisp...@users.noreply.github.com>
AuthorDate: Mon Jul 8 18:20:41 2024 -0700

    Fix TextMatchFilterOptimizer `or not` behavior (#13533)
---
 .../core/query/optimizer/filter/TextMatchFilterOptimizer.java    | 9 +++++++++
 .../apache/pinot/core/query/optimizer/QueryOptimizerTest.java    | 5 +++++
 2 files changed, 14 insertions(+)

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 c6b2e29838..065cbc7ebe 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
@@ -138,6 +138,15 @@ public class TextMatchFilterOptimizer implements 
FilterOptimizer {
         for (Expression expression : entry.getValue()) {
           if 
(expression.getFunctionCall().getOperator().equals(FilterKind.NOT.name())) {
             Expression operand = 
expression.getFunctionCall().getOperands().get(0);
+
+            // Lucene special case: if `OR NOT`, skip optimizing as NOT cannot 
be used with just one term
+            if (operator.equals(FilterKind.OR.name())) {
+              Expression textMatchExpression = 
RequestUtils.getFunctionExpression(FilterKind.TEXT_MATCH.name(),
+                  operand.getFunctionCall().getOperands().get(0), 
operand.getFunctionCall().getOperands().get(1));
+              
newChildren.add(RequestUtils.getFunctionExpression(FilterKind.NOT.name(), 
textMatchExpression));
+              continue;
+            }
+
             literals.add(FilterKind.NOT.name() + SPACE + 
operand.getFunctionCall().getOperands().get(1).getLiteral()
                 .getStringValue());
             continue;
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 25a8109237..ed01138f24 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
@@ -293,6 +293,11 @@ public class QueryOptimizerTest {
             + "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)')");
+    testQuery("SELECT * FROM testTable WHERE TEXT_MATCH(string, 'foo') OR NOT 
TEXT_MATCH(string, 'bar')",
+        "SELECT * FROM testTable WHERE NOT TEXT_MATCH(string, 'bar') OR 
TEXT_MATCH(string, 'foo')");
+    testQuery(
+        "select * from testTable where intCol > 1 AND (text_match(string, 
'foo') OR NOT text_match(string, 'bar'))",
+        "select * from testTable where intCol > 1 AND (NOT text_match(string, 
'bar') OR text_match(string, 'foo'))");
     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-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to