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 84f9a93bd fix(search): support number literal for tag fields (#3096)
84f9a93bd is described below
commit 84f9a93bd8c296638dd5a221502c26cf7d51b7d8
Author: zhenghaoz <[email protected]>
AuthorDate: Thu Aug 7 09:57:51 2025 +0800
fix(search): support number literal for tag fields (#3096)
Co-authored-by: Twice <[email protected]>
---
src/search/redis_query_parser.h | 2 +-
src/search/redis_query_transformer.h | 2 ++
tests/gocase/unit/search/search_test.go | 21 +++++++++++++++++++++
3 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/search/redis_query_parser.h b/src/search/redis_query_parser.h
index 627910a39..b5786950e 100644
--- a/src/search/redis_query_parser.h
+++ b/src/search/redis_query_parser.h
@@ -39,7 +39,7 @@ struct Field : seq<one<'@'>, Identifier> {};
struct Param : seq<one<'$'>, Identifier> {};
-struct Tag : sor<Identifier, StringL, Param> {};
+struct Tag : sor<Identifier, StringL, Param, Number> {};
struct TagList : seq<one<'{'>, WSPad<Tag>, star<seq<one<'|'>, WSPad<Tag>>>,
one<'}'>> {};
struct NumberOrParam : sor<Number, Param> {};
diff --git a/src/search/redis_query_transformer.h
b/src/search/redis_query_transformer.h
index 7cc3a9030..4ff0726f4 100644
--- a/src/search/redis_query_transformer.h
+++ b/src/search/redis_query_transformer.h
@@ -99,6 +99,8 @@ struct Transformer : ir::TreeTransformer {
tag_str = GET_OR_RET(UnescapeString(tag->string()));
} else if (Is<Param>(tag)) {
tag_str = GET_OR_RET(GetParam(tag));
+ } else if (Is<Number>(tag)) {
+ tag_str = tag->string();
} else {
return {Status::NotOK, "encountered invalid tag"};
}
diff --git a/tests/gocase/unit/search/search_test.go
b/tests/gocase/unit/search/search_test.go
index 241cd966f..905094d4e 100644
--- a/tests/gocase/unit/search/search_test.go
+++ b/tests/gocase/unit/search/search_test.go
@@ -233,3 +233,24 @@ func TestSearch(t *testing.T) {
require.Equal(t, "test_expired:k3",
res.Val().([]interface{})[1])
})
}
+
+func TestSearchTag(t *testing.T) {
+ srv := util.StartServer(t, map[string]string{})
+ defer srv.Close()
+
+ ctx := context.Background()
+ rdb := srv.NewClient()
+ defer func() { require.NoError(t, rdb.Close()) }()
+
+ t.Run("FT.SEARCH with number literal tags", func(t *testing.T) {
+ require.NoError(t, rdb.Do(ctx, "FT.CREATE", "testidx_number",
"ON", "HASH", "PREFIX", "1", "testidx_number:", "SCHEMA", "a", "TAG").Err())
+ require.NoError(t, rdb.Do(ctx, "HSET", "testidx_number:k1",
"a", "3.1415926").Err())
+
+ res := rdb.Do(ctx, "FT.SEARCH", "testidx_number",
`@a:{3.1415926}`)
+ require.NoError(t, res.Err())
+ // result should be [1 testidx_number:k1 [a 3.1415926]]
+ require.Equal(t, 3, len(res.Val().([]interface{})))
+ require.Equal(t, int64(1), res.Val().([]interface{})[0])
+ require.Equal(t, "testidx_number:k1",
res.Val().([]interface{})[1])
+ })
+}