diff --git a/src/graph/visitor/ExtractFilterExprVisitor.cpp b/src/graph/visitor/ExtractFilterExprVisitor.cpp index f4a97e1ecc..6a36564ba2 100644 --- a/src/graph/visitor/ExtractFilterExprVisitor.cpp +++ b/src/graph/visitor/ExtractFilterExprVisitor.cpp @@ -231,6 +231,21 @@ void ExtractFilterExprVisitor::visit(ColumnExpression *) { canBePushed_ = false; } +void ExtractFilterExprVisitor::visit(UnaryExpression *expr) { + if (expr->kind() == Expression::Kind::kUnaryNot && + (expr->operand()->kind() == Expression::Kind::kLogicalAnd || + expr->operand()->kind() == Expression::Kind::kLogicalOr)) { + // The NOT operation in this kind of expressions should had been reduced. + // In case it had not been reduced, pushing it down would cause wrong results. + canBePushed_ = false; + return; + } + if (expr->operand() != nullptr) { + expr->operand()->accept(this); + return; + } +} + // @return: whether this logical expr satisfies split condition bool ExtractFilterExprVisitor::visitLogicalAnd(LogicalExpression *expr, std::vector &flags) { DCHECK_EQ(expr->kind(), Expression::Kind::kLogicalAnd); diff --git a/src/graph/visitor/ExtractFilterExprVisitor.h b/src/graph/visitor/ExtractFilterExprVisitor.h index 67deec512a..40bccf7b46 100644 --- a/src/graph/visitor/ExtractFilterExprVisitor.h +++ b/src/graph/visitor/ExtractFilterExprVisitor.h @@ -84,6 +84,7 @@ class ExtractFilterExprVisitor final : public ExprVisitorImpl { void visit(LogicalExpression *) override; void visit(ColumnExpression *) override; void visit(SubscriptRangeExpression *) override; + void visit(UnaryExpression *) override; private: enum class PushType {