Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
andyfengHKU committed Aug 6, 2023
1 parent eee36b9 commit e2c8113
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 6 deletions.
9 changes: 8 additions & 1 deletion src/binder/visitor/property_collector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,14 @@ void PropertyCollector::visitCreate(const BoundUpdatingClause& updatingClause) {

void PropertyCollector::visitMerge(const BoundUpdatingClause& updatingClause) {
auto& boundMergeClause = (BoundMergeClause&)updatingClause;
collectPropertyExpressions(boundMergeClause.getPredicate());
for (auto& rel : boundMergeClause.getQueryGraphCollection()->getQueryRels()) {
if (rel->getRelType() == common::QueryRelType::NON_RECURSIVE) {
properties.insert(rel->getInternalIDProperty());
}
}
if (boundMergeClause.hasPredicate()) {
collectPropertyExpressions(boundMergeClause.getPredicate());
}
for (auto& info : boundMergeClause.getCreateInfosRef()) {
for (auto& setItem : info->setItems) {
collectPropertyExpressions(setItem.second);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class BoundMergeClause : public BoundUpdatingClause {
inline QueryGraphCollection* getQueryGraphCollection() const {
return queryGraphCollection.get();
}
inline bool hasPredicate() const { return predicate != nullptr; }
inline std::shared_ptr<Expression> getPredicate() const { return predicate; }

inline const std::vector<std::unique_ptr<BoundCreateInfo>>& getCreateInfosRef() const {
Expand Down
1 change: 1 addition & 0 deletions src/optimizer/projection_push_down_optimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ void ProjectionPushDownOptimizer::visitDeleteRel(planner::LogicalOperator* op) {
// TODO(Xiyang): come back and refactor this after changing insert interface
void ProjectionPushDownOptimizer::visitMerge(planner::LogicalOperator* op) {
auto merge = (LogicalMerge*)op;
collectExpressionsInUse(merge->getMark());
for (auto& info : merge->getCreateNodeInfosRef()) {
if (info->primaryKey != nullptr) {
collectExpressionsInUse(info->primaryKey);
Expand Down
10 changes: 8 additions & 2 deletions src/planner/plan/plan_update.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,16 @@ void QueryPlanner::planCreateClause(
void QueryPlanner::planMergeClause(binder::BoundUpdatingClause& updatingClause, LogicalPlan& plan) {
auto& mergeClause = (BoundMergeClause&)updatingClause;
auto queryGraphCollection = mergeClause.getQueryGraphCollection();
auto predicates = mergeClause.getPredicate()->splitOnAND();
binder::expression_vector predicates;
if (mergeClause.hasPredicate()) {
predicates = mergeClause.getPredicate()->splitOnAND();
}
planOptionalMatch(*mergeClause.getQueryGraphCollection(), predicates, plan);
// TODO(Xiyang): fix mark
auto mark = queryGraphCollection->getQueryNodes()[0]->getInternalIDProperty();
auto rels = queryGraphCollection->getQueryRels();
auto nodes = queryGraphCollection->getQueryNodes();
auto mark =
!rels.empty() ? rels[0]->getInternalIDProperty() : nodes[0]->getInternalIDProperty();
std::vector<std::unique_ptr<LogicalCreateNodeInfo>> logicalCreateNodeInfos;
std::vector<std::unique_ptr<LogicalSetPropertyInfo>> logicalCreateNodeSetInfos;
if (mergeClause.hasCreateNodeInfo()) {
Expand Down
15 changes: 12 additions & 3 deletions test/test_files/tinysnb/update_node/merge.test
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
--

-CASE Merge1
-SKIP
-STATEMENT MERGE (:person {ID:0})
---- ok
-STATEMENT MATCH (a:person) RETURN COUNT(*)
Expand Down Expand Up @@ -34,8 +33,18 @@ Alice|35
-STATEMENT MERGE (:person {ID:1, age:10})
---- error
Runtime exception: A node is created with an existed primary key 1, which violates the uniqueness constraint of the primary key property.
-STATEMENT MERGE (a:person {ID:11, age:10}) ON MATCH SET a.age = 20, a.fName = 'aaaa'
-STATEMENT MERGE (a:person {ID:11, fName:'bb', age:10})
---- ok
-STATEMENT MATCH (a:person) WHERE a.ID = 11 RETURN a.ID, a.fName, a.age
---- 1
1
11|bb|10
-STATEMENT MERGE (a:person {ID:11, fName:'bb', age:10}) ON MATCH SET a.age = 20, a.fName = 'aaaa'
---- ok
-STATEMENT MATCH (a:person) WHERE a.ID = 11 RETURN a.ID, a.fName, a.age
---- 1
11|aaaa|20
-STATEMENT MERGE (a:person {ID:12, fName:'bb', age:10}) ON CREATE SET a.age = 20, a.fName = 'aaaa'
---- ok
-STATEMENT MATCH (a:person) WHERE a.ID = 12 RETURN a.ID, a.fName, a.age
---- 1
12|aaaa|20
31 changes: 31 additions & 0 deletions test/test_files/tinysnb/update_rel/merge.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
-GROUP TinySnbUpdateRelTest
-DATASET CSV tinysnb

--

-CASE Merge1
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 5 MATCH (a)-[r:knows]->(b) RETURN id(r), r.date
---- 1
3:2|2021-06-30
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 5 MERGE (a)-[r:knows]->(b) RETURN id(r), r.date
---- 1
3:2|2021-06-30
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 5 MERGE (a)-[r:knows {date: date('2022-02-02')}]->(b)
---- ok
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 5 MATCH (a)-[r:knows]->(b) RETURN id(r), r.date
---- 2
3:14|2022-02-02
3:2|2021-06-30
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 5 MERGE (a)-[r:knows {date: date('2022-02-02')}]->(b) ON MATCH SET r.date = date('2011-11-11')
---- ok
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 5 MATCH (a)-[r:knows]->(b) RETURN id(r), r.date
---- 2
3:14|2011-11-11
3:2|2021-06-30

# TODO(Xiyang): ON CREATE SET is not working as expected.
-CASE Merge2
-SKIP
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 7 MERGE (a)-[r:knows]->(b) ON CREATE SET a.age = 0, r.date = date('2011-12-12')
---- ok
-STATEMENT MATCH (a:person), (b:person) WHERE a.ID = 0 AND b.ID = 7 MATCH (a)-[r:knows]->(b) RETURN id(r), r.date, a.age

0 comments on commit e2c8113

Please sign in to comment.