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

JingsongLi 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 9812b35990 [core] Avoid redundant row-range sorting for global-index 
results (#9957)
9812b35990 is described below

commit 9812b359901e382d7e757ddea9e2d40a1579b35a
Author: jerry <[email protected]>
AuthorDate: Sun Sep 20 15:32:10 2026 +0800

    [core] Avoid redundant row-range sorting for global-index results (#9957)
---
 .../java/org/apache/paimon/utils/RowRangeIndex.java | 10 ++++++++++
 .../org/apache/paimon/utils/RowRangeIndexTest.java  | 21 +++++++++++++++++++++
 .../paimon/globalindex/DataEvolutionBatchScan.java  |  2 +-
 3 files changed, 32 insertions(+), 1 deletion(-)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/utils/RowRangeIndex.java 
b/paimon-common/src/main/java/org/apache/paimon/utils/RowRangeIndex.java
index 7143d7d5fd..e5264555b2 100644
--- a/paimon-common/src/main/java/org/apache/paimon/utils/RowRangeIndex.java
+++ b/paimon-common/src/main/java/org/apache/paimon/utils/RowRangeIndex.java
@@ -42,6 +42,16 @@ public class RowRangeIndex {
         }
     }
 
+    /** Builds an index from a bitmap, skipping sorting and merging for 
already ordered ranges. */
+    public static RowRangeIndex fromBitmap(RoaringNavigableMap64 bitmap) {
+        List<Range> ranges = bitmap.toRangeList();
+        // Bitmap order is unsigned; mixed signs still require signed sorting 
and merging.
+        if (ranges.size() > 1 && ranges.get(0).from > ranges.get(ranges.size() 
- 1).from) {
+            return create(ranges);
+        }
+        return new RowRangeIndex(ranges);
+    }
+
     public static RowRangeIndex create(List<Range> ranges) {
         return create(ranges, true);
     }
diff --git 
a/paimon-common/src/test/java/org/apache/paimon/utils/RowRangeIndexTest.java 
b/paimon-common/src/test/java/org/apache/paimon/utils/RowRangeIndexTest.java
index 7c4a9b1550..8a6dc99c59 100644
--- a/paimon-common/src/test/java/org/apache/paimon/utils/RowRangeIndexTest.java
+++ b/paimon-common/src/test/java/org/apache/paimon/utils/RowRangeIndexTest.java
@@ -27,6 +27,27 @@ import static org.assertj.core.api.Assertions.assertThat;
 /** Tests for {@link RowRangeIndex}. */
 class RowRangeIndexTest {
 
+    @Test
+    void testFromBitmap() {
+        RoaringNavigableMap64 bitmap = RoaringNavigableMap64.bitmapOf(2, 3, 4, 
8, 9, 10);
+        RowRangeIndex index = RowRangeIndex.fromBitmap(bitmap);
+
+        assertThat(index.ranges()).containsExactly(new Range(2, 4), new 
Range(8, 10));
+        assertThat(index.intersectedRanges(3, 9)).containsExactly(new Range(3, 
4), new Range(8, 9));
+
+        bitmap.add(20);
+        assertThat(index.intersects(20, 20)).isFalse();
+
+        assertThat(
+                        RowRangeIndex.fromBitmap(
+                                        RoaringNavigableMap64.bitmapOf(
+                                                Long.MAX_VALUE, 
Long.MIN_VALUE))
+                                .ranges())
+                .containsExactly(
+                        new Range(Long.MIN_VALUE, Long.MIN_VALUE),
+                        new Range(Long.MAX_VALUE, Long.MAX_VALUE));
+    }
+
     @Test
     void testContains() {
         RowRangeIndex index =
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/globalindex/DataEvolutionBatchScan.java
 
b/paimon-core/src/main/java/org/apache/paimon/globalindex/DataEvolutionBatchScan.java
index 618a0ee765..1a408c87fa 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/globalindex/DataEvolutionBatchScan.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/globalindex/DataEvolutionBatchScan.java
@@ -292,7 +292,7 @@ public class DataEvolutionBatchScan implements 
DataTableScan {
             }
             if (indexResult.isPresent()) {
                 GlobalIndexResult result = indexResult.get();
-                rowRangeIndex = 
RowRangeIndex.create(result.results().toRangeList());
+                rowRangeIndex = RowRangeIndex.fromBitmap(result.results());
                 if (result instanceof ScoredGlobalIndexResult) {
                     scoreGetter = ((ScoredGlobalIndexResult) 
result).scoreGetter();
                 }

Reply via email to