#pragma once
#include "common/enums/join_type.h"
#include "logical_operator.h"
#include "planner/operator/sip/side_way_info_passing.h"
namespace lbug {
namespace planner {
using join_condition_t = binder::expression_pair;
class LBUG_API LogicalHashJoin final : public LogicalOperator {
static constexpr LogicalOperatorType type_ = LogicalOperatorType::HASH_JOIN;
public:
LogicalHashJoin(std::vector<join_condition_t> joinConditions, common::JoinType joinType,
std::shared_ptr<binder::Expression> mark, std::shared_ptr<LogicalOperator> probeChild,
std::shared_ptr<LogicalOperator> buildChild, common::cardinality_t cardinality = 0)
: LogicalOperator{type_, std::move(probeChild), std::move(buildChild)},
joinConditions(std::move(joinConditions)), joinType{joinType}, mark{std::move(mark)} {
this->cardinality = cardinality;
}
f_group_pos_set getGroupsPosToFlattenOnProbeSide();
f_group_pos_set getGroupsPosToFlattenOnBuildSide();
void computeFactorizedSchema() override;
void computeFlatSchema() override;
std::string getExpressionsForPrinting() const override;
binder::expression_vector getExpressionsToMaterialize() const;
binder::expression_vector getJoinNodeIDs() const;
static binder::expression_vector getJoinNodeIDs(
const std::vector<join_condition_t>& joinConditions);
std::vector<join_condition_t> getJoinConditions() const { return joinConditions; }
common::JoinType getJoinType() const { return joinType; }
bool hasMark() const { return mark != nullptr; }
std::shared_ptr<binder::Expression> getMark() const { return mark; }
SIPInfo& getSIPInfoUnsafe() { return sipInfo; }
SIPInfo getSIPInfo() const { return sipInfo; }
std::unique_ptr<LogicalOperator> copy() override;
bool requireFlatProbeKeys() const;
static bool isNodeIDOnlyJoin(const std::vector<join_condition_t>& joinConditions);
private:
std::vector<join_condition_t> joinConditions;
common::JoinType joinType;
std::shared_ptr<binder::Expression> mark; SIPInfo sipInfo;
};
} }