Add PreVisit method to utils::Visitor
Reviewers: florijan, mislav.bradac Reviewed By: mislav.bradac Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D242
This commit is contained in:
parent
e8fd479bbc
commit
7d0958b1a4
@ -64,11 +64,13 @@ class OrOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
// TODO: Should we short-circuit?
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
// TODO: Should we short-circuit?
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -80,10 +82,12 @@ class XorOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -95,11 +99,13 @@ class AndOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
// TODO: Should we short-circuit?
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
// TODO: Should we short-circuit?
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -111,10 +117,12 @@ class AdditionOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -126,10 +134,12 @@ class SubtractionOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -141,10 +151,12 @@ class MultiplicationOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -156,10 +168,12 @@ class DivisionOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -171,10 +185,12 @@ class ModOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -186,10 +202,12 @@ class NotEqualOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -201,10 +219,12 @@ class EqualOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -216,10 +236,12 @@ class LessOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -231,10 +253,12 @@ class GreaterOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -246,10 +270,12 @@ class LessEqualOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -261,10 +287,12 @@ class GreaterEqualOperator : public BinaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression1_->Accept(visitor);
|
||||
expression2_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -276,9 +304,11 @@ class NotOperator : public UnaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -290,9 +320,11 @@ class UnaryPlusOperator : public UnaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -304,9 +336,11 @@ class UnaryMinusOperator : public UnaryOperator {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -342,9 +376,11 @@ class PropertyLookup : public Expression {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
Expression *expression_ = nullptr;
|
||||
@ -371,9 +407,11 @@ class Aggregation : public UnaryOperator {
|
||||
Op op_;
|
||||
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@ -386,9 +424,11 @@ class NamedExpression : public Tree {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::string name_;
|
||||
@ -418,9 +458,11 @@ class NodeAtom : public PatternAtom {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<GraphDbTypes::Label> labels_;
|
||||
@ -441,9 +483,11 @@ class EdgeAtom : public PatternAtom {
|
||||
enum class Direction { LEFT, RIGHT, BOTH };
|
||||
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
Direction direction_ = Direction::BOTH;
|
||||
@ -469,11 +513,13 @@ class Pattern : public Tree {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &part : atoms_) {
|
||||
part->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &part : atoms_) {
|
||||
part->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
Identifier *identifier_ = nullptr;
|
||||
std::vector<PatternAtom *> atoms_;
|
||||
@ -487,11 +533,13 @@ class Query : public Tree {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &clause : clauses_) {
|
||||
clause->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &clause : clauses_) {
|
||||
clause->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
std::vector<Clause *> clauses_;
|
||||
|
||||
@ -506,11 +554,13 @@ class Create : public Clause {
|
||||
Create(int uid) : Clause(uid) {}
|
||||
std::vector<Pattern *> patterns_;
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &pattern : patterns_) {
|
||||
pattern->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &pattern : patterns_) {
|
||||
pattern->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
};
|
||||
|
||||
@ -519,9 +569,11 @@ class Where : public Tree {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
Expression *expression_ = nullptr;
|
||||
|
||||
@ -535,14 +587,16 @@ class Match : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &pattern : patterns_) {
|
||||
pattern->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &pattern : patterns_) {
|
||||
pattern->Accept(visitor);
|
||||
}
|
||||
if (where_) {
|
||||
where_->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
if (where_) {
|
||||
where_->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
std::vector<Pattern *> patterns_;
|
||||
Where *where_ = nullptr;
|
||||
@ -556,11 +610,13 @@ class Return : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &expr : named_expressions_) {
|
||||
expr->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &expr : named_expressions_) {
|
||||
expr->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
std::vector<NamedExpression *> named_expressions_;
|
||||
|
||||
@ -573,12 +629,14 @@ class With : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &expr : named_expressions_) {
|
||||
expr->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &expr : named_expressions_) {
|
||||
expr->Accept(visitor);
|
||||
}
|
||||
if (where_) where_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
if (where_) where_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
|
||||
bool distinct_ = false;
|
||||
@ -594,11 +652,13 @@ class Delete : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
for (auto &expr : expressions_) {
|
||||
expr->Accept(visitor);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
for (auto &expr : expressions_) {
|
||||
expr->Accept(visitor);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
std::vector<Expression *> expressions_;
|
||||
bool detach_ = false;
|
||||
@ -612,10 +672,12 @@ class SetProperty : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
property_lookup_->Accept(visitor);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
property_lookup_->Accept(visitor);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
PropertyLookup *property_lookup_ = nullptr;
|
||||
Expression *expression_ = nullptr;
|
||||
@ -633,10 +695,12 @@ class SetProperties : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
expression_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
Identifier *identifier_ = nullptr;
|
||||
Expression *expression_ = nullptr;
|
||||
@ -657,9 +721,11 @@ class SetLabels : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
Identifier *identifier_ = nullptr;
|
||||
std::vector<GraphDbTypes::Label> labels_;
|
||||
@ -676,9 +742,11 @@ class RemoveProperty : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
property_lookup_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
property_lookup_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
PropertyLookup *property_lookup_ = nullptr;
|
||||
|
||||
@ -693,9 +761,11 @@ class RemoveLabels : public Clause {
|
||||
|
||||
public:
|
||||
void Accept(TreeVisitorBase &visitor) override {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
identifier_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
Identifier *identifier_ = nullptr;
|
||||
std::vector<GraphDbTypes::Label> labels_;
|
||||
|
@ -12,9 +12,11 @@ CreateNode::CreateNode(NodeAtom *node_atom,
|
||||
: node_atom_(node_atom), input_(input) {}
|
||||
|
||||
void CreateNode::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
if (input_) input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
if (input_) input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> CreateNode::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -69,9 +71,11 @@ CreateExpand::CreateExpand(NodeAtom *node_atom, EdgeAtom *edge_atom,
|
||||
node_existing_(node_existing) {}
|
||||
|
||||
void CreateExpand::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> CreateExpand::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -155,9 +159,11 @@ ScanAll::ScanAll(NodeAtom *node_atom, std::shared_ptr<LogicalOperator> input)
|
||||
: node_atom_(node_atom), input_(input) {}
|
||||
|
||||
void ScanAll::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
if (input_) input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
if (input_) input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> ScanAll::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -202,9 +208,11 @@ Expand::Expand(NodeAtom *node_atom, EdgeAtom *edge_atom,
|
||||
edge_cycle_(edge_cycle) {}
|
||||
|
||||
void Expand::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> Expand::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -323,9 +331,11 @@ NodeFilter::NodeFilter(std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), input_symbol_(input_symbol), node_atom_(node_atom) {}
|
||||
|
||||
void NodeFilter::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> NodeFilter::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -373,9 +383,11 @@ EdgeFilter::EdgeFilter(std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), input_symbol_(input_symbol), edge_atom_(edge_atom) {}
|
||||
|
||||
void EdgeFilter::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> EdgeFilter::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -426,9 +438,11 @@ Filter::Filter(const std::shared_ptr<LogicalOperator> &input_,
|
||||
: input_(input_), expression_(expression_) {}
|
||||
|
||||
void Filter::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> Filter::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -458,9 +472,11 @@ Produce::Produce(std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), named_expressions_(named_expressions) {}
|
||||
|
||||
void Produce::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
if (input_) input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
if (input_) input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> Produce::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -499,9 +515,11 @@ Delete::Delete(const std::shared_ptr<LogicalOperator> &input_,
|
||||
: input_(input_), expressions_(expressions), detach_(detach_) {}
|
||||
|
||||
void Delete::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> Delete::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -550,9 +568,11 @@ SetProperty::SetProperty(const std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), lhs_(lhs), rhs_(rhs) {}
|
||||
|
||||
void SetProperty::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> SetProperty::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -599,9 +619,11 @@ SetProperties::SetProperties(const std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), input_symbol_(input_symbol), rhs_(rhs), op_(op) {}
|
||||
|
||||
void SetProperties::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> SetProperties::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -682,9 +704,11 @@ SetLabels::SetLabels(const std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), input_symbol_(input_symbol), labels_(labels) {}
|
||||
|
||||
void SetLabels::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> SetLabels::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -711,9 +735,11 @@ RemoveProperty::RemoveProperty(const std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), lhs_(lhs) {}
|
||||
|
||||
void RemoveProperty::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> RemoveProperty::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -756,9 +782,11 @@ RemoveLabels::RemoveLabels(const std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), input_symbol_(input_symbol), labels_(labels) {}
|
||||
|
||||
void RemoveLabels::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> RemoveLabels::MakeCursor(GraphDbAccessor &db) {
|
||||
@ -792,9 +820,11 @@ ExpandUniquenessFilter<TAccessor>::ExpandUniquenessFilter(
|
||||
template <typename TAccessor>
|
||||
void ExpandUniquenessFilter<TAccessor>::Accept(
|
||||
LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename TAccessor>
|
||||
@ -867,9 +897,11 @@ Accumulate::Accumulate(std::shared_ptr<LogicalOperator> input,
|
||||
: input_(input), symbols_(symbols), advance_command_(advance_command) {}
|
||||
|
||||
void Accumulate::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
std::unique_ptr<Cursor> Accumulate::MakeCursor(GraphDbAccessor &db) {
|
||||
return std::make_unique<Accumulate::AccumulateCursor>(*this, db);
|
||||
@ -911,9 +943,11 @@ Aggregate::Aggregate(const std::shared_ptr<LogicalOperator> &input,
|
||||
: input_(input), aggregations_(aggregations), group_by_(group_by) {}
|
||||
|
||||
void Aggregate::Accept(LogicalOperatorVisitor &visitor) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
if (visitor.PreVisit(*this)) {
|
||||
visitor.Visit(*this);
|
||||
input_->Accept(visitor);
|
||||
visitor.PostVisit(*this);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Cursor> Aggregate::MakeCursor(GraphDbAccessor &db) {
|
||||
|
@ -18,6 +18,11 @@ namespace utils {
|
||||
/// public:
|
||||
/// void Accept(ExpressionVisitor &visitor) override {
|
||||
/// // Implement custom Accept.
|
||||
/// if (visitor.PreVisit(*this)) {
|
||||
/// visitor.Visit(*this);
|
||||
/// ... // e.g. send visitor to children
|
||||
/// visitor.PostVisit(*this);
|
||||
/// }
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
@ -34,8 +39,10 @@ class Visitable {
|
||||
/// @sa utils::Visitable
|
||||
#define DEFVISITABLE(TVisitor) \
|
||||
void Accept(TVisitor &visitor) override { \
|
||||
visitor.Visit(*this); \
|
||||
visitor.PostVisit(*this); \
|
||||
if (visitor.PreVisit(*this)) { \
|
||||
visitor.Visit(*this); \
|
||||
visitor.PostVisit(*this); \
|
||||
} \
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -11,6 +11,7 @@ class VisitorBase {
|
||||
public:
|
||||
virtual ~VisitorBase() = default;
|
||||
|
||||
virtual bool PreVisit(T &) { return true; }
|
||||
virtual void Visit(T &) {}
|
||||
virtual void PostVisit(T &) {}
|
||||
};
|
||||
@ -22,9 +23,11 @@ template <typename Head, typename... Tail>
|
||||
class RecursiveVisitorBase<Head, Tail...>
|
||||
: public VisitorBase<Head>, public RecursiveVisitorBase<Tail...> {
|
||||
public:
|
||||
using VisitorBase<Head>::PreVisit;
|
||||
using VisitorBase<Head>::Visit;
|
||||
using VisitorBase<Head>::PostVisit;
|
||||
|
||||
using RecursiveVisitorBase<Tail...>::PreVisit;
|
||||
using RecursiveVisitorBase<Tail...>::Visit;
|
||||
using RecursiveVisitorBase<Tail...>::PostVisit;
|
||||
};
|
||||
@ -32,19 +35,22 @@ class RecursiveVisitorBase<Head, Tail...>
|
||||
template <typename T>
|
||||
class RecursiveVisitorBase<T> : public VisitorBase<T> {
|
||||
public:
|
||||
using VisitorBase<T>::PreVisit;
|
||||
using VisitorBase<T>::Visit;
|
||||
using VisitorBase<T>::PostVisit;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
/// Inherit from this class if you want to visit TVisitable types.
|
||||
/// @brief Inherit from this class if you want to visit TVisitable types.
|
||||
///
|
||||
/// Example usage:
|
||||
///
|
||||
/// // Typedef for convenience or to establish a base class of visitors.
|
||||
/// typedef Visitor<Identifier, Literal> ExpressionVisitorBase;
|
||||
/// class ExpressionVisitor : public ExpressionVisitorBase {
|
||||
/// public:
|
||||
/// using ExpressionVisitorBase::PreVisit;
|
||||
/// using ExpressionVisitorBase::Visit;
|
||||
/// using ExpressionVisitorBase::PostVisit;
|
||||
///
|
||||
@ -57,6 +63,7 @@ class RecursiveVisitorBase<T> : public VisitorBase<T> {
|
||||
template <typename... TVisitable>
|
||||
class Visitor : public detail::RecursiveVisitorBase<TVisitable...> {
|
||||
public:
|
||||
using detail::RecursiveVisitorBase<TVisitable...>::PreVisit;
|
||||
using detail::RecursiveVisitorBase<TVisitable...>::Visit;
|
||||
using detail::RecursiveVisitorBase<TVisitable...>::PostVisit;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user