This is an automated email from the ASF dual-hosted git repository.
twice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git
The following commit(s) were added to refs/heads/unstable by this push:
new bd8b209f fix(search): make scan/filter executor follow case-sensitive
attribute (#2376)
bd8b209f is described below
commit bd8b209fe06084dd1c814c118ff7544ec7c0a0e6
Author: Twice <[email protected]>
AuthorDate: Fri Jun 28 00:12:38 2024 +0900
fix(search): make scan/filter executor follow case-sensitive attribute
(#2376)
---
src/search/executors/filter_executor.h | 11 +++++++++--
src/search/executors/tag_field_scan_executor.h | 7 +++++--
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/search/executors/filter_executor.h
b/src/search/executors/filter_executor.h
index f668af7d..df14b29b 100644
--- a/src/search/executors/filter_executor.h
+++ b/src/search/executors/filter_executor.h
@@ -76,8 +76,15 @@ struct QueryExprEvaluator {
auto val = GET_OR_RET(ctx->Retrieve(row, v->field->info));
CHECK(val.Is<kqir::StringArray>());
- auto split = val.Get<kqir::StringArray>();
- return std::find(split.begin(), split.end(), v->tag->val) != split.end();
+ auto tags = val.Get<kqir::StringArray>();
+
+ auto meta = v->field->info->MetadataAs<redis::TagFieldMetadata>();
+ if (meta->case_sensitive) {
+ return std::find(tags.begin(), tags.end(), v->tag->val) != tags.end();
+ } else {
+ return std::find_if(tags.begin(), tags.end(),
+ [v](const auto &tag) { return util::EqualICase(tag,
v->tag->val); }) != tags.end();
+ }
}
StatusOr<bool> Visit(NumericCompareExpr *v) const {
diff --git a/src/search/executors/tag_field_scan_executor.h
b/src/search/executors/tag_field_scan_executor.h
index 9eff2e66..946db767 100644
--- a/src/search/executors/tag_field_scan_executor.h
+++ b/src/search/executors/tag_field_scan_executor.h
@@ -29,6 +29,7 @@
#include "storage/redis_db.h"
#include "storage/redis_metadata.h"
#include "storage/storage.h"
+#include "string_util.h"
namespace kqir {
@@ -39,13 +40,15 @@ struct TagFieldScanExecutor : ExecutorNode {
IndexInfo *index;
std::string index_key;
+ bool case_sensitive;
TagFieldScanExecutor(ExecutorContext *ctx, TagFieldScan *scan)
: ExecutorNode(ctx),
scan(scan),
ss(ctx->storage),
index(scan->field->info->index),
- index_key(redis::SearchKey(index->ns, index->name,
scan->field->name).ConstructTagFieldData(scan->tag, {})) {}
+ index_key(redis::SearchKey(index->ns, index->name,
scan->field->name).ConstructTagFieldData(scan->tag, {})),
+
case_sensitive(scan->field->info->MetadataAs<redis::TagFieldMetadata>()->case_sensitive)
{}
bool InRangeDecode(Slice key, Slice *user_key) const {
uint8_t ns_size = 0;
@@ -66,7 +69,7 @@ struct TagFieldScanExecutor : ExecutorNode {
if (value != scan->field->name) return false;
if (!GetSizedString(&key, &value)) return false;
- if (value != scan->tag) return false;
+ if (case_sensitive ? value != scan->tag :
!util::EqualICase(value.ToStringView(), scan->tag)) return false;
if (!GetSizedString(&key, user_key)) return false;