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