17#include "sql/operator/logical_operator.h"
30 LogicalOperatorType type()
const override {
return LogicalOperatorType::JOIN; }
31 void add_predicate_op(
LogicalOperator *predicate_op) { predicate_op_ = predicate_op; }
34 if (predicate_op_ !=
nullptr && predicate_op_->expressions().size() == 1) {
35 return predicate_op_->expressions()[0].get();
40 OpType
get_op_type()
const override {
return OpType::LOGICALINNERJOIN; }
42 vector<unique_ptr<Expression>> &get_join_predicates() {
return join_predicates_; }
44 void clear_join_predicates() { join_predicates_.clear(); }
46 auto add_join_predicate(unique_ptr<Expression> &&predicate) { join_predicates_.push_back(std::move(predicate)); }
48 unique_ptr<LogicalProperty>
find_log_prop(
const vector<LogicalProperty *> &log_props)
override
50 if (log_props.size() != 2) {
56 int card = left_log_prop->get_card() * right_log_prop->get_card();
57 for (
auto &predicate : join_predicates_) {
58 if (predicate->type() != ExprType::COMPARISON) {
62 auto &left = pred_expr->left();
63 auto &right = pred_expr->right();
64 if (pred_expr->comp() == CompOp::EQUAL_TO && left->type() == ExprType::FIELD &&
65 right->type() == ExprType::FIELD) {
66 card /= std::max(std::max(left_log_prop->get_card(), right_log_prop->get_card()), 1);
69 return make_unique<LogicalProperty>(card);
74 std::vector<unique_ptr<Expression>> join_predicates_;
比较表达式
Definition: expression.h:294
表达式的抽象描述
Definition: expression.h:66
连接算子
Definition: join_logical_operator.h:25
OpType get_op_type() const override
Definition: join_logical_operator.h:40
unique_ptr< LogicalProperty > find_log_prop(const vector< LogicalProperty * > &log_props) override
Generate the logical property of the operator node using the input logical properties.
Definition: join_logical_operator.h:48
逻辑算子描述当前执行计划要做什么
Definition: logical_operator.h:50
Logical Property, such as the cardinality of logical operator
Definition: property.h:20