Query::Plan::CreateExpand frame bugfix

Summary: CreateExpand now puts both node and edge on the frame. This is not unit-tested because it would require an infrastructure change, and the code is quite simple.

Reviewers: teon.banek, buda, mislav.bradac

Reviewed By: buda

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D187
This commit is contained in:
florijan 2017-03-27 14:42:33 +02:00
parent 1280e77fd3
commit 34cdbc2f39
2 changed files with 9 additions and 5 deletions
src/query/frontend/logical
tests/unit

View File

@ -167,10 +167,10 @@ class CreateExpand : public LogicalOperator {
// create an edge between the two nodes
switch (self_.edge_atom_->direction_) {
case EdgeAtom::Direction::LEFT:
CreateEdge(v2, v1, evaluator);
CreateEdge(v2, v1, frame, symbol_table, evaluator);
break;
case EdgeAtom::Direction::RIGHT:
CreateEdge(v1, v2, evaluator);
CreateEdge(v1, v2, frame, symbol_table, evaluator);
break;
case EdgeAtom::Direction::BOTH:
permanent_fail("Undefined direction not allowed in create");
@ -208,20 +208,22 @@ class CreateExpand : public LogicalOperator {
}
/**
* Helper function for creating an edge.
* Helper function for creating an edge and adding it
* to the frame.
*
* @param from Origin vertex of the edge.
* @param to Destination vertex of the edge.
* @param evaluator Expression evaluator for property value eval.
*/
void CreateEdge(VertexAccessor &from, VertexAccessor &to,
ExpressionEvaluator &evaluator) {
void CreateEdge(VertexAccessor &from, VertexAccessor &to, Frame &frame,
SymbolTable &symbol_table, ExpressionEvaluator &evaluator) {
EdgeAccessor edge =
db_.insert_edge(from, to, self_.edge_atom_->edge_types_[0]);
for (auto kv : self_.edge_atom_->properties_) {
kv.second->Accept(evaluator);
edge.PropsSet(kv.first, evaluator.PopBack());
}
frame[symbol_table[*self_.edge_atom_->identifier_]] = edge;
};
};

View File

@ -349,6 +349,7 @@ TEST(Interpreter, CreateExpand) {
symbol_table[*m->identifier_] = symbol_table.CreateSymbol("m");
auto r = EDGE("r", EdgeAtom::Direction::RIGHT);
symbol_table[*r->identifier_] = symbol_table.CreateSymbol("r");
r->edge_types_.emplace_back(edge_type);
r->properties_[property] = LITERAL(3);
@ -452,6 +453,7 @@ TEST(Interpreter, MatchCreateExpand) {
symbol_table[*m->identifier_] = symbol_table.CreateSymbol("m");
auto r = EDGE("r", EdgeAtom::Direction::RIGHT);
symbol_table[*r->identifier_] = symbol_table.CreateSymbol("r");
r->edge_types_.emplace_back(edge_type);
auto create_expand = std::make_shared<CreateExpand>(