Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter pushdown optimization. #947

Merged
merged 17 commits into from
Dec 23, 2019
Merged
283 changes: 58 additions & 225 deletions src/common/filter/Expressions.cpp

Large diffs are not rendered by default.

128 changes: 55 additions & 73 deletions src/common/filter/Expressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,16 @@ enum class ColumnType {

std::string columnTypeToString(ColumnType type);


struct Getters {
std::function<OptVariantType()> getEdgeRank;
std::function<OptVariantType(const std::string&)> getInputProp;
std::function<OptVariantType(const std::string&)> getVariableProp;
std::function<OptVariantType(const std::string&, const std::string&)> getSrcTagProp;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add some other interfaces like:

std::function<OptVariantType(TagID id, const std::string&)> getSrcTagProp
std::function<OptVariantType(EdgeType type, const std::string&)> getEdgeProp;


std::function<OptVariantType(const std::string&, const std::string&)> getDstTagProp;
std::function<OptVariantType(const std::string&, const std::string&)> getAliasProp;
};

class ExpressionContext final {
public:
using EdgeInfo = boost::variant<std::string, EdgeType>;
Expand Down Expand Up @@ -148,27 +158,13 @@ class ExpressionContext final {
return space_;
}

struct Getters {
std::function<OptVariantType()> getEdgeRank;
std::function<OptVariantType(const std::string&)> getInputProp;
std::function<OptVariantType(const std::string&)> getVariableProp;
std::function<OptVariantType(const std::string&, const std::string&)> getSrcTagProp;
std::function<OptVariantType(const std::string&, const std::string&)> getDstTagProp;
std::function<OptVariantType(const std::string&, const std::string&)> getAliasProp;
};

Getters& getters() {
return getters_;
}

void print() const;

bool isOverAllEdge() const { return overAll_; }

void setOverAllEdge() { overAll_ = true; }

private:
Getters getters_;
std::unordered_set<PropPair> srcTagProps_;
std::unordered_set<PropPair> dstTagProps_;
std::unordered_set<PropPair> aliasProps_;
Expand Down Expand Up @@ -196,7 +192,7 @@ class Expression {

virtual Status MUST_USE_RESULT prepare() = 0;

virtual OptVariantType eval() const = 0;
virtual OptVariantType eval(Getters &getters) const = 0;

virtual bool isInputExpression() const {
return kind_ == kInputProp;
Expand All @@ -218,6 +214,10 @@ class Expression {
return kind_ == kFunctionCall;
}

virtual bool isLogicalExpression() const {
return kind_ == kLogical;
}

/**
* To encode an expression into a byte buffer.
*
Expand Down Expand Up @@ -431,7 +431,7 @@ class AliasPropertyExpression: public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -462,14 +462,9 @@ class InputPropertyExpression final : public AliasPropertyExpression {

explicit InputPropertyExpression(std::string *prop);

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -482,14 +477,9 @@ class DestPropertyExpression final : public AliasPropertyExpression {

DestPropertyExpression(std::string *tag, std::string *prop);

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -502,14 +492,9 @@ class VariablePropertyExpression final : public AliasPropertyExpression {

VariablePropertyExpression(std::string *var, std::string *prop);

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -527,14 +512,9 @@ class EdgeTypeExpression final : public AliasPropertyExpression {
prop_.reset(new std::string(_TYPE));
}

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -552,14 +532,9 @@ class EdgeSrcIdExpression final : public AliasPropertyExpression {
prop_.reset(new std::string(_SRC));
}

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -577,14 +552,9 @@ class EdgeDstIdExpression final : public AliasPropertyExpression {
prop_.reset(new std::string(_DST));
}

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -602,14 +572,9 @@ class EdgeRankExpression final : public AliasPropertyExpression {
prop_.reset(new std::string(_RANK));
}

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand All @@ -622,14 +587,9 @@ class SourcePropertyExpression final : public AliasPropertyExpression {

SourcePropertyExpression(std::string *tag, std::string *prop);

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

private:
void encode(Cord &cord) const override;

const char* decode(const char *pos, const char *end) override;
};


Expand Down Expand Up @@ -662,7 +622,7 @@ class PrimaryExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -710,9 +670,16 @@ class FunctionCallExpression final : public Expression {
return name_.get();
}

const std::vector<Expression*> args() const {
std::vector<Expression*> args;
std::transform(args_.begin(), args_.end(), std::back_inserter(args),
[] (auto &e) { return e.get(); } );
return args;
}

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand All @@ -723,6 +690,10 @@ class FunctionCallExpression final : public Expression {
}
}

void setFunc(std::function<VariantType(const std::vector<VariantType>&)> func) {
function_ = func;
}

private:
void encode(Cord &cord) const override;

Expand All @@ -748,7 +719,7 @@ class UUIDExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -789,7 +760,7 @@ class UnaryExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -828,7 +799,7 @@ class TypeCastingExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -879,7 +850,7 @@ class ArithmeticExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -930,7 +901,7 @@ class RelationalExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand Down Expand Up @@ -983,7 +954,7 @@ class LogicalExpression final : public Expression {

std::string toString() const override;

OptVariantType eval() const override;
OptVariantType eval(Getters &getters) const override;

Status MUST_USE_RESULT prepare() override;

Expand All @@ -993,6 +964,18 @@ class LogicalExpression final : public Expression {
right_->setContext(context);
}

void resetLeft(Expression *expr) {
left_.reset(expr);
}

void resetRight(Expression *expr) {
right_.reset(expr);
}

const Operator op() const {
return op_;
}

const Expression* left() const {
return left_.get();
}
Expand All @@ -1011,7 +994,6 @@ class LogicalExpression final : public Expression {
std::unique_ptr<Expression> left_;
std::unique_ptr<Expression> right_;
};

} // namespace nebula

#endif // COMMON_FILTER_EXPRESSIONS_H_
Loading