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

yashmayya 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 c096c70590 Fix BitmapCollection::orCardinality API when combining a 
non-inverted bitmap with an inverted one (#14487)
c096c70590 is described below

commit c096c705903b40fa8f951958a2b14bfd524076e9
Author: Yash Mayya <[email protected]>
AuthorDate: Tue Nov 19 17:31:05 2024 +0700

    Fix BitmapCollection::orCardinality API when combining a non-inverted 
bitmap with an inverted one (#14487)
---
 .../pinot/core/operator/filter/BitmapCollection.java      |  5 ++---
 .../pinot/core/operator/filter/BitmapCollectionTest.java  |  2 +-
 .../integration/tests/OfflineClusterIntegrationTest.java  | 15 +++++++++++++++
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapCollection.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapCollection.java
index b3f40ed41f..04fddee856 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapCollection.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/operator/filter/BitmapCollection.java
@@ -86,11 +86,10 @@ public class BitmapCollection {
       if (!bitmaps._inverted) {
         return ImmutableRoaringBitmap.orCardinality(left, right);
       }
-      return _numDocs - right.getCardinality() - 
ImmutableRoaringBitmap.andCardinality(left, right);
+      return _numDocs - right.getCardinality() + 
ImmutableRoaringBitmap.andCardinality(left, right);
     } else {
       if (!bitmaps._inverted) {
-        return _numDocs - left.getCardinality()
-            + ImmutableRoaringBitmap.andCardinality(right, left);
+        return _numDocs - left.getCardinality() + 
ImmutableRoaringBitmap.andCardinality(right, left);
       }
       return _numDocs - ImmutableRoaringBitmap.andCardinality(left, right);
     }
diff --git 
a/pinot-core/src/test/java/org/apache/pinot/core/operator/filter/BitmapCollectionTest.java
 
b/pinot-core/src/test/java/org/apache/pinot/core/operator/filter/BitmapCollectionTest.java
index e7985a0369..5224b35f9d 100644
--- 
a/pinot-core/src/test/java/org/apache/pinot/core/operator/filter/BitmapCollectionTest.java
+++ 
b/pinot-core/src/test/java/org/apache/pinot/core/operator/filter/BitmapCollectionTest.java
@@ -171,7 +171,7 @@ public class BitmapCollectionTest {
         },
         {
             10, ImmutableRoaringBitmap.bitmapOf(0, 5), false,
-            ImmutableRoaringBitmap.bitmapOf(0, 4), true, 7
+            ImmutableRoaringBitmap.bitmapOf(0, 4), true, 9
         },
         {
             10, ImmutableRoaringBitmap.bitmapOf(0, 5), false,
diff --git 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
index f323a88b7a..9e287cb284 100644
--- 
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
+++ 
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/OfflineClusterIntegrationTest.java
@@ -3762,4 +3762,19 @@ public class OfflineClusterIntegrationTest extends 
BaseClusterIntegrationTestSet
     // empty groups
     assertEquals(result.get("numRowsResultSet").asInt(), 0);
   }
+
+  @Test(dataProvider = "useBothQueryEngines")
+  public void 
testFastFilteredCountWithOrFilterOnBitmapWithExclusiveBitmap(boolean 
useMultiStageQueryEngine)
+      throws Exception {
+    setUseMultiStageQueryEngine(useMultiStageQueryEngine);
+    // Column "Origin" has a range index, and column "DayofMonth" has a sorted 
index in several segments. This means
+    // that the count aggregation will be executed using the fast filtered 
count operator in these segments. The range
+    // index will produce a non-inverted bitmap collection and the sorted 
index will produce an inverted bitmap
+    // collection (since the filter predicate is exclusive).
+
+    // See this issue - https://github.com/apache/pinot/issues/14486
+    testQuery(
+        "SELECT COUNT(*) FROM mytable WHERE Origin BETWEEN 'ALB' AND 'LMT' OR 
DayofMonth <> 2"
+    );
+  }
 }


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

Reply via email to