Skip to content

Commit

Permalink
enhance match attribute filter
Browse files Browse the repository at this point in the history
  • Loading branch information
nevermore3 committed Nov 4, 2021
1 parent 07ccfde commit b194389
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 9 deletions.
21 changes: 14 additions & 7 deletions src/graph/validator/MatchValidator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -527,8 +527,8 @@ Status MatchValidator::validateUnwind(const UnwindClause *unwindClause,
}

StatusOr<Expression *> MatchValidator::makeSubFilter(const std::string &alias,
const MapExpression *map,
const std::string &label) const {
MapExpression *map,
const std::string &label) {
auto *pool = qctx_->objPool();
// Node has tag without property
if (!label.empty() && map == nullptr) {
Expand All @@ -546,21 +546,28 @@ StatusOr<Expression *> MatchValidator::makeSubFilter(const std::string &alias,
auto &items = map->items();
DCHECK(!items.empty());

// TODO(dutor) Check if evaluable and evaluate
if (items[0].second->kind() != Expression::Kind::kConstant) {
return Status::SemanticError("Props must be constant: `%s'",
auto foldStatus = ExpressionUtils::foldConstantExpr(items[0].second);
NG_RETURN_IF_ERROR(foldStatus);
auto foldExpr = foldStatus.value();
if (!ExpressionUtils::isEvaluableExpr(foldExpr)) {
return Status::SemanticError("Props must be evaluable: `%s'",
items[0].second->toString().c_str());
}
map->setItem(0, std::make_pair(items[0].first, foldExpr));
Expression *root = RelationalExpression::makeEQ(
pool,
LabelAttributeExpression::make(
pool, LabelExpression::make(pool, alias), ConstantExpression::make(pool, items[0].first)),
items[0].second->clone());
for (auto i = 1u; i < items.size(); i++) {
if (items[i].second->kind() != Expression::Kind::kConstant) {
return Status::SemanticError("Props must be constant: `%s'",
foldStatus = ExpressionUtils::foldConstantExpr(items[i].second);
NG_RETURN_IF_ERROR(foldStatus);
foldExpr = foldStatus.value();
if (!ExpressionUtils::isEvaluableExpr(foldExpr)) {
return Status::SemanticError("Props must be evaluable: `%s'",
items[i].second->toString().c_str());
}
map->setItem(i, std::make_pair(items[i].first, foldExpr));
auto *left = root;
auto *right = RelationalExpression::makeEQ(
pool,
Expand Down
4 changes: 2 additions & 2 deletions src/graph/validator/MatchValidator.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ class MatchValidator final : public Validator {
YieldColumns *columns) const;

StatusOr<Expression *> makeSubFilter(const std::string &alias,
const MapExpression *map,
const std::string &label = "") const;
MapExpression *map,
const std::string &label = "");

static Expression *andConnect(ObjectPool *pool, Expression *left, Expression *right);

Expand Down
2 changes: 2 additions & 0 deletions src/parser/MatchSentence.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ class MatchNode final {

const MapExpression* props() const { return props_; }

MapExpression* props() { return props_; }

std::string toString() const;

private:
Expand Down

0 comments on commit b194389

Please sign in to comment.