From 9ca7e06a6f09a5f0b94d1ad1bb7cac0f6fad5925 Mon Sep 17 00:00:00 2001 From: Xuanwo Date: Fri, 24 Jul 2026 16:10:04 +0800 Subject: [PATCH 1/9] fix: re-evaluate overlay-stale FTS rows by row --- rust/lance-index/src/scalar/inverted/index.rs | 507 ++++++++++++++++-- rust/lance/src/dataset/overlay.rs | 76 +-- rust/lance/src/dataset/scanner.rs | 451 ++++++++++------ .../tests/dataset_overlay_index_masking.rs | 342 ++++++++++-- rust/lance/src/io/exec/fts.rs | 129 ++++- rust/lance/src/io/exec/utils.rs | 11 +- 6 files changed, 1206 insertions(+), 310 deletions(-) diff --git a/rust/lance-index/src/scalar/inverted/index.rs b/rust/lance-index/src/scalar/inverted/index.rs index d00d270c1a2..83807c35f80 100644 --- a/rust/lance-index/src/scalar/inverted/index.rs +++ b/rust/lance-index/src/scalar/inverted/index.rs @@ -18,7 +18,7 @@ use std::{ use crate::metrics::NoOpMetricsCollector; use crate::prefilter::NoFilter; use crate::scalar::registry::{TrainingCriteria, TrainingOrdering}; -use arrow::array::{FixedSizeListBuilder, Float32Builder, Int32Builder}; +use arrow::array::{BooleanBuilder, FixedSizeListBuilder, Float32Builder, Int32Builder}; use arrow::datatypes::{self, Float32Type, Int32Type, UInt64Type}; use arrow::{ array::{ @@ -28,8 +28,8 @@ use arrow::{ }; use arrow::{buffer::ScalarBuffer, datatypes::UInt32Type}; use arrow_array::{ - Array, ArrayRef, Float32Array, LargeBinaryArray, ListArray, OffsetSizeTrait, RecordBatch, - UInt32Array, UInt64Array, + Array, ArrayRef, BooleanArray, Float32Array, LargeBinaryArray, ListArray, OffsetSizeTrait, + RecordBatch, UInt32Array, UInt64Array, }; use arrow_schema::{DataType, Field, Schema, SchemaRef}; use async_trait::async_trait; @@ -7004,6 +7004,7 @@ fn do_flat_full_text_search_list( const FLAT_ROW_ID_COL_IDX: usize = 0; const FLAT_ALL_TOKENS_COL_IDX: usize = 1; const FLAT_QUERY_TOKEN_COUNTS_COL_IDX: usize = 2; +const FLAT_PHRASE_MATCH_COL: &str = "phrase_match"; /// If we accumulate this many bytes we warn the user they probably want to use an FTS index instead. const BYTES_ACCUMULATED_WARNING_THRESHOLD: u64 = 1024 * 1024 * 1024; // 1GB @@ -7026,9 +7027,10 @@ async fn tokenize_and_count( tokenizer: Box, query_tokens: Arc, doc_col_idx: usize, + phrase_slop: Option, elapsed_compute: Option