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;
 

Reply via email to