feat: Extend parsing to field impressions (#1154)

feat: Extend parsing to field impressions.

Add search_parser_test to PR tests.

Signed-off-by: Roman Gershman <roman@dragonflydb.io>
This commit is contained in:
Roman Gershman 2023-04-28 13:34:03 +02:00 committed by GitHub
parent 0651339f79
commit 494ca14e4e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 11 deletions

View file

@ -1,5 +1,3 @@
# apt install libfl-dev
gen_flex(lexer)
gen_bison(parser)
@ -7,4 +5,4 @@ cur_gen_dir(gen_dir)
add_library(query_parser query_driver.cc ${gen_dir}/parser.cc ${gen_dir}/lexer.cc)
target_link_libraries(query_parser base absl::strings TRDP::reflex)
cxx_test(search_parser_test query_parser)
cxx_test(search_parser_test query_parser LABELS DFLY)

View file

@ -53,9 +53,11 @@ term_char [_]|\w
"(" return Parser::make_LPAREN (loc());
")" return Parser::make_RPAREN (loc());
"*" return Parser::make_STAR (loc());
"~" return Parser::make_NOT_OP (loc());
"-" return Parser::make_NOT_OP (loc());
":" return Parser::make_COLON (loc());
"=>" return Parser::make_ARROW (loc());
"[" return Parser::make_LBRACKET (loc());
"]" return Parser::make_RBRACKET (loc());
-?[0-9]+ return make_INT64(matched_view(), loc());

View file

@ -46,14 +46,18 @@ using namespace std;
STAR "*"
ARROW "=>"
COLON ":"
NOT_OP "~"
LBRACKET "["
RBRACKET "]"
;
%token YYEOF
%precedence NOT_OP
// Needed 0 at the end to satisfy bison 3.5.1
%token YYEOF 0
%token <std::string> TERM "term" PARAM "param" FIELD "field"
%token <int64_t> INT64 "int64"
%nterm <AstExpr> search_expr
%nterm <AstExpr> search_expr field_filter field_cond range_value term_list opt_neg_term
%printer { yyo << $$; } <*>;
@ -64,9 +68,25 @@ query:
| query search_expr
;
search_expr: TERM {
cout << $1 << endl;
}
search_expr:
LPAREN search_expr RPAREN { $$ = $2; }
| NOT_OP search_expr { $$ = AstExpr{}; };
| TERM { }
| field_filter;
field_filter:
FIELD COLON field_cond { $$ = AstExpr{}; }
field_cond: term_list | range_value
range_value: LBRACKET INT64 INT64 RBRACKET { $$ = AstExpr{}; }
term_list:
opt_neg_term |
LPAREN term_list opt_neg_term RPAREN { };
opt_neg_term:
TERM { } | NOT_OP TERM { $$ = AstExpr{}; };
%%

View file

@ -47,6 +47,16 @@ class SearchParserTest : public ::testing::Test {
auto tok = Lex(); \
ASSERT_EQ(tok.type_get(), Parser::token::tok_enum); \
}
#define NEXT_ERROR() \
{ \
bool caught = false; \
try { \
auto tok = Lex(); \
} catch (const Parser::syntax_error& e) { \
caught = true; \
} \
ASSERT_TRUE(caught); \
}
TEST_F(SearchParserTest, Scanner) {
SetInput("ab cd");
@ -76,10 +86,18 @@ TEST_F(SearchParserTest, Scanner) {
SetInput("почтальон Печкин");
NEXT_EQ(TOK_TERM, string, "почтальон");
NEXT_EQ(TOK_TERM, string, "Печкин");
SetInput("18446744073709551616");
NEXT_ERROR();
}
TEST_F(SearchParserTest, Parse) {
EXPECT_EQ(0, Parse(" foo "));
EXPECT_EQ(0, Parse(" foo bar (baz) "));
EXPECT_EQ(0, Parse(" -(foo) @foo:bar @ss:[1 2]"));
EXPECT_EQ(1, Parse(" -(foo "));
EXPECT_EQ(1, Parse(" foo:bar "));
EXPECT_EQ(1, Parse(" @foo:@bar "));
EXPECT_EQ(1, Parse(" @foo: "));
}
} // namespace search