From 708e426bb3e49b6d043e2a74ea3b82eb7cbcdee0 Mon Sep 17 00:00:00 2001 From: zhagnlu <1542303831@qq.com> Date: Thu, 31 Jul 2025 10:35:37 +0800 Subject: [PATCH] enhance: using set element for string term type (#43049) issue: #43048 Signed-off-by: luzhang Co-authored-by: luzhang --- internal/core/conanfile.py | 1 + internal/core/src/exec/expression/Element.h | 61 ++++++++++++++++++- .../core/src/exec/expression/TermExpr.cpp | 10 +-- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/internal/core/conanfile.py b/internal/core/conanfile.py index fd91d7f10b..664b30d29c 100644 --- a/internal/core/conanfile.py +++ b/internal/core/conanfile.py @@ -47,6 +47,7 @@ class MilvusConan(ConanFile): "rapidjson/cci.20230929#624c0094d741e6a3749d2e44d834b96c", "simde/0.8.2#5e1edfd5cba92f25d79bf6ef4616b972", "xxhash/0.8.3#199e63ab9800302c232d030b27accec0", + "unordered_dense/4.4.0#6a855c992618cc4c63019109a2e47298", ) generators = ("cmake", "cmake_find_package") default_options = { diff --git a/internal/core/src/exec/expression/Element.h b/internal/core/src/exec/expression/Element.h index 7239ae82e3..75b475b8c6 100644 --- a/internal/core/src/exec/expression/Element.h +++ b/internal/core/src/exec/expression/Element.h @@ -27,6 +27,7 @@ #include "exec/QueryContext.h" #include "expr/ITypeExpr.h" #include "query/PlanProto.h" +#include "ankerl/unordered_dense.h" namespace milvus { namespace exec { @@ -243,6 +244,7 @@ class SetElement : public MultiElement { if (std::holds_alternative(value)) { return values_.count(std::get(value)) > 0; } + return false; } void @@ -256,7 +258,64 @@ class SetElement : public MultiElement { } public: - std::set values_; + ankerl::unordered_dense::set values_; +}; + +template <> +class SetElement : public MultiElement { + public: + explicit SetElement(const std::vector& values) { + for (auto& value : values) { + bool v = GetValueFromProto(value); + if (v) { + contains_true = true; + } else { + contains_false = true; + } + } + } + + explicit SetElement(const std::vector& values) { + for (const auto& value : values) { + if (value) { + contains_true = true; + } else { + contains_false = true; + } + } + } + + bool + Empty() const override { + return !contains_true && !contains_false; + } + + bool + In(const ValueType& value) const override { + if (std::holds_alternative(value)) { + bool v = std::get(value); + return (v && contains_true) || (!v && contains_false); + } + return false; + } + + void + AddElement(const bool& value) { + if (value) { + contains_true = true; + } else { + contains_false = true; + } + } + + size_t + Size() const override { + return (contains_true ? 1 : 0) + (contains_false ? 1 : 0); + } + + private: + bool contains_true = false; + bool contains_false = false; }; } //namespace exec diff --git a/internal/core/src/exec/expression/TermExpr.cpp b/internal/core/src/exec/expression/TermExpr.cpp index fe6fd9c950..e473dbd9b6 100644 --- a/internal/core/src/exec/expression/TermExpr.cpp +++ b/internal/core/src/exec/expression/TermExpr.cpp @@ -361,7 +361,7 @@ PhyTermFilterExpr::ExecTermArrayFieldInVariable(EvalCtx& context) { index = std::stoi(expr_->column_.nested_path_[0]); } if (!arg_inited_) { - arg_set_ = std::make_shared>(expr_->vals_); + arg_set_ = std::make_shared>(expr_->vals_); arg_inited_ = true; } @@ -538,10 +538,10 @@ PhyTermFilterExpr::ExecJsonInVariableByKeyIndex() { auto pointer = milvus::Json::pointer(expr_->column_.nested_path_); if (!arg_inited_) { - arg_set_ = std::make_shared>(expr_->vals_); + arg_set_ = std::make_shared>(expr_->vals_); if constexpr (std::is_same_v) { arg_set_float_ = - std::make_shared>(expr_->vals_); + std::make_shared>(expr_->vals_); } arg_inited_ = true; } @@ -740,7 +740,7 @@ PhyTermFilterExpr::ExecTermJsonFieldInVariable(EvalCtx& context) { auto pointer = milvus::Json::pointer(expr_->column_.nested_path_); if (!arg_inited_) { - arg_set_ = std::make_shared>(expr_->vals_); + arg_set_ = std::make_shared>(expr_->vals_); arg_inited_ = true; } @@ -930,7 +930,7 @@ PhyTermFilterExpr::ExecVisitorImplForData(EvalCtx& context) { vals.emplace_back(converted_val); } } - arg_set_ = std::make_shared>(vals); + arg_set_ = std::make_shared>(vals); arg_inited_ = true; }