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/incubator-pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new da7cbcf  Fix the wrong unbounded values in 
RangePredicateEvaluatorFactory (#5586)
da7cbcf is described below

commit da7cbcfd84b12331c18ef90a8b73995cfdebe338
Author: Xiaotian (Jackie) Jiang <[email protected]>
AuthorDate: Wed Jun 17 22:37:12 2020 -0700

    Fix the wrong unbounded values in RangePredicateEvaluatorFactory (#5586)
    
    The unbounded values for LONG, FLOAT, DOUBLE type are not set based on the 
type, but always as Integer.MIN_VALUE and Integer.MAX_VALUE
    This can cause wrong result if the passed in value is smaller than 
Integer.MIN_VALUE or larger than Integer.MAX_VALUE
    
    Minor improvements:
    - Replace "*" with constant `RangePredicate.UNBOUNDED` for readability
    - For string type, use null to represent unbounded to save the per-value 
string comparison
---
 .../predicate/PredicateEvaluatorProvider.java      |  4 +-
 .../predicate/RangePredicateEvaluatorFactory.java  | 66 +++++++++++-----------
 .../NoDictionaryRangePredicateEvaluatorTest.java   | 17 +++---
 3 files changed, 46 insertions(+), 41 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/PredicateEvaluatorProvider.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/PredicateEvaluatorProvider.java
index 119687d..00f3d09 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/PredicateEvaluatorProvider.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/PredicateEvaluatorProvider.java
@@ -77,8 +77,8 @@ public class PredicateEvaluatorProvider {
             throw new UnsupportedOperationException("Unsupported predicate 
type: " + predicate.getType());
         }
       }
-    } catch (NumberFormatException e) {
-      // This NumberFormatException is caused by passing in a non-numeric 
string as numeric number in query
+    } catch (Exception e) {
+      // Exception here is caused by mismatch between the column data type and 
the predicate value in the query
       throw new BadQueryRequestException(e);
     }
   }
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/RangePredicateEvaluatorFactory.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/RangePredicateEvaluatorFactory.java
index fee24ae..751e977 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/RangePredicateEvaluatorFactory.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/predicate/RangePredicateEvaluatorFactory.java
@@ -94,7 +94,7 @@ public class RangePredicateEvaluatorFactory {
       boolean includeLowerBoundary = rangePredicate.includeLowerBoundary();
       boolean includeUpperBoundary = rangePredicate.includeUpperBoundary();
 
-      if (lowerBoundary.equals("*")) {
+      if (lowerBoundary.equals(RangePredicate.UNBOUNDED)) {
         _startDictId = 0;
       } else {
         int insertionIndex = dictionary.insertionIndexOf(lowerBoundary);
@@ -108,7 +108,7 @@ public class RangePredicateEvaluatorFactory {
           }
         }
       }
-      if (upperBoundary.equals("*")) {
+      if (upperBoundary.equals(RangePredicate.UNBOUNDED)) {
         _endDictId = dictionary.length();
       } else {
         int insertionIndex = dictionary.insertionIndexOf(upperBoundary);
@@ -269,12 +269,14 @@ public class RangePredicateEvaluatorFactory {
     final boolean _includeUpperBoundary;
 
     IntRawValueBasedRangePredicateEvaluator(RangePredicate rangePredicate) {
-      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
-      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
       String lowerBoundary = rangePredicate.getLowerBoundary();
       String upperBoundary = rangePredicate.getUpperBoundary();
-      _lowerBoundary = lowerBoundary.equals("*") ? Integer.MIN_VALUE : 
Integer.parseInt(lowerBoundary);
-      _upperBoundary = upperBoundary.equals("*") ? Integer.MAX_VALUE : 
Integer.parseInt(upperBoundary);
+      _lowerBoundary =
+          lowerBoundary.equals(RangePredicate.UNBOUNDED) ? Integer.MIN_VALUE : 
Integer.parseInt(lowerBoundary);
+      _upperBoundary =
+          upperBoundary.equals(RangePredicate.UNBOUNDED) ? Integer.MAX_VALUE : 
Integer.parseInt(upperBoundary);
+      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
+      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
     }
 
     @Override
@@ -311,12 +313,12 @@ public class RangePredicateEvaluatorFactory {
     final boolean _includeUpperBoundary;
 
     LongRawValueBasedRangePredicateEvaluator(RangePredicate rangePredicate) {
-      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
-      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
       String lowerBoundary = rangePredicate.getLowerBoundary();
       String upperBoundary = rangePredicate.getUpperBoundary();
-      _lowerBoundary = lowerBoundary.equals("*") ? Integer.MIN_VALUE : 
Long.parseLong(lowerBoundary);
-      _upperBoundary = upperBoundary.equals("*") ? Integer.MAX_VALUE : 
Long.parseLong(upperBoundary);
+      _lowerBoundary = lowerBoundary.equals(RangePredicate.UNBOUNDED) ? 
Long.MIN_VALUE : Long.parseLong(lowerBoundary);
+      _upperBoundary = upperBoundary.equals(RangePredicate.UNBOUNDED) ? 
Long.MAX_VALUE : Long.parseLong(upperBoundary);
+      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
+      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
     }
 
     @Override
@@ -353,12 +355,14 @@ public class RangePredicateEvaluatorFactory {
     final boolean _includeUpperBoundary;
 
     FloatRawValueBasedRangePredicateEvaluator(RangePredicate rangePredicate) {
-      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
-      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
       String lowerBoundary = rangePredicate.getLowerBoundary();
       String upperBoundary = rangePredicate.getUpperBoundary();
-      _lowerBoundary = lowerBoundary.equals("*") ? Integer.MIN_VALUE : 
Float.parseFloat(lowerBoundary);
-      _upperBoundary = upperBoundary.equals("*") ? Integer.MAX_VALUE : 
Float.parseFloat(upperBoundary);
+      _lowerBoundary =
+          lowerBoundary.equals(RangePredicate.UNBOUNDED) ? 
Float.NEGATIVE_INFINITY : Float.parseFloat(lowerBoundary);
+      _upperBoundary =
+          upperBoundary.equals(RangePredicate.UNBOUNDED) ? 
Float.POSITIVE_INFINITY : Float.parseFloat(upperBoundary);
+      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
+      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
     }
 
     @Override
@@ -395,12 +399,14 @@ public class RangePredicateEvaluatorFactory {
     final boolean _includeUpperBoundary;
 
     DoubleRawValueBasedRangePredicateEvaluator(RangePredicate rangePredicate) {
-      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
-      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
       String lowerBoundary = rangePredicate.getLowerBoundary();
       String upperBoundary = rangePredicate.getUpperBoundary();
-      _lowerBoundary = lowerBoundary.equals("*") ? Integer.MIN_VALUE : 
Double.parseDouble(lowerBoundary);
-      _upperBoundary = upperBoundary.equals("*") ? Integer.MAX_VALUE : 
Double.parseDouble(upperBoundary);
+      _lowerBoundary =
+          lowerBoundary.equals(RangePredicate.UNBOUNDED) ? 
Double.NEGATIVE_INFINITY : Double.parseDouble(lowerBoundary);
+      _upperBoundary =
+          upperBoundary.equals(RangePredicate.UNBOUNDED) ? 
Double.POSITIVE_INFINITY : Double.parseDouble(upperBoundary);
+      _includeLowerBoundary = rangePredicate.includeLowerBoundary();
+      _includeUpperBoundary = rangePredicate.includeUpperBoundary();
     }
 
     @Override
@@ -437,8 +443,10 @@ public class RangePredicateEvaluatorFactory {
     final boolean _includeUpperBoundary;
 
     StringRawValueBasedRangePredicateEvaluator(RangePredicate rangePredicate) {
-      _lowerBoundary = rangePredicate.getLowerBoundary();
-      _upperBoundary = rangePredicate.getUpperBoundary();
+      String lowerBoundary = rangePredicate.getLowerBoundary();
+      String upperBoundary = rangePredicate.getUpperBoundary();
+      _lowerBoundary = lowerBoundary.equals(RangePredicate.UNBOUNDED) ? null : 
lowerBoundary;
+      _upperBoundary = upperBoundary.equals(RangePredicate.UNBOUNDED) ? null : 
upperBoundary;
       _includeLowerBoundary = rangePredicate.includeLowerBoundary();
       _includeUpperBoundary = rangePredicate.includeUpperBoundary();
     }
@@ -456,14 +464,14 @@ public class RangePredicateEvaluatorFactory {
     @Override
     public boolean applySV(String value) {
       boolean result = true;
-      if (!_lowerBoundary.equals("*")) {
+      if (_lowerBoundary != null) {
         if (_includeLowerBoundary) {
           result = _lowerBoundary.compareTo(value) <= 0;
         } else {
           result = _lowerBoundary.compareTo(value) < 0;
         }
       }
-      if (!_upperBoundary.equals("*")) {
+      if (_upperBoundary != null) {
         if (_includeUpperBoundary) {
           result &= _upperBoundary.compareTo(value) >= 0;
         } else {
@@ -481,16 +489,10 @@ public class RangePredicateEvaluatorFactory {
     final boolean _includeUpperBoundary;
 
     BytesRawValueBasedRangePredicateEvaluator(RangePredicate rangePredicate) {
-      if (!"*".equals(rangePredicate.getLowerBoundary())) {
-        _lowerBoundary = BytesUtils.toBytes(rangePredicate.getLowerBoundary());
-      } else {
-        _lowerBoundary = null;
-      }
-      if (!"*".equals(rangePredicate.getUpperBoundary())) {
-        _upperBoundary = BytesUtils.toBytes(rangePredicate.getUpperBoundary());
-      } else {
-        _upperBoundary = null;
-      }
+      String lowerBoundary = rangePredicate.getLowerBoundary();
+      String upperBoundary = rangePredicate.getUpperBoundary();
+      _lowerBoundary = lowerBoundary.equals(RangePredicate.UNBOUNDED) ? null : 
BytesUtils.toBytes(lowerBoundary);
+      _upperBoundary = upperBoundary.equals(RangePredicate.UNBOUNDED) ? null : 
BytesUtils.toBytes(upperBoundary);
       _includeLowerBoundary = rangePredicate.includeLowerBoundary();
       _includeUpperBoundary = rangePredicate.includeUpperBoundary();
     }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/predicate/NoDictionaryRangePredicateEvaluatorTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/predicate/NoDictionaryRangePredicateEvaluatorTest.java
index 1c60083..e325ab6 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/predicate/NoDictionaryRangePredicateEvaluatorTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/predicate/NoDictionaryRangePredicateEvaluatorTest.java
@@ -19,11 +19,11 @@
 package org.apache.pinot.core.predicate;
 
 import java.util.Collections;
-import org.apache.pinot.spi.data.FieldSpec;
-import org.apache.pinot.spi.utils.ByteArray;
 import org.apache.pinot.core.common.predicate.RangePredicate;
 import org.apache.pinot.core.operator.filter.predicate.PredicateEvaluator;
 import 
org.apache.pinot.core.operator.filter.predicate.RangePredicateEvaluatorFactory;
+import org.apache.pinot.spi.data.FieldSpec;
+import org.apache.pinot.spi.utils.ByteArray;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -75,11 +75,12 @@ public class NoDictionaryRangePredicateEvaluatorTest {
     for (int i = -20; i < 20; i++) {
       Assert.assertTrue(predicateEvaluator.applySV(i));
     }
+    Assert.assertTrue(predicateEvaluator.applySV(Integer.MIN_VALUE));
+    Assert.assertTrue(predicateEvaluator.applySV(Integer.MAX_VALUE));
   }
 
   @Test
   public void testLongPredicateEvaluator() {
-
     PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", 
FieldSpec.DataType.LONG);
     for (int i = -20; i < 20; i++) {
       Assert.assertEquals(predicateEvaluator.applySV((long) i), (i >= -10 && i 
<= 10));
@@ -119,11 +120,12 @@ public class NoDictionaryRangePredicateEvaluatorTest {
     for (int i = -20; i < 20; i++) {
       Assert.assertTrue(predicateEvaluator.applySV((long) i));
     }
+    Assert.assertTrue(predicateEvaluator.applySV(Long.MIN_VALUE));
+    Assert.assertTrue(predicateEvaluator.applySV(Long.MAX_VALUE));
   }
 
   @Test
   public void testFloatPredicateEvaluator() {
-
     PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", 
FieldSpec.DataType.FLOAT);
     for (int i = -20; i < 20; i++) {
       Assert.assertEquals(predicateEvaluator.applySV((float) i), (i >= -10 && 
i <= 10));
@@ -163,11 +165,12 @@ public class NoDictionaryRangePredicateEvaluatorTest {
     for (int i = -20; i < 20; i++) {
       Assert.assertTrue(predicateEvaluator.applySV((float) i));
     }
+    Assert.assertTrue(predicateEvaluator.applySV(Float.NEGATIVE_INFINITY));
+    Assert.assertTrue(predicateEvaluator.applySV(Float.POSITIVE_INFINITY));
   }
 
   @Test
   public void testDoublePredicateEvaluator() {
-
     PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", 
FieldSpec.DataType.DOUBLE);
     for (int i = -20; i < 20; i++) {
       Assert.assertEquals(predicateEvaluator.applySV((double) i), (i >= -10 && 
i <= 10));
@@ -207,11 +210,12 @@ public class NoDictionaryRangePredicateEvaluatorTest {
     for (int i = -20; i < 20; i++) {
       Assert.assertTrue(predicateEvaluator.applySV((double) i));
     }
+    Assert.assertTrue(predicateEvaluator.applySV(Double.NEGATIVE_INFINITY));
+    Assert.assertTrue(predicateEvaluator.applySV(Double.POSITIVE_INFINITY));
   }
 
   @Test
   public void testStringPredicateEvaluator() {
-
     PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", 
FieldSpec.DataType.STRING);
     for (int i = -20; i < 20; i++) {
       String value = Integer.toString(i);
@@ -264,7 +268,6 @@ public class NoDictionaryRangePredicateEvaluatorTest {
 
   @Test
   public void testBytesPredicateEvaluator() {
-
     PredicateEvaluator predicateEvaluator = buildRangePredicate("[10\t\t20]", 
FieldSpec.DataType.BYTES);
     for (int i = 0x00; i < 0x30; i++) {
       byte[] value = Integer.toString(i).getBytes();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to