This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new a2a0362cba [core] Enrich static creation methods for GlobalIndexResult
a2a0362cba is described below
commit a2a0362cba46c18cc5934f5f1dc83e6937195918
Author: JingsongLi <[email protected]>
AuthorDate: Wed Dec 3 14:50:02 2025 +0800
[core] Enrich static creation methods for GlobalIndexResult
---
.../paimon/globalindex/GlobalIndexResult.java | 33 ++++++--
.../globalindex/bitmap/BitmapGlobalIndex.java | 5 +-
.../bitmap/BitmapIndexResultWrapper.java | 77 -----------------
.../org/apache/paimon/utils/RoaringBitmap32.java | 10 +++
.../bitmapindex/BitmapGlobalIndexTest.java | 98 +++++++---------------
5 files changed, 72 insertions(+), 151 deletions(-)
diff --git
a/paimon-common/src/main/java/org/apache/paimon/globalindex/GlobalIndexResult.java
b/paimon-common/src/main/java/org/apache/paimon/globalindex/GlobalIndexResult.java
index 56aaaadc20..e5ad57f336 100644
---
a/paimon-common/src/main/java/org/apache/paimon/globalindex/GlobalIndexResult.java
+++
b/paimon-common/src/main/java/org/apache/paimon/globalindex/GlobalIndexResult.java
@@ -18,25 +18,25 @@
package org.apache.paimon.globalindex;
+import org.apache.paimon.utils.LazyField;
+import org.apache.paimon.utils.Range;
import org.apache.paimon.utils.RoaringNavigableMap64;
+import java.util.function.Supplier;
+
/** Global index result represents row ids as a compressed bitmap. */
public interface GlobalIndexResult {
/** Returns the bitmap representing row ids. */
RoaringNavigableMap64 results();
- static GlobalIndexResult createEmpty() {
- return RoaringNavigableMap64::new;
- }
-
/**
* Returns the intersection of this result and the other result.
*
* <p>Uses native bitmap AND operation for optimal performance.
*/
default GlobalIndexResult and(GlobalIndexResult other) {
- return () -> RoaringNavigableMap64.and(this.results(),
other.results());
+ return create(() -> RoaringNavigableMap64.and(this.results(),
other.results()));
}
/**
@@ -45,6 +45,27 @@ public interface GlobalIndexResult {
* <p>Uses native bitmap OR operation for optimal performance.
*/
default GlobalIndexResult or(GlobalIndexResult other) {
- return () -> RoaringNavigableMap64.or(this.results(), other.results());
+ return create(() -> RoaringNavigableMap64.or(this.results(),
other.results()));
+ }
+
+ /** Returns an empty {@link GlobalIndexResult}. */
+ static GlobalIndexResult createEmpty() {
+ return create(RoaringNavigableMap64::new);
+ }
+
+ /** Returns a new {@link GlobalIndexResult} from supplier. */
+ static GlobalIndexResult create(Supplier<RoaringNavigableMap64> supplier) {
+ LazyField<RoaringNavigableMap64> lazyField = new LazyField<>(supplier);
+ return lazyField::get;
+ }
+
+ /** Returns a new {@link GlobalIndexResult} from {@link Range}. */
+ static GlobalIndexResult fromRange(Range range) {
+ return create(
+ () -> {
+ RoaringNavigableMap64 result64 = new
RoaringNavigableMap64();
+ result64.addRange(range);
+ return result64;
+ });
}
}
diff --git
a/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapGlobalIndex.java
b/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapGlobalIndex.java
index 54c4ccc9f6..c8098e8cab 100644
---
a/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapGlobalIndex.java
+++
b/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapGlobalIndex.java
@@ -68,10 +68,11 @@ public class BitmapGlobalIndex implements GlobalIndexer {
private GlobalIndexResult toGlobalResult(Range range, FileIndexResult
result) {
if (FileIndexResult.REMAIN == result) {
- return BitmapIndexResultWrapper.fromRange(range);
+ return GlobalIndexResult.fromRange(range);
} else if (FileIndexResult.SKIP == result) {
return GlobalIndexResult.createEmpty();
}
- return new BitmapIndexResultWrapper((BitmapIndexResult) result,
range.from);
+ BitmapIndexResult bitmapResult = (BitmapIndexResult) result;
+ return GlobalIndexResult.create(() ->
bitmapResult.get().toNavigable64(range.from));
}
}
diff --git
a/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapIndexResultWrapper.java
b/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapIndexResultWrapper.java
deleted file mode 100644
index 301b75c27e..0000000000
---
a/paimon-common/src/main/java/org/apache/paimon/globalindex/bitmap/BitmapIndexResultWrapper.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.paimon.globalindex.bitmap;
-
-import org.apache.paimon.fileindex.bitmap.BitmapIndexResult;
-import org.apache.paimon.globalindex.GlobalIndexResult;
-import org.apache.paimon.utils.Range;
-import org.apache.paimon.utils.RoaringBitmap32;
-import org.apache.paimon.utils.RoaringNavigableMap64;
-
-import java.util.Iterator;
-
-/** A {@link GlobalIndexResult} wrapper for {@link BitmapIndexResult}. */
-public class BitmapIndexResultWrapper implements GlobalIndexResult {
-
- private final BitmapIndexResult result;
- private final long start;
- private RoaringNavigableMap64 lazyResult;
-
- public BitmapIndexResultWrapper(BitmapIndexResult result, long start) {
- this.result = result;
- this.start = start;
- }
-
- public BitmapIndexResultWrapper(RoaringNavigableMap64 finalResult) {
- this.result = null;
- this.start = -1;
- this.lazyResult = finalResult;
- }
-
- @Override
- public RoaringNavigableMap64 results() {
- if (lazyResult != null) {
- return lazyResult;
- }
- if (result == null) {
- throw new IllegalStateException("No results available");
- }
- RoaringBitmap32 bitmap = result.get();
- RoaringNavigableMap64 result64 = new RoaringNavigableMap64();
-
- // Convert 32-bit bitmap to 64-bit bitmap with offset
- Iterator<Integer> iterator = bitmap.iterator();
- while (iterator.hasNext()) {
- result64.add(iterator.next() + start);
- }
- result64.runOptimize();
- this.lazyResult = result64;
- return result64;
- }
-
- public static BitmapIndexResultWrapper fromRange(Range range) {
- RoaringNavigableMap64 result64 = new RoaringNavigableMap64();
- result64.addRange(range);
- return new BitmapIndexResultWrapper(result64);
- }
-
- public BitmapIndexResult getBitmapIndexResult() {
- return result;
- }
-}
diff --git
a/paimon-common/src/main/java/org/apache/paimon/utils/RoaringBitmap32.java
b/paimon-common/src/main/java/org/apache/paimon/utils/RoaringBitmap32.java
index b37eb837cf..fd9f57eee5 100644
--- a/paimon-common/src/main/java/org/apache/paimon/utils/RoaringBitmap32.java
+++ b/paimon-common/src/main/java/org/apache/paimon/utils/RoaringBitmap32.java
@@ -161,6 +161,16 @@ public class RoaringBitmap32 {
return roaringBitmap.iterator();
}
+ public RoaringNavigableMap64 toNavigable64(long offset) {
+ RoaringNavigableMap64 result64 = new RoaringNavigableMap64();
+ Iterator<Integer> iterator = iterator();
+ while (iterator.hasNext()) {
+ result64.add(iterator.next() + offset);
+ }
+ result64.runOptimize();
+ return result64;
+ }
+
@Override
public String toString() {
return roaringBitmap.toString();
diff --git
a/paimon-common/src/test/java/org/apache/paimon/globalindex/bitmapindex/BitmapGlobalIndexTest.java
b/paimon-common/src/test/java/org/apache/paimon/globalindex/bitmapindex/BitmapGlobalIndexTest.java
index b9cde9accc..e193eb88d6 100644
---
a/paimon-common/src/test/java/org/apache/paimon/globalindex/bitmapindex/BitmapGlobalIndexTest.java
+++
b/paimon-common/src/test/java/org/apache/paimon/globalindex/bitmapindex/BitmapGlobalIndexTest.java
@@ -28,7 +28,6 @@ import org.apache.paimon.globalindex.GlobalIndexReader;
import org.apache.paimon.globalindex.GlobalIndexResult;
import org.apache.paimon.globalindex.GlobalIndexWriter;
import org.apache.paimon.globalindex.bitmap.BitmapGlobalIndex;
-import org.apache.paimon.globalindex.bitmap.BitmapIndexResultWrapper;
import org.apache.paimon.globalindex.io.GlobalIndexFileReader;
import org.apache.paimon.globalindex.io.GlobalIndexFileWriter;
import org.apache.paimon.options.Options;
@@ -37,6 +36,7 @@ import org.apache.paimon.types.DataType;
import org.apache.paimon.types.DataTypes;
import org.apache.paimon.utils.Range;
import org.apache.paimon.utils.RoaringBitmap32;
+import org.apache.paimon.utils.RoaringNavigableMap64;
import org.junit.Rule;
import org.junit.jupiter.api.Test;
@@ -93,22 +93,14 @@ public class BitmapGlobalIndexTest {
writer.write(o);
}
});
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef, a))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0, 4));
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef, b))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(2));
- assert ((BitmapIndexResultWrapper) reader.visitIsNull(fieldRef))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(1, 3));
- assert ((BitmapIndexResultWrapper) reader.visitIn(fieldRef,
Arrays.asList(a, b)))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0, 2, 4));
+ assert reader.visitEqual(fieldRef, a)
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(0, 4));
+ assert reader.visitEqual(fieldRef,
b).results().equals(RoaringNavigableMap64.bitmapOf(2));
+ assert
reader.visitIsNull(fieldRef).results().equals(RoaringNavigableMap64.bitmapOf(1,
3));
+ assert reader.visitIn(fieldRef, Arrays.asList(a, b))
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(0, 2, 4));
assert reader.visitEqual(fieldRef,
BinaryString.fromString("c")).results().isEmpty();
}
@@ -125,22 +117,12 @@ public class BitmapGlobalIndexTest {
writer.write(o);
}
});
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef, 0))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0));
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef, 1))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(1));
- assert ((BitmapIndexResultWrapper) reader.visitIsNull(fieldRef))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(2));
- assert ((BitmapIndexResultWrapper) reader.visitIn(fieldRef,
Arrays.asList(0, 1, 2)))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0, 1));
+ assert reader.visitEqual(fieldRef,
0).results().equals(RoaringNavigableMap64.bitmapOf(0));
+ assert reader.visitEqual(fieldRef,
1).results().equals(RoaringNavigableMap64.bitmapOf(1));
+ assert
reader.visitIsNull(fieldRef).results().equals(RoaringNavigableMap64.bitmapOf(2));
+ assert reader.visitIn(fieldRef, Arrays.asList(0, 1, 2))
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(0, 1));
assert reader.visitEqual(fieldRef, 2).results().isEmpty();
}
@@ -158,14 +140,10 @@ public class BitmapGlobalIndexTest {
writer.write(o);
}
});
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef,
Boolean.TRUE))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0, 2));
- assert ((BitmapIndexResultWrapper) reader.visitIsNull(fieldRef))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(4));
+ assert reader.visitEqual(fieldRef, Boolean.TRUE)
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(0, 2));
+ assert
reader.visitIsNull(fieldRef).results().equals(RoaringNavigableMap64.bitmapOf(4));
}
private void testHighCardinality(
@@ -200,15 +178,12 @@ public class BitmapGlobalIndexTest {
GlobalIndexResult result =
reader.visitEqual(
fieldRef, BinaryString.fromString(prefix +
(approxCardinality / 2)));
- RoaringBitmap32 resultBm = ((BitmapIndexResultWrapper)
result).getBitmapIndexResult().get();
System.out.println("read time: " + (System.currentTimeMillis() -
time2));
- assert resultBm.equals(middleBm);
+ assert result.results().equals(middleBm.toNavigable64(0));
long time3 = System.currentTimeMillis();
GlobalIndexResult resultNull = reader.visitIsNull(fieldRef);
- RoaringBitmap32 resultNullBm =
- ((BitmapIndexResultWrapper)
resultNull).getBitmapIndexResult().get();
System.out.println("read null bitmap time: " +
(System.currentTimeMillis() - time3));
- assert resultNullBm.equals(nullBm);
+ assert resultNull.results().equals(nullBm.toNavigable64(0));
}
private GlobalIndexReader createTestReaderOnWriter(
@@ -273,22 +248,14 @@ public class BitmapGlobalIndexTest {
a.pointTo(c.getSegments(), c.getOffset(),
c.getSizeInBytes());
writer.write(null);
});
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef, a))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0));
- assert ((BitmapIndexResultWrapper) reader.visitEqual(fieldRef, b))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(3));
- assert ((BitmapIndexResultWrapper) reader.visitIsNull(fieldRef))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(1, 2, 4, 5));
- assert ((BitmapIndexResultWrapper) reader.visitIn(fieldRef,
Arrays.asList(a, b)))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0, 3));
+ assert reader.visitEqual(fieldRef,
a).results().equals(RoaringNavigableMap64.bitmapOf(0));
+ assert reader.visitEqual(fieldRef,
b).results().equals(RoaringNavigableMap64.bitmapOf(3));
+ assert reader.visitIsNull(fieldRef)
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(1, 2, 4, 5));
+ assert reader.visitIn(fieldRef, Arrays.asList(a, b))
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(0, 3));
assert reader.visitEqual(fieldRef,
BinaryString.fromString("c")).results().isEmpty();
}
@@ -305,10 +272,9 @@ public class BitmapGlobalIndexTest {
writer.write(o);
}
});
- assert ((BitmapIndexResultWrapper) reader.visitIsNull(fieldRef))
- .getBitmapIndexResult()
- .get()
- .equals(RoaringBitmap32.bitmapOf(0, 1, 2));
+ assert reader.visitIsNull(fieldRef)
+ .results()
+ .equals(RoaringNavigableMap64.bitmapOf(0, 1, 2));
assert reader.visitIsNotNull(fieldRef).results().isEmpty();
}
}