diff --git a/src/graph/planner/plan/PlanNodeVisitor.h b/src/graph/planner/plan/PlanNodeVisitor.h index eb8b6d8d0da..1394bba5231 100644 --- a/src/graph/planner/plan/PlanNodeVisitor.h +++ b/src/graph/planner/plan/PlanNodeVisitor.h @@ -22,6 +22,7 @@ class PlanNodeVisitor { virtual void visit(Aggregate *node) = 0; virtual void visit(Traverse *node) = 0; virtual void visit(AppendVertices *node) = 0; + virtual void visit(Dedup *node) = 0; virtual void visit(BiJoin *node) = 0; }; diff --git a/src/graph/planner/plan/Query.cpp b/src/graph/planner/plan/Query.cpp index 978a385ddab..f3d3301e4f1 100644 --- a/src/graph/planner/plan/Query.cpp +++ b/src/graph/planner/plan/Query.cpp @@ -544,6 +544,10 @@ Dedup::Dedup(QueryContext* qctx, PlanNode* input) : SingleInputNode(qctx, Kind:: copyInputColNames(input); } +void Dedup::accept(PlanNodeVisitor* visitor) { + visitor->visit(this); +} + PlanNode* Dedup::clone() const { auto* newDedup = Dedup::make(qctx_, nullptr); newDedup->cloneMembers(*this); diff --git a/src/graph/planner/plan/Query.h b/src/graph/planner/plan/Query.h index 55f3f564ff9..206f1452485 100644 --- a/src/graph/planner/plan/Query.h +++ b/src/graph/planner/plan/Query.h @@ -1168,6 +1168,8 @@ class Dedup final : public SingleInputNode { return qctx->objPool()->add(new Dedup(qctx, input)); } + void accept(PlanNodeVisitor* visitor) override; + PlanNode* clone() const override; private: diff --git a/src/graph/visitor/PropertyTrackerVisitor.cpp b/src/graph/visitor/PropertyTrackerVisitor.cpp index 99e62836579..f12871829b9 100644 --- a/src/graph/visitor/PropertyTrackerVisitor.cpp +++ b/src/graph/visitor/PropertyTrackerVisitor.cpp @@ -27,10 +27,16 @@ Status PropertyTracker::update(const std::string &oldName, const std::string &ne return Status::Error("Duplicated property name: %s", oldName.c_str()); } if (hasNodeAlias) { + if (vertexPropsMap.find(newName) != vertexPropsMap.end()) { + return Status::Error("Property name %s conflicted with %s", newName.c_str(), oldName.c_str()); + } vertexPropsMap[newName] = std::move(it1->second); vertexPropsMap.erase(it1); } if (hasEdgeAlias) { + if (edgePropsMap.find(newName) != edgePropsMap.end()) { + return Status::Error("Property name %s conflicted with %s", newName.c_str(), oldName.c_str()); + } edgePropsMap[newName] = std::move(it2->second); edgePropsMap.erase(it2); } diff --git a/src/graph/visitor/PrunePropertiesVisitor.cpp b/src/graph/visitor/PrunePropertiesVisitor.cpp index 6207b107c22..55a72775509 100644 --- a/src/graph/visitor/PrunePropertiesVisitor.cpp +++ b/src/graph/visitor/PrunePropertiesVisitor.cpp @@ -207,7 +207,9 @@ void PrunePropertiesVisitor::visit(AppendVertices *node) { if (node->vFilter() != nullptr) { status_ = extractPropsFromExpr(node->vFilter(), nodeAlias); - return; + if (!status_.ok()) { + return; + } } auto *vertexProps = node->props(); if (vertexProps != nullptr) { @@ -250,6 +252,14 @@ void PrunePropertiesVisitor::visit(AppendVertices *node) { status_ = depsPruneProperties(node->dependencies()); } +void PrunePropertiesVisitor::visit(Dedup *node) { + const auto &colNames = qctx_->symTable()->getVar(node->inputVar())->colNames; + for (auto &colName : colNames) { + propsUsed_.colsSet.insert(colName); + } + status_ = depsPruneProperties(node->dependencies()); +} + void PrunePropertiesVisitor::visit(BiJoin *node) { for (auto *hashKey : node->hashKeys()) { status_ = extractPropsFromExpr(hashKey); @@ -269,6 +279,9 @@ void PrunePropertiesVisitor::visit(BiJoin *node) { Status PrunePropertiesVisitor::depsPruneProperties(std::vector &dependencies) { for (const auto *dep : dependencies) { const_cast(dep)->accept(this); + if (!status_.ok()) { + return status_; + } } return Status::OK(); } diff --git a/src/graph/visitor/PrunePropertiesVisitor.h b/src/graph/visitor/PrunePropertiesVisitor.h index a0a04c8ee50..54c2a3b90d0 100644 --- a/src/graph/visitor/PrunePropertiesVisitor.h +++ b/src/graph/visitor/PrunePropertiesVisitor.h @@ -34,6 +34,7 @@ class PrunePropertiesVisitor final : public PlanNodeVisitor { void visit(Aggregate *node) override; void visit(Traverse *node) override; void visit(AppendVertices *node) override; + void visit(Dedup *node) override; void visit(BiJoin *node) override; private: