Test grammar for variable length with filters

Summary: Update Cypher grammar to pickup properties after range

Reviewers: mislav.bradac, florijan

Reviewed By: mislav.bradac

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D578
This commit is contained in:
Teon Banek 2017-07-20 15:31:20 +02:00
parent f02c658ed4
commit 20f2c885c8
2 changed files with 55 additions and 2 deletions

View File

@ -116,7 +116,9 @@ relationshipPattern : ( leftArrowHead SP? dash SP? relationshipDetail? SP? dash
| ( dash SP? relationshipDetail? SP? dash )
;
relationshipDetail : '[' SP? ( variable SP? )? ( relationshipTypes SP? )? rangeLiteral? ( properties SP? )? ']' ;
relationshipDetail : '[' SP? ( variable SP? )? ( relationshipTypes SP? )? ( rangeLiteral SP? )? properties SP? ']'
| '[' SP? ( variable SP? )? ( relationshipTypes SP? )? ( rangeLiteral SP? )? ( properties SP? )? ']'
;
properties : mapLiteral
| parameter
@ -128,7 +130,7 @@ nodeLabels : nodeLabel ( SP? nodeLabel )* ;
nodeLabel : ':' SP? labelName ;
rangeLiteral : '*' SP? ( expression SP? )? ( '..' SP? ( expression SP? )? )? ;
rangeLiteral : '*' SP? ( expression SP? )? ( '..' ( SP? expression )? )? ;
labelName : symbolicName ;

View File

@ -985,6 +985,57 @@ TYPED_TEST(CypherMainVisitorTest, RelationshipPatternFloatingUpperBound) {
EXPECT_EQ(upper_bound->value_.Value<double>(), 0.2);
}
TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUnboundedWithProperty) {
TypeParam ast_generator("MATCH ()-[r* {prop: 42}]->() RETURN r");
auto *query = ast_generator.query_;
auto *match = dynamic_cast<Match *>(query->clauses_[0]);
EdgeAtom *edge = nullptr;
AssertMatchSingleEdgeAtom(match, edge);
EXPECT_EQ(edge->direction_, EdgeAtom::Direction::OUT);
EXPECT_TRUE(edge->has_range_);
EXPECT_EQ(edge->lower_bound_, nullptr);
EXPECT_EQ(edge->upper_bound_, nullptr);
auto prop = ast_generator.db_accessor_->property("prop");
auto prop_literal = dynamic_cast<PrimitiveLiteral *>(edge->properties_[prop]);
EXPECT_EQ(prop_literal->value_.Value<int64_t>(), 42);
}
TYPED_TEST(CypherMainVisitorTest,
RelationshipPatternDotsUnboundedWithEdgeTypeProperty) {
TypeParam ast_generator("MATCH ()-[r:edge_type*..{prop: 42}]->() RETURN r");
auto *query = ast_generator.query_;
auto *match = dynamic_cast<Match *>(query->clauses_[0]);
EdgeAtom *edge = nullptr;
AssertMatchSingleEdgeAtom(match, edge);
EXPECT_EQ(edge->direction_, EdgeAtom::Direction::OUT);
EXPECT_TRUE(edge->has_range_);
EXPECT_EQ(edge->lower_bound_, nullptr);
EXPECT_EQ(edge->upper_bound_, nullptr);
auto prop = ast_generator.db_accessor_->property("prop");
auto prop_literal = dynamic_cast<PrimitiveLiteral *>(edge->properties_[prop]);
EXPECT_EQ(prop_literal->value_.Value<int64_t>(), 42);
ASSERT_EQ(edge->edge_types_.size(), 1U);
auto edge_type = ast_generator.db_accessor_->edge_type("edge_type");
EXPECT_EQ(edge->edge_types_[0], edge_type);
}
TYPED_TEST(CypherMainVisitorTest, RelationshipPatternUpperBoundedWithProperty) {
TypeParam ast_generator("MATCH ()-[r*..2{prop: 42}]->() RETURN r");
auto *query = ast_generator.query_;
auto *match = dynamic_cast<Match *>(query->clauses_[0]);
EdgeAtom *edge = nullptr;
AssertMatchSingleEdgeAtom(match, edge);
EXPECT_EQ(edge->direction_, EdgeAtom::Direction::OUT);
EXPECT_TRUE(edge->has_range_);
EXPECT_EQ(edge->lower_bound_, nullptr);
auto upper_bound = dynamic_cast<PrimitiveLiteral *>(edge->upper_bound_);
ASSERT_TRUE(upper_bound);
EXPECT_EQ(upper_bound->value_.Value<int64_t>(), 2);
auto prop = ast_generator.db_accessor_->property("prop");
auto prop_literal = dynamic_cast<PrimitiveLiteral *>(edge->properties_[prop]);
EXPECT_EQ(prop_literal->value_.Value<int64_t>(), 42);
}
// // PatternPart with variable.
// TYPED_TEST(CypherMainVisitorTest, PatternPartVariable) {
// ParserTables parser("CREATE var=()--()");