mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-06 17:18:35 +08:00
fix: [2.5] Fix filter geometry for growing with mmap (#45466)
issue: #45450 master pr: #45464 Signed-off-by: Cai Zhang <cai.zhang@zilliz.com>
This commit is contained in:
parent
9845667244
commit
1d6786545b
@ -148,76 +148,101 @@ PhyGISFunctionFilterExpr::EvalForDataSegment() {
|
||||
Geometry(segment_->get_ctx(), expr_->geometry_wkt_.c_str());
|
||||
|
||||
// Choose underlying data type according to segment type to avoid element
|
||||
// size mismatch: Sealed segment variable column stores std::string_view;
|
||||
// Growing segment stores std::string.
|
||||
using SealedType = std::string_view;
|
||||
using GrowingType = std::string;
|
||||
|
||||
// size mismatch: Sealed segments and growing segments with mmap use std::string_view;
|
||||
// Growing segments without mmap use std::string.
|
||||
switch (expr_->op_) {
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Equals: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType, equals);
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string, equals);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType, equals);
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
equals);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Touches: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType, touches);
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string,
|
||||
touches);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType,
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
touches);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Overlaps: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType,
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string,
|
||||
overlaps);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType,
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
overlaps);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Crosses: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType, crosses);
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string,
|
||||
crosses);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType,
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
crosses);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Contains: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType,
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string,
|
||||
contains);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType,
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
contains);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Intersects: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType,
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string,
|
||||
intersects);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType,
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
intersects);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_Within: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(SealedType, within);
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string, within);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(GrowingType, within);
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON(std::string_view,
|
||||
within);
|
||||
}
|
||||
}
|
||||
case proto::plan::GISFunctionFilterExpr_GISOp_DWithin: {
|
||||
if (segment_->type() == SegmentType::Sealed) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON_DISTANCE(SealedType,
|
||||
if (segment_->type() == SegmentType::Growing &&
|
||||
!storage::MmapManager::GetInstance()
|
||||
.GetMmapConfig()
|
||||
.growing_enable_mmap) {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON_DISTANCE(std::string,
|
||||
dwithin);
|
||||
} else {
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON_DISTANCE(GrowingType,
|
||||
dwithin);
|
||||
GEOMETRY_EXECUTE_SUB_BATCH_WITH_COMPARISON_DISTANCE(
|
||||
std::string_view, dwithin);
|
||||
}
|
||||
}
|
||||
default: {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user