mirror of
https://github.com/dragonflydb/dragonfly.git
synced 2025-05-10 18:05:44 +02:00
fix(search_family): Fix query parsing for the integer tags in OR expression (#3544)
fixes dragonflydb#3490 Signed-off-by: Stepan Bagritsevich <stefan@dragonflydb.io>
This commit is contained in:
parent
358c644335
commit
3fd3c40b74
3 changed files with 28 additions and 4 deletions
|
@ -80,6 +80,7 @@ using namespace std;
|
|||
%nterm <bool> opt_lparen
|
||||
%nterm <AstExpr> final_query filter search_expr search_unary_expr search_or_expr search_and_expr numeric_filter_expr
|
||||
%nterm <AstExpr> field_cond field_cond_expr field_unary_expr field_or_expr field_and_expr tag_list
|
||||
%nterm <std::string> tag_list_element
|
||||
|
||||
%nterm <AstKnnNode> knn_query
|
||||
%nterm <std::string> opt_knn_alias
|
||||
|
@ -170,10 +171,13 @@ field_unary_expr:
|
|||
| UINT32 { $$ = AstTermNode(to_string($1)); }
|
||||
|
||||
tag_list:
|
||||
TERM { $$ = AstTagsNode(std::move($1)); }
|
||||
| UINT32 { $$ = AstTagsNode(to_string($1)); }
|
||||
| tag_list OR_OP TERM { $$ = AstTagsNode(std::move($1), std::move($3)); }
|
||||
| tag_list OR_OP DOUBLE { $$ = AstTagsNode(std::move($1), to_string($3)); }
|
||||
tag_list_element { $$ = AstTagsNode(std::move($1)); }
|
||||
| tag_list OR_OP tag_list_element { $$ = AstTagsNode(std::move($1), std::move($3)); }
|
||||
|
||||
tag_list_element:
|
||||
TERM { $$ = std::move($1); }
|
||||
| UINT32 { $$ = to_string($1); }
|
||||
| DOUBLE { $$ = to_string($1); }
|
||||
|
||||
|
||||
%%
|
||||
|
|
|
@ -110,6 +110,10 @@ TEST_F(SearchParserTest, Parse) {
|
|||
EXPECT_EQ(0, Parse(" -(foo) @foo:bar @ss:[1 2]"));
|
||||
EXPECT_EQ(0, Parse("@foo:{ tag1 | tag2 }"));
|
||||
|
||||
EXPECT_EQ(0, Parse("@foo:{1|2}"));
|
||||
EXPECT_EQ(0, Parse("@foo:{1|2.0|4|3.0}"));
|
||||
EXPECT_EQ(0, Parse("@foo:{1|hello|3.0|world|4}"));
|
||||
|
||||
EXPECT_EQ(1, Parse(" -(foo "));
|
||||
EXPECT_EQ(1, Parse(" foo:bar "));
|
||||
EXPECT_EQ(1, Parse(" @foo:@bar "));
|
||||
|
|
|
@ -395,6 +395,22 @@ TEST_F(SearchFamilyTest, TagOptions) {
|
|||
EXPECT_THAT(Run({"ft.search", "i1", "@color:{blue}"}), AreDocIds("d:2", "d:4"));
|
||||
}
|
||||
|
||||
TEST_F(SearchFamilyTest, TagNumbers) {
|
||||
Run({"hset", "d:1", "number", "1"});
|
||||
Run({"hset", "d:2", "number", "2"});
|
||||
Run({"hset", "d:3", "number", "3"});
|
||||
|
||||
EXPECT_EQ(Run({"ft.create", "i1", "on", "hash", "schema", "number", "tag"}), "OK");
|
||||
|
||||
EXPECT_THAT(Run({"ft.search", "i1", "@number:{1}"}), AreDocIds("d:1"));
|
||||
EXPECT_THAT(Run({"ft.search", "i1", "@number:{1|2}"}), AreDocIds("d:1", "d:2"));
|
||||
EXPECT_THAT(Run({"ft.search", "i1", "@number:{1|2|3}"}), AreDocIds("d:1", "d:2", "d:3"));
|
||||
|
||||
EXPECT_THAT(Run({"ft.search", "i1", "@number:{1.0|2|3.0}"}), AreDocIds("d:2"));
|
||||
EXPECT_THAT(Run({"ft.search", "i1", "@number:{1|2|3.0}"}), AreDocIds("d:1", "d:2"));
|
||||
EXPECT_THAT(Run({"ft.search", "i1", "@number:{1|hello|2}"}), AreDocIds("d:1", "d:2"));
|
||||
}
|
||||
|
||||
TEST_F(SearchFamilyTest, Numbers) {
|
||||
for (unsigned i = 0; i <= 10; i++) {
|
||||
for (unsigned j = 0; j <= 10; j++) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue