Skip to content
This repository has been archived by the owner on Dec 1, 2022. It is now read-only.

Commit

Permalink
Add FindVisitor (#947)
Browse files Browse the repository at this point in the history
Co-authored-by: Yee <2520865+yixinglu@users.noreply.github.com>
  • Loading branch information
czpmango and yixinglu committed Apr 19, 2021
1 parent 773082e commit bba7f08
Show file tree
Hide file tree
Showing 10 changed files with 336 additions and 799 deletions.
32 changes: 26 additions & 6 deletions src/util/ExpressionUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,8 @@
#include "common/expression/PropertyExpression.h"
#include "common/expression/TypeCastingExpression.h"
#include "common/expression/UnaryExpression.h"
#include "visitor/CollectAllExprsVisitor.h"
#include "visitor/EvaluableExprVisitor.h"
#include "visitor/FindAnyExprVisitor.h"
#include "visitor/FindVisitor.h"
#include "visitor/RewriteVisitor.h"

namespace nebula {
Expand All @@ -37,19 +36,40 @@ class ExpressionUtils {
// null for not found
static const Expression* findAny(const Expression* self,
const std::unordered_set<Expression::Kind>& expected) {
FindAnyExprVisitor visitor(expected);
auto finder = [](const Expression* expr,
const std::unordered_set<Expression::Kind>& targets) -> bool {
if (targets.find(expr->kind()) != targets.end()) {
return true;
}
return false;
};
FindVisitor<Expression::Kind> visitor(finder, expected);
const_cast<Expression*>(self)->accept(&visitor);
return visitor.expr();
auto res = visitor.results();

if (res.size() == 1) {
// findAny only produce one result
return res.front();
}

return nullptr;
}

// Find all expression fit any kind
// Empty for not found any one
static std::vector<const Expression*> collectAll(
const Expression* self,
const std::unordered_set<Expression::Kind>& expected) {
CollectAllExprsVisitor visitor(expected);
auto finder = [](const Expression* expr,
const std::unordered_set<Expression::Kind>& targets) -> bool {
if (targets.find(expr->kind()) != targets.end()) {
return true;
}
return false;
};
FindVisitor<Expression::Kind> visitor(finder, expected, true);
const_cast<Expression*>(self)->accept(&visitor);
return std::move(visitor).exprs();
return std::move(visitor).results();
}

static bool hasAny(const Expression* expr,
Expand Down
17 changes: 13 additions & 4 deletions src/validator/GroupByValidator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include "util/AnonColGenerator.h"
#include "util/AnonVarGenerator.h"
#include "util/ExpressionUtils.h"
#include "visitor/FindAnySubExprVisitor.h"
#include "visitor/FindVisitor.h"

namespace nebula {
namespace graph {
Expand Down Expand Up @@ -147,13 +147,22 @@ Status GroupByValidator::groupClauseSemanticCheck() {
groupKeys_ = yieldCols_;
} else {
std::unordered_set<Expression*> groupSet(groupKeys_.begin(), groupKeys_.end());
auto finder = [](const Expression* expr,
const std::unordered_set<Expression*>& targets) -> bool {
for (auto* target : targets) {
if (*target == *expr) {
return true;
}
}
return false;
};
for (auto* expr : yieldCols_) {
if (evaluableExpr(expr)) {
continue;
}
FindAnySubExprVisitor groupVisitor(groupSet, true);
expr->accept(&groupVisitor);
if (!groupVisitor.found()) {
FindVisitor<Expression*> visitor(finder, groupSet);
expr->accept(&visitor);
if (!visitor.found()) {
return Status::SemanticError("Yield non-agg expression `%s' must be"
" functionally dependent on items in GROUP BY clause",
expr->toString().c_str());
Expand Down
3 changes: 0 additions & 3 deletions src/visitor/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@
nebula_add_library(
expr_visitor_obj OBJECT
ExprVisitorImpl.cpp
CollectAllExprsVisitor.cpp
DeducePropsVisitor.cpp
DeduceTypeVisitor.cpp
ExtractPropExprVisitor.cpp
ExtractFilterExprVisitor.cpp
FindAnyExprVisitor.cpp
FindAnySubExprVisitor.cpp
FoldConstantExprVisitor.cpp
RewriteSymExprVisitor.cpp
RewriteVisitor.cpp
Expand Down
188 changes: 0 additions & 188 deletions src/visitor/CollectAllExprsVisitor.cpp

This file was deleted.

Loading

0 comments on commit bba7f08

Please sign in to comment.