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();
     }
 }

Reply via email to