memgraph/include/query/language/cypher/visitor/traverser.hpp

318 lines
6.6 KiB
C++
Raw Normal View History

#pragma once
2015-10-28 03:21:28 +08:00
#include "query/language/cypher/ast/ast.hpp"
#include "query/language/cypher/ast/ast_visitor.hpp"
2015-10-28 03:21:28 +08:00
class Traverser : public ast::AstVisitor
{
public:
2015-10-30 08:24:01 +08:00
using uptr = std::unique_ptr<Traverser>;
using sptr = std::shared_ptr<Traverser>;
2016-07-09 21:50:04 +08:00
void visit(ast::Start& start_query) override
2015-10-28 03:21:28 +08:00
{
2016-07-09 21:50:04 +08:00
// DELETE
2016-01-24 23:21:46 +08:00
}
void visit(ast::DeleteQuery& delete_query) override
{
accept(delete_query.match);
accept(delete_query.delete_clause);
2015-10-28 03:21:28 +08:00
}
2016-01-26 04:22:12 +08:00
2015-10-28 03:21:28 +08:00
void visit(ast::ReadQuery& read_query) override
{
accept(read_query.match);
accept(read_query.return_clause);
}
2016-07-09 21:50:04 +08:00
void visit(ast::ReadWriteQuery& query) override
{
accept(query.match_clause);
accept(query.create_clause);
accept(query.return_clause);
2016-07-09 21:50:04 +08:00
}
void visit(ast::MergeQuery& query) override
{
accept(query.merge_clause);
accept(query.set_clause);
accept(query.return_clause);
}
2015-10-28 03:21:28 +08:00
void visit(ast::Match& match) override
{
2016-07-09 21:50:04 +08:00
accept(match.pattern_list);
2015-10-28 03:21:28 +08:00
accept(match.where);
}
void visit(ast::Pattern& pattern) override
{
accept(pattern.node);
accept(pattern.relationship);
accept(pattern.next);
}
void visit(ast::PatternExpr& pattern_expr) override
{
accept(pattern_expr.pattern);
}
2015-10-28 03:21:28 +08:00
void visit(ast::Node& node) override
{
accept(node.idn);
accept(node.labels);
accept(node.props);
}
void visit(ast::Return& return_clause) override
{
2016-07-09 21:50:04 +08:00
accept(return_clause.return_list);
accept(return_clause.distinct);
2015-10-28 03:21:28 +08:00
}
void visit(ast::Accessor& accessor) override
{
accept(accessor.entity);
accept(accessor.prop);
}
void visit(ast::Property& property) override
{
accept(property.idn);
accept(property.value);
}
void visit(ast::And& and_expr) override
{
accept(and_expr.left);
accept(and_expr.right);
}
void visit(ast::Or& or_expr) override
{
accept(or_expr.left);
accept(or_expr.right);
}
void visit(ast::Lt& lt_expr) override
{
accept(lt_expr.left);
accept(lt_expr.right);
}
void visit(ast::Gt& gt_expr) override
{
accept(gt_expr.left);
accept(gt_expr.right);
}
void visit(ast::Ge& ge_expr) override
{
accept(ge_expr.left);
accept(ge_expr.right);
}
void visit(ast::Le& le_expr) override
{
accept(le_expr.left);
accept(le_expr.right);
}
void visit(ast::Eq& eq_expr) override
{
accept(eq_expr.left);
accept(eq_expr.right);
}
void visit(ast::Ne& ne_expr) override
{
accept(ne_expr.left);
accept(ne_expr.right);
}
void visit(ast::Plus& plus) override
{
accept(plus.left);
accept(plus.right);
}
void visit(ast::Minus& minus) override
{
accept(minus.left);
accept(minus.right);
}
void visit(ast::Star& star) override
{
accept(star.left);
accept(star.right);
}
void visit(ast::Slash& slash) override
{
accept(slash.left);
accept(slash.right);
}
void visit(ast::Rem& rem) override
{
accept(rem.left);
accept(rem.right);
}
2016-09-14 19:19:56 +08:00
void visit(ast::CountFunction& count) override
{
}
void visit(ast::LabelsFunction& labels) override
{
}
2015-10-28 03:21:28 +08:00
void visit(ast::PropertyList& prop_list) override
{
accept(prop_list.value);
accept(prop_list.next);
}
2016-07-09 21:50:04 +08:00
void visit(ast::PatternList& pattern_list) override
{
accept(pattern_list.value);
accept(pattern_list.next);
}
void visit(ast::RelationshipTypeList& rel_list) override
2015-10-28 03:21:28 +08:00
{
accept(rel_list.value);
accept(rel_list.next);
}
2016-07-09 21:50:04 +08:00
void visit(ast::IdentifierList& list) override
{
accept(list.value);
accept(list.next);
}
2015-10-28 03:21:28 +08:00
void visit(ast::Relationship& rel) override
{
accept(rel.specs);
}
void visit(ast::RelationshipSpecs& rel_specs) override
{
accept(rel_specs.idn);
accept(rel_specs.types);
accept(rel_specs.props);
}
void visit(ast::LabelList& labels) override
{
accept(labels.value);
accept(labels.next);
}
void visit(ast::ReturnList& return_list) override
{
accept(return_list.value);
accept(return_list.next);
}
void visit(ast::Where& where) override
{
accept(where.expr);
}
void visit(ast::WriteQuery& write_query) override
{
accept(write_query.create);
accept(write_query.return_clause);
}
2016-01-26 04:22:12 +08:00
void visit(ast::UpdateQuery& update_query) override
{
accept(update_query.match_clause);
accept(update_query.set_clause);
2016-07-09 21:50:04 +08:00
accept(update_query.return_clause);
2016-01-26 04:22:12 +08:00
}
void visit(ast::Set& set_clause) override
{
accept(set_clause.set_list);
}
void visit(ast::SetValue& set_value) override
{
accept(set_value.value);
}
void visit(ast::SetElement& set_element) override
{
accept(set_element.accessor);
accept(set_element.set_value);
}
2016-11-04 08:49:21 +08:00
void visit(ast::LabelSetElement& label_set_element) override
{
accept(label_set_element.identifier);
accept(label_set_element.label_list);
}
2016-01-26 04:22:12 +08:00
void visit(ast::SetList& set_list) override
{
accept(set_list.value);
2016-07-09 21:50:04 +08:00
accept(set_list.next);
2016-01-26 04:22:12 +08:00
}
2015-10-28 03:21:28 +08:00
void visit(ast::Create& create) override
{
accept(create.pattern);
}
void visit(ast::Merge& merge) override
{
accept(merge.pattern);
}
void visit(ast::Distinct& distinct) override
{
accept(distinct.identifier);
}
2016-01-24 23:21:46 +08:00
void visit(ast::Delete& delete_clause) override
{
accept(delete_clause.identifier);
}
2016-07-09 21:50:04 +08:00
void visit(ast::WithClause& with_clause) override
{
accept(with_clause.identifier_list);
accept(with_clause.match_clause);
}
void visit(ast::WithList& with_list) override
{
accept(with_list.value);
accept(with_list.next);
}
void visit(ast::WithQuery& with_query) override
{
accept(with_query.match_clause);
accept(with_query.with_list);
accept(with_query.return_clause);
}
void visit(ast::InternalIdExpr& internal_id) override
{
accept(internal_id.entity);
accept(internal_id.id);
}
2015-10-28 03:21:28 +08:00
protected:
template<class T>
void accept(T* node)
{
if(node != nullptr)
node->accept(*this);
}
};