EdgeAccessor::is_cycle added. Query::Plan::Expand fixed
Reviewers: mislav.bradac Reviewed By: mislav.bradac Differential Revision: https://phabricator.memgraph.io/D262
This commit is contained in:
parent
593e4e72b9
commit
1273cea870
@ -242,6 +242,12 @@ bool Expand::ExpandCursor::Pull(Frame &frame, const SymbolTable &symbol_table) {
|
|||||||
// attempt to get a value from the outgoing edges
|
// attempt to get a value from the outgoing edges
|
||||||
if (out_edges_ && *out_edges_it_ != out_edges_->end()) {
|
if (out_edges_ && *out_edges_it_ != out_edges_->end()) {
|
||||||
EdgeAccessor edge = *(*out_edges_it_)++;
|
EdgeAccessor edge = *(*out_edges_it_)++;
|
||||||
|
// when expanding in EdgeAtom::Direction::BOTH directions
|
||||||
|
// we should do only one expansion for cycles, and it was
|
||||||
|
// already done in the block above
|
||||||
|
if (self_.edge_atom_->direction_ == EdgeAtom::Direction::BOTH &&
|
||||||
|
edge.is_cycle())
|
||||||
|
continue;
|
||||||
if (HandleEdgeCycle(edge, frame, symbol_table) &&
|
if (HandleEdgeCycle(edge, frame, symbol_table) &&
|
||||||
PullNode(edge, EdgeAtom::Direction::RIGHT, frame, symbol_table))
|
PullNode(edge, EdgeAtom::Direction::RIGHT, frame, symbol_table))
|
||||||
return true;
|
return true;
|
||||||
|
@ -15,6 +15,9 @@ VertexAccessor EdgeAccessor::from() const {
|
|||||||
VertexAccessor EdgeAccessor::to() const {
|
VertexAccessor EdgeAccessor::to() const {
|
||||||
return VertexAccessor(current().to_, db_accessor());
|
return VertexAccessor(current().to_, db_accessor());
|
||||||
}
|
}
|
||||||
|
bool EdgeAccessor::is_cycle() const {
|
||||||
|
return ¤t().to_ == ¤t().from_;
|
||||||
|
}
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &os, const EdgeAccessor &ea) {
|
std::ostream &operator<<(std::ostream &os, const EdgeAccessor &ea) {
|
||||||
os << "E[" << ea.db_accessor().edge_type_name(ea.edge_type());
|
os << "E[" << ea.db_accessor().edge_type_name(ea.edge_type());
|
||||||
|
@ -38,7 +38,9 @@ class EdgeAccessor : public RecordAccessor<Edge> {
|
|||||||
*/
|
*/
|
||||||
VertexAccessor to() const;
|
VertexAccessor to() const;
|
||||||
|
|
||||||
// void remove();
|
/** Returns true if this edge is a cycle (start and end node are
|
||||||
|
* the same. */
|
||||||
|
bool is_cycle() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream &operator<<(std::ostream &, const EdgeAccessor &);
|
std::ostream &operator<<(std::ostream &, const EdgeAccessor &);
|
||||||
|
@ -314,6 +314,25 @@ TEST(QueryPlan, ExpandEdgeCycle) {
|
|||||||
test_cycle(false, 6);
|
test_cycle(false, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(QueryPlan, ExpandBothCycleEdgeCase) {
|
||||||
|
// we're testing that expanding on BOTH
|
||||||
|
// does only one expansion for a cycle
|
||||||
|
Dbms dbms;
|
||||||
|
auto dba = dbms.active();
|
||||||
|
|
||||||
|
auto v = dba->insert_vertex();
|
||||||
|
dba->insert_edge(v, v, dba->edge_type("et"));
|
||||||
|
dba->advance_command();
|
||||||
|
|
||||||
|
AstTreeStorage storage;
|
||||||
|
SymbolTable symbol_table;
|
||||||
|
|
||||||
|
auto n = MakeScanAll(storage, symbol_table, "n");
|
||||||
|
auto r_ = MakeExpand(storage, symbol_table, n.op_, n.sym_, "r",
|
||||||
|
EdgeAtom::Direction::BOTH, false, "_", false);
|
||||||
|
EXPECT_EQ(1, PullAll(r_.op_, *dba, symbol_table));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(QueryPlan, EdgeFilter) {
|
TEST(QueryPlan, EdgeFilter) {
|
||||||
Dbms dbms;
|
Dbms dbms;
|
||||||
auto dba = dbms.active();
|
auto dba = dbms.active();
|
||||||
|
@ -202,6 +202,19 @@ TEST(RecordAccessor, EdgeType) {
|
|||||||
EXPECT_NE(edge.edge_type(), hates);
|
EXPECT_NE(edge.edge_type(), hates);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(RecordAccessor, EdgeIsCycle) {
|
||||||
|
Dbms dbms;
|
||||||
|
auto dba = dbms.active();
|
||||||
|
auto v1 = dba->insert_vertex();
|
||||||
|
auto v2 = dba->insert_vertex();
|
||||||
|
auto likes = dba->edge_type("edge_type");
|
||||||
|
|
||||||
|
EXPECT_TRUE(dba->insert_edge(v1, v1, likes).is_cycle());
|
||||||
|
EXPECT_TRUE(dba->insert_edge(v2, v2, likes).is_cycle());
|
||||||
|
EXPECT_FALSE(dba->insert_edge(v1, v2, likes).is_cycle());
|
||||||
|
EXPECT_FALSE(dba->insert_edge(v2, v1, likes).is_cycle());
|
||||||
|
}
|
||||||
|
|
||||||
TEST(RecordAccessor, VertexEdgeConnections) {
|
TEST(RecordAccessor, VertexEdgeConnections) {
|
||||||
Dbms dbms;
|
Dbms dbms;
|
||||||
auto dba = dbms.active();
|
auto dba = dbms.active();
|
||||||
|
Loading…
Reference in New Issue
Block a user