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 1b0199e7ec Exclude NULLs when PredicateEvaluator::isAlwaysTrue is 
true. (#11261)
1b0199e7ec is described below

commit 1b0199e7ec7eb5c6afe0ae735ce4946241154b8c
Author: Shen Yu <[email protected]>
AuthorDate: Fri Aug 4 18:25:00 2023 -0700

    Exclude NULLs when PredicateEvaluator::isAlwaysTrue is true. (#11261)
---
 .../core/operator/filter/FilterOperatorUtils.java  | 11 ++++++
 .../queries/NullHandlingEnabledQueriesTest.java    | 40 ++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java
index 26e50e0efe..c0aa629cb6 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/FilterOperatorUtils.java
@@ -26,6 +26,8 @@ import 
org.apache.pinot.common.request.context.predicate.Predicate;
 import org.apache.pinot.core.operator.filter.predicate.PredicateEvaluator;
 import org.apache.pinot.core.query.request.context.QueryContext;
 import org.apache.pinot.segment.spi.datasource.DataSource;
+import org.apache.pinot.segment.spi.index.reader.NullValueVectorReader;
+import org.roaringbitmap.buffer.ImmutableRoaringBitmap;
 
 
 public class FilterOperatorUtils {
@@ -73,6 +75,15 @@ public class FilterOperatorUtils {
       if (predicateEvaluator.isAlwaysFalse()) {
         return EmptyFilterOperator.getInstance();
       } else if (predicateEvaluator.isAlwaysTrue()) {
+        if (queryContext.isNullHandlingEnabled()) {
+          NullValueVectorReader nullValueVectorReader = 
dataSource.getNullValueVector();
+          if (nullValueVectorReader != null) {
+            ImmutableRoaringBitmap nullBitmap = 
nullValueVectorReader.getNullBitmap();
+            if (nullBitmap != null && !nullBitmap.isEmpty()) {
+              return new BitmapBasedFilterOperator(nullBitmap, true, numDocs);
+            }
+          }
+        }
         return new MatchAllFilterOperator(numDocs);
       }
 
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
index ef9386a955..d448b70dc0 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/queries/NullHandlingEnabledQueriesTest.java
@@ -649,6 +649,46 @@ public class NullHandlingEnabledQueriesTest extends 
BaseQueriesTest {
     assertArrayEquals(rows.get(0), new Object[]{false});
   }
 
+  @Test
+  public void testRangeFiltering()
+      throws Exception {
+    initializeRows();
+    insertRow(-1);
+    insertRow(null);
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setSortedColumn(COLUMN1).build();
+    Schema schema = new 
Schema.SchemaBuilder().addSingleValueDimension(COLUMN1, 
FieldSpec.DataType.INT).build();
+    setUpSegments(tableConfig, schema);
+    String query = String.format("SELECT * FROM testTable WHERE %s < 0", 
COLUMN1);
+
+    BrokerResponseNative brokerResponse = getBrokerResponse(query, 
QUERY_OPTIONS);
+
+    ResultTable resultTable = brokerResponse.getResultTable();
+    List<Object[]> rows = resultTable.getRows();
+    assertEquals(rows.size(), NUM_OF_SEGMENT_COPIES);
+    assertArrayEquals(rows.get(0), new Object[]{-1});
+  }
+
+  @Test
+  public void testEqualFiltering()
+      throws Exception {
+    initializeRows();
+    insertRow(null);
+    insertRow(Integer.MIN_VALUE);
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(RAW_TABLE_NAME).setSortedColumn(COLUMN1).build();
+    Schema schema = new 
Schema.SchemaBuilder().addSingleValueDimension(COLUMN1, 
FieldSpec.DataType.INT).build();
+    setUpSegments(tableConfig, schema);
+    String query = String.format("SELECT * FROM testTable WHERE %s = %d", 
COLUMN1, Integer.MIN_VALUE);
+
+    BrokerResponseNative brokerResponse = getBrokerResponse(query, 
QUERY_OPTIONS);
+
+    ResultTable resultTable = brokerResponse.getResultTable();
+    List<Object[]> rows = resultTable.getRows();
+    assertEquals(rows.size(), NUM_OF_SEGMENT_COPIES);
+    assertArrayEquals(rows.get(0), new Object[]{Integer.MIN_VALUE});
+  }
+
   @Test
   public void testOrFiltering()
       throws Exception {


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

Reply via email to