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 b8c9383dd5 [core] Honor query-level search-mode overrides (#9128)
b8c9383dd5 is described below
commit b8c9383dd5ac672dcab29018b716637b0795ce7d
Author: CrownChu <[email protected]>
AuthorDate: Mon Aug 10 13:43:11 2026 +0800
[core] Honor query-level search-mode overrides (#9128)
---
.../apache/paimon/table/source/DataEvolutionVectorScan.java | 12 ++++++++++--
.../apache/paimon/table/source/VectorSearchBuilderTest.java | 11 +++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git
a/paimon-core/src/main/java/org/apache/paimon/table/source/DataEvolutionVectorScan.java
b/paimon-core/src/main/java/org/apache/paimon/table/source/DataEvolutionVectorScan.java
index 2064b5614e..fdb57385ab 100644
---
a/paimon-core/src/main/java/org/apache/paimon/table/source/DataEvolutionVectorScan.java
+++
b/paimon-core/src/main/java/org/apache/paimon/table/source/DataEvolutionVectorScan.java
@@ -18,6 +18,7 @@
package org.apache.paimon.table.source;
+import org.apache.paimon.CoreOptions;
import org.apache.paimon.CoreOptions.GlobalIndexSearchMode;
import org.apache.paimon.Snapshot;
import org.apache.paimon.globalindex.DataEvolutionGlobalIndexCoverage;
@@ -159,7 +160,8 @@ public class DataEvolutionVectorScan implements VectorScan {
splits.add(new IndexVectorSearchSplit(range.from, range.to,
vectorFiles, scalarFiles));
}
- GlobalIndexSearchMode vectorSearchMode =
table.coreOptions().vectorIndexSearchMode();
+ CoreOptions effectiveOptions = effectiveCoreOptions();
+ GlobalIndexSearchMode vectorSearchMode =
effectiveOptions.vectorIndexSearchMode();
List<Range> rawRowRanges =
new DataEvolutionGlobalIndexCoverage(
table,
@@ -175,7 +177,7 @@ public class DataEvolutionVectorScan implements VectorScan {
snapshot,
partitionFilter,
scalarIndexFiles(allIndexFiles),
-
table.coreOptions().scalarIndexSearchMode())
+ effectiveOptions.scalarIndexSearchMode())
.unindexedRanges(table.rowType(), filter);
if (vectorSearchMode == GlobalIndexSearchMode.FAST) {
scalarUnindexedRanges =
@@ -209,6 +211,12 @@ public class DataEvolutionVectorScan implements VectorScan
{
};
}
+ private CoreOptions effectiveCoreOptions() {
+ Map<String, String> merged = new HashMap<>(table.options());
+ merged.putAll(options);
+ return CoreOptions.fromMap(merged);
+ }
+
private static boolean isPrimaryColumn(GlobalIndexMeta meta, int fieldId) {
return meta.indexFieldId() == fieldId;
}
diff --git
a/paimon-core/src/test/java/org/apache/paimon/table/source/VectorSearchBuilderTest.java
b/paimon-core/src/test/java/org/apache/paimon/table/source/VectorSearchBuilderTest.java
index ec116a87a7..408ed2f0e0 100644
---
a/paimon-core/src/test/java/org/apache/paimon/table/source/VectorSearchBuilderTest.java
+++
b/paimon-core/src/test/java/org/apache/paimon/table/source/VectorSearchBuilderTest.java
@@ -1319,6 +1319,17 @@ public class VectorSearchBuilderTest extends
TableTestBase {
GlobalIndexResult result =
searchBuilder.newVectorRead().read(searchBuilder.newVectorScan().scan());
assertThat(result.results().isEmpty()).isTrue();
+
+ VectorSearchBuilder fullFallback =
+ table.newVectorSearchBuilder()
+ .withVector(new float[] {0.0f, 0.0f})
+ .withLimit(1)
+ .withVectorColumn(VECTOR_FIELD_NAME)
+ .withFilter(idFilter)
+
.withOption(CoreOptions.SCALAR_INDEX_SEARCH_MODE.key(), "full");
+ GlobalIndexResult fallbackResult =
+
fullFallback.newVectorRead().read(fullFallback.newVectorScan().scan());
+ assertThat(fallbackResult.results()).containsExactly(8L);
}
@Test