Skip to content

Commit 1c7b391

Browse files
committed
[core] Do not create GlobalIndexScanner when no index files
1 parent 50b8fcd commit 1c7b391

File tree

7 files changed

+33
-38
lines changed

7 files changed

+33
-38
lines changed

paimon-core/src/main/java/org/apache/paimon/globalindex/DataEvolutionBatchScan.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,13 @@ private Optional<GlobalIndexResult> evalGlobalIndex() {
267267
}
268268
PartitionPredicate partitionFilter =
269269
batchScan.snapshotReader().manifestsReader().partitionFilter();
270-
try (GlobalIndexScanner scanner =
271-
GlobalIndexScanner.create(table, partitionFilter, filter)) {
270+
Optional<GlobalIndexScanner> optionalScanner =
271+
GlobalIndexScanner.create(table, partitionFilter, filter);
272+
if (!optionalScanner.isPresent()) {
273+
return Optional.empty();
274+
}
275+
276+
try (GlobalIndexScanner scanner = optionalScanner.get()) {
272277
return scanner.scan(filter);
273278
} catch (IOException e) {
274279
throw new RuntimeException(e);

paimon-core/src/main/java/org/apache/paimon/globalindex/GlobalIndexScanner.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,21 @@ public GlobalIndexScanner(
9797
this.globalIndexEvaluator = new GlobalIndexEvaluator(rowType, readersFunction);
9898
}
9999

100-
public static GlobalIndexScanner create(
100+
public static Optional<GlobalIndexScanner> create(
101101
FileStoreTable table, Collection<IndexFileMeta> indexFiles) {
102-
return new GlobalIndexScanner(
103-
table.coreOptions().toConfiguration(),
104-
table.rowType(),
105-
table.fileIO(),
106-
table.store().pathFactory().globalIndexFileFactory(),
107-
indexFiles);
102+
if (indexFiles.isEmpty()) {
103+
return Optional.empty();
104+
}
105+
return Optional.of(
106+
new GlobalIndexScanner(
107+
table.coreOptions().toConfiguration(),
108+
table.rowType(),
109+
table.fileIO(),
110+
table.store().pathFactory().globalIndexFileFactory(),
111+
indexFiles));
108112
}
109113

110-
public static GlobalIndexScanner create(
114+
public static Optional<GlobalIndexScanner> create(
111115
FileStoreTable table, PartitionPredicate partitionFilter, Predicate filter) {
112116
Set<Integer> filterFieldIds =
113117
collectFieldNames(filter).stream()
@@ -131,7 +135,6 @@ public static GlobalIndexScanner create(
131135
.stream()
132136
.map(IndexManifestEntry::indexFile)
133137
.collect(Collectors.toList());
134-
135138
return create(table, indexFiles);
136139
}
137140

paimon-core/src/main/java/org/apache/paimon/table/source/VectorReadImpl.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,13 @@ private Optional<RoaringNavigableMap64> preFilter(List<VectorSearchSplit> splits
119119
for (VectorSearchSplit split : splits) {
120120
scalarIndexFiles.addAll(split.scalarIndexFiles());
121121
}
122-
if (scalarIndexFiles.isEmpty()) {
122+
123+
Optional<GlobalIndexScanner> optionalScanner =
124+
GlobalIndexScanner.create(table, scalarIndexFiles);
125+
if (!optionalScanner.isPresent()) {
123126
return Optional.empty();
124127
}
125-
126-
try (GlobalIndexScanner scanner = GlobalIndexScanner.create(table, scalarIndexFiles)) {
128+
try (GlobalIndexScanner scanner = optionalScanner.get()) {
127129
return scanner.scan(filter).map(GlobalIndexResult::results);
128130
} catch (IOException e) {
129131
throw new RuntimeException(e);

paimon-core/src/test/java/org/apache/paimon/table/BitmapGlobalIndexTableTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ private List<IndexFileMeta> createBitmapIndex(
248248
private RoaringNavigableMap64 globalIndexScan(FileStoreTable table, Predicate predicate)
249249
throws Exception {
250250
try (GlobalIndexScanner scanner =
251-
GlobalIndexScanner.create(table, PartitionPredicate.ALWAYS_TRUE, predicate)) {
251+
GlobalIndexScanner.create(table, PartitionPredicate.ALWAYS_TRUE, predicate).get()) {
252252
return scanner.scan(predicate).get().results();
253253
}
254254
}

paimon-core/src/test/java/org/apache/paimon/table/BtreeGlobalIndexTableTest.java

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
package org.apache.paimon.table;
2020

2121
import org.apache.paimon.data.BinaryString;
22-
import org.apache.paimon.data.GenericRow;
2322
import org.apache.paimon.globalindex.DataEvolutionBatchScan;
2423
import org.apache.paimon.globalindex.GlobalIndexResult;
2524
import org.apache.paimon.globalindex.GlobalIndexScanner;
@@ -29,13 +28,10 @@
2928
import org.apache.paimon.predicate.Predicate;
3029
import org.apache.paimon.predicate.PredicateBuilder;
3130
import org.apache.paimon.table.sink.BatchTableCommit;
32-
import org.apache.paimon.table.sink.BatchTableWrite;
33-
import org.apache.paimon.table.sink.BatchWriteBuilder;
3431
import org.apache.paimon.table.sink.CommitMessage;
3532
import org.apache.paimon.table.source.DataSplit;
3633
import org.apache.paimon.table.source.ReadBuilder;
3734
import org.apache.paimon.table.source.Split;
38-
import org.apache.paimon.types.RowType;
3935
import org.apache.paimon.utils.Range;
4036
import org.apache.paimon.utils.RoaringNavigableMap64;
4137

@@ -206,27 +202,10 @@ private List<DataSplit> indexSplits(
206202
.collect(Collectors.toList());
207203
}
208204

209-
private void append(int startInclusive, int endExclusive) throws Exception {
210-
BatchWriteBuilder builder = getTableDefault().newBatchWriteBuilder();
211-
RowType writeType = schemaDefault().rowType();
212-
try (BatchTableWrite write0 = builder.newWrite().withWriteType(writeType)) {
213-
for (int i = startInclusive; i < endExclusive; i++) {
214-
write0.write(
215-
GenericRow.of(
216-
i,
217-
BinaryString.fromString("a" + i),
218-
BinaryString.fromString("b" + i)));
219-
}
220-
try (BatchTableCommit commit = builder.newCommit()) {
221-
commit.commit(write0.prepareCommit());
222-
}
223-
}
224-
}
225-
226205
private RoaringNavigableMap64 globalIndexScan(FileStoreTable table, Predicate predicate)
227206
throws Exception {
228207
try (GlobalIndexScanner scanner =
229-
GlobalIndexScanner.create(table, PartitionPredicate.ALWAYS_TRUE, predicate)) {
208+
GlobalIndexScanner.create(table, PartitionPredicate.ALWAYS_TRUE, predicate).get()) {
230209
return scanner.scan(predicate).get().results();
231210
}
232211
}

paimon-python/pypaimon/globalindex/global_index_scanner.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def readers_function(field: DataField) -> Collection[GlobalIndexReader]:
7676
return GlobalIndexEvaluator(fields, readers_function)
7777

7878
@staticmethod
79-
def create(table, index_files=None, partition_filter=None, predicate=None):
79+
def create(table, index_files=None, partition_filter=None, predicate=None) -> Optional['GlobalIndexScanner']:
8080
"""Create a GlobalIndexScanner.
8181
8282
Can be called in two ways:
@@ -86,6 +86,8 @@ def create(table, index_files=None, partition_filter=None, predicate=None):
8686
from pypaimon.index.index_file_handler import IndexFileHandler
8787

8888
if index_files is not None:
89+
if len(index_files) == 0:
90+
return None
8991
return GlobalIndexScanner(
9092
options=table.table_schema.options,
9193
fields=table.fields,
@@ -117,6 +119,8 @@ def index_file_filter(entry):
117119
entries = index_file_handler.scan(snapshot, index_file_filter)
118120
scanned_index_files = [entry.index_file for entry in entries]
119121

122+
if len(scanned_index_files) == 0:
123+
return None
120124
return GlobalIndexScanner(
121125
options=table.table_schema.options,
122126
fields=table.fields,

paimon-python/pypaimon/read/scanner/file_scanner.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ def _eval_global_index(self):
313313
partition_filter=self.partition_key_predicate,
314314
predicate=self.predicate
315315
)
316+
if scanner is None:
317+
return None
316318
with scanner:
317319
return scanner.scan(self.predicate)
318320
except Exception:

0 commit comments

Comments
 (0)