From b23d75a0320c370dc494ff836c4cefd3bef7970c Mon Sep 17 00:00:00 2001 From: "cai.zhang" Date: Tue, 21 Oct 2025 09:52:04 +0800 Subject: [PATCH] fix: Fix bug for gis function to filter geometry (#44966) issue: #44961 This PR fixes 3 geometry related bugs: 1. Implement `ToString` interface for GisFunctionFilter. 2. Ignore GisFunctionFilter `MoveCursor` for growing segment. 3. Don't skip null geometry for building R-Tree index, should be record in null_offsets. --------- Signed-off-by: Cai Zhang --- .../exec/expression/GISFunctionFilterExpr.h | 12 ++++++++++++ internal/core/src/segcore/FieldIndexing.cpp | 18 ++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/internal/core/src/exec/expression/GISFunctionFilterExpr.h b/internal/core/src/exec/expression/GISFunctionFilterExpr.h index e63bfc89ef..34bdf67986 100644 --- a/internal/core/src/exec/expression/GISFunctionFilterExpr.h +++ b/internal/core/src/exec/expression/GISFunctionFilterExpr.h @@ -56,6 +56,18 @@ class PhyGISFunctionFilterExpr : public SegmentExpr { return expr_->column_; } + std::string + ToString() const { + return fmt::format("{}", expr_->ToString()); + } + + void + MoveCursor() { + if (segment_->type() == SegmentType::Sealed) { + SegmentExpr::MoveCursor(); + } + } + private: VectorPtr EvalForIndexSegment(); diff --git a/internal/core/src/segcore/FieldIndexing.cpp b/internal/core/src/segcore/FieldIndexing.cpp index b45b0179df..282f28fa16 100644 --- a/internal/core/src/segcore/FieldIndexing.cpp +++ b/internal/core/src/segcore/FieldIndexing.cpp @@ -531,16 +531,14 @@ ScalarFieldIndexing::process_geometry_data(int64_t reserved_offset, // Use the accessor to get geometry data and validity auto [wkb_data, is_valid] = accessor(i); - if (is_valid) { - try { - rtree_index->AddGeometry(wkb_data, global_offset); - added_count++; - } catch (std::exception& error) { - ThrowInfo(UnexpectedError, - "Failed to add geometry at offset {}: {}", - global_offset, - error.what()); - } + try { + rtree_index->AddGeometry(wkb_data, global_offset); + added_count++; + } catch (std::exception& error) { + ThrowInfo(UnexpectedError, + "Failed to add geometry at offset {}: {}", + global_offset, + error.what()); } }