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]