//===----------------------------------------------------------------------===// // DuckDB // // duckdb/planner/joinside.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/unordered_set.hpp" #include "duckdb/planner/expression.hpp" namespace duckdb { //! JoinCondition represents a left-right comparison join condition struct JoinCondition { public: JoinCondition() { } //! Turns the JoinCondition into an expression; note that this destroys the JoinCondition as the expression inherits //! the left/right expressions static unique_ptr CreateExpression(JoinCondition cond); static unique_ptr CreateExpression(vector conditions); //! Serializes a JoinCondition to a stand-alone binary blob void Serialize(Serializer &serializer) const; //! Deserializes a blob back into a JoinCondition static JoinCondition Deserialize(Deserializer &source, PlanDeserializationState &state); public: unique_ptr left; unique_ptr right; ExpressionType comparison; }; class JoinSide { public: enum JoinValue : uint8_t { NONE, LEFT, RIGHT, BOTH }; JoinSide() = default; constexpr JoinSide(JoinValue val) : value(val) { // NOLINT: Allow implicit conversion from `join_value` } bool operator==(JoinSide a) const { return value == a.value; } bool operator!=(JoinSide a) const { return value != a.value; } static JoinSide CombineJoinSide(JoinSide left, JoinSide right); static JoinSide GetJoinSide(idx_t table_binding, const unordered_set &left_bindings, const unordered_set &right_bindings); static JoinSide GetJoinSide(Expression &expression, const unordered_set &left_bindings, const unordered_set &right_bindings); static JoinSide GetJoinSide(const unordered_set &bindings, const unordered_set &left_bindings, const unordered_set &right_bindings); private: JoinValue value; }; } // namespace duckdb