Skip to content
Snippets Groups Projects
Select Git revision
  • a941b0b919a2247ce0e8f6c1f214bee48f52bcfc
  • main default
  • 3.0
  • fix/long_query
  • feature/stream
  • 2.6
  • fix/sync
  • feature/TD-14761
  • test/fix_vnode_case
  • fix/ZhiqiangWang/TD-18042-update-auto-package
  • feat/async_compact
  • fix/TD-19585-D
  • fix/cargo-not-found-in-ga
  • feature/sync2-merge
  • test/fix_converage_enh
  • test/enh_case
  • fix/sangshuduo/TD-18128-taosdemo-windows-for3.0
  • fix/TD-19815
  • feature/3_liaohj
  • test/TD-19838
  • fix/3.0_bugfix_wxy
  • test/td-19847
  • ver-2.6.0.27
  • ver-3.0.1.5
  • ver-2.6.0.25
  • ver-2.6.0.24
  • ver-2.6.0.22
  • ver-3.0.1.4
  • ver-2.0.20.20
  • ver-3.0.1.3
  • ver-2.4.0.41
  • ver-2.6.0.21
  • ver-3.0.1.2
  • ver-2.6.0.19
  • ver-2.4.0.39
  • ver-2.6.0.18
  • ver-3.0.1.1
  • ver-2.6.0.17
  • ver-3.0.1.0
  • ver-3.0.0.2
  • ver-2.4.0.38
  • ver-2.6.0.16
42 results

syncMain.c

Blame
  • RewriteInputPropVisitor.cpp 6.26 KiB
    /* Copyright (c) 2020 vesoft inc. All rights reserved.
     *
     * This source code is licensed under Apache 2.0 License,
     * attached with Common Clause Condition 1.0, found in the LICENSES directory.
     */
    
    #include "visitor/RewriteInputPropVisitor.h"
    
    namespace nebula {
    namespace graph {
    
    void RewriteInputPropVisitor::visit(UUIDExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(VariableExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(VersionedVariableExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(LabelAttributeExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(LabelExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(AttributeExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(SubscriptExpression* expr) {
        reportError(expr);
    }
    
    void RewriteInputPropVisitor::visit(ConstantExpression* expr) {
        UNUSED(expr);
    }
    
    void RewriteInputPropVisitor::visit(VertexExpression* expr) {
        UNUSED(expr);
    }
    
    void RewriteInputPropVisitor::visit(EdgeExpression* expr) {
        UNUSED(expr);
    }
    
    void RewriteInputPropVisitor::visit(InputPropertyExpression* expr) {
        UNUSED(expr);
    }
    
    void RewriteInputPropVisitor::visit(ArithmeticExpression* expr) {
        visitBinaryExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(RelationalExpression* expr) {
        visitBinaryExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(LogicalExpression* expr) {
        visitBinaryExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(UnaryExpression* expr) {
        switch (expr->kind()) {
            case Expression::Kind::kUnaryPlus:
            case Expression::Kind::kUnaryNegate:
            case Expression::Kind::kUnaryNot: {
                visitUnaryExpr(expr);
                break;
            }
            case Expression::Kind::kUnaryIncr:
            case Expression::Kind::kUnaryDecr: {
                reportError(expr);
                break;
            }
            default: {
                LOG(FATAL) << "Invalid kind " << expr->kind();
            }
        }
    }
    
    void RewriteInputPropVisitor::visit(TagPropertyExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(SourcePropertyExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(DestPropertyExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(EdgePropertyExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(EdgeSrcIdExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(EdgeTypeExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(EdgeRankExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(EdgeDstIdExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(VariablePropertyExpression* expr) {
        visitVertexEdgePropExpr(expr);
    }
    
    void RewriteInputPropVisitor::visit(ListExpression* expr) {
        const auto& items = expr->items();
        for (size_t i = 0; i < items.size(); ++i) {
            items[i]->accept(this);
            if (ok()) {
                expr->setItem(i, std::move(result_));
            }
        }
    }
    
    void RewriteInputPropVisitor::visit(SetExpression* expr) {
        const auto& items = expr->items();
        for (size_t i = 0; i < items.size(); ++i) {
            items[i]->accept(this);
            if (ok()) {
                expr->setItem(i, std::move(result_));
            }
        }
    }
    
    void RewriteInputPropVisitor::visit(MapExpression* expr) {
        const auto& items = expr->items();
        for (size_t i = 0; i < items.size(); ++i) {
            items[i].second->accept(this);
            if (ok()) {
                auto key = std::make_unique<std::string>(*items[i].first);
                expr->setItem(i, {std::move(key), std::move(result_)});
            }
        }
    }
    
    void RewriteInputPropVisitor::visit(FunctionCallExpression* expr) {
        auto& args = expr->args()->args();
        for (size_t i = 0; i < args.size(); ++i) {
            args[i]->accept(this);
            if (ok()) {
                expr->args()->setArg(i, std::move(result_));
            }
        }
    }
    
    void RewriteInputPropVisitor::visit(TypeCastingExpression* expr) {
        expr->operand()->accept(this);
        if (ok()) {
            expr->setOperand(result_.release());
        }
    }
    
    void RewriteInputPropVisitor::visit(CaseExpression* expr) {
        if (expr->hasCondition()) {
            expr->condition()->accept(this);
            if (ok()) {
                expr->setCondition(result_.release());
            }
        }
        if (expr->hasDefault()) {
            expr->defaultResult()->accept(this);
            if (ok()) {
                expr->setDefault(result_.release());
            }
        }
        for (size_t i = 0; i < expr->cases().size(); ++i) {
            const auto& whenThen = expr->cases()[i];
            whenThen.when->accept(this);
            if (ok()) {
                expr->setWhen(i, result_.release());
            }
            whenThen.then->accept(this);
            if (ok()) {
                expr->setThen(i, result_.release());
            }
        }
    }
    
    void RewriteInputPropVisitor::visitBinaryExpr(BinaryExpression* expr) {
        expr->left()->accept(this);
        if (ok()) {
            expr->setLeft(result_.release());
        }
        expr->right()->accept(this);
        if (ok()) {
            expr->setRight(result_.release());
        }
    }
    
    void RewriteInputPropVisitor::visitUnaryExpr(UnaryExpression* expr) {
        expr->operand()->accept(this);
        if (ok()) {
            expr->setOperand(result_.release());
        }
    }
    
    void RewriteInputPropVisitor::visitVertexEdgePropExpr(PropertyExpression* expr) {
        auto found = propExprColMap_.find(expr->toString());
        DCHECK(found != propExprColMap_.end());
        auto alias = new std::string(*(found->second->alias()));
        result_ = std::make_unique<InputPropertyExpression>(alias);
    }
    
    void RewriteInputPropVisitor::reportError(const Expression* expr) {
        std::stringstream ss;
        ss << "Not supported expression `" << expr->toString() << "' for RewriteInputProps.";
        status_ = Status::SemanticError(ss.str());
    }
    
    void RewriteInputPropVisitor::visit(PathBuildExpression* expr) {
        const auto& items = expr->items();
        for (size_t i = 0; i < items.size(); ++i) {
            items[i]->accept(this);
            if (ok()) {
                expr->setItem(i, std::move(result_));
            }
        }
    }
    }   // namespace graph
    }   // namespace nebula