//===----------------------------------------------------------------------===// // DuckDB // // duckdb/execution/operator/join/physical_hash_join.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/types/chunk_collection.hpp" #include "duckdb/common/value_operations/value_operations.hpp" #include "duckdb/execution/join_hashtable.hpp" #include "duckdb/execution/operator/join/perfect_hash_join_executor.hpp" #include "duckdb/execution/operator/join/physical_comparison_join.hpp" #include "duckdb/execution/physical_operator.hpp" #include "duckdb/planner/operator/logical_join.hpp" namespace duckdb { //! PhysicalHashJoin represents a hash loop join between two tables class PhysicalHashJoin : public PhysicalComparisonJoin { public: static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::HASH_JOIN; public: PhysicalHashJoin(LogicalOperator &op, unique_ptr left, unique_ptr right, vector cond, JoinType join_type, const vector &left_projection_map, const vector &right_projection_map, vector delim_types, idx_t estimated_cardinality, PerfectHashJoinStats perfect_join_stats); PhysicalHashJoin(LogicalOperator &op, unique_ptr left, unique_ptr right, vector cond, JoinType join_type, idx_t estimated_cardinality, PerfectHashJoinStats join_state); //! Initialize HT for this operator unique_ptr InitializeHashTable(ClientContext &context) const; vector right_projection_map; //! The types of the keys vector condition_types; //! The types of all conditions vector build_types; //! Duplicate eliminated types; only used for delim_joins (i.e. correlated subqueries) vector delim_types; //! Used in perfect hash join PerfectHashJoinStats perfect_join_statistics; public: // Operator Interface unique_ptr GetOperatorState(ExecutionContext &context) const override; bool ParallelOperator() const override { return true; } protected: // CachingOperator Interface OperatorResultType ExecuteInternal(ExecutionContext &context, DataChunk &input, DataChunk &chunk, GlobalOperatorState &gstate, OperatorState &state) const override; // Source interface unique_ptr GetGlobalSourceState(ClientContext &context) const override; unique_ptr GetLocalSourceState(ExecutionContext &context, GlobalSourceState &gstate) const override; SourceResultType GetData(ExecutionContext &context, DataChunk &chunk, OperatorSourceInput &input) const override; //! Becomes a source when it is an external join bool IsSource() const override { return true; } bool ParallelSource() const override { return true; } public: // Sink Interface unique_ptr GetGlobalSinkState(ClientContext &context) const override; unique_ptr GetLocalSinkState(ExecutionContext &context) const override; SinkResultType Sink(ExecutionContext &context, DataChunk &chunk, OperatorSinkInput &input) const override; void Combine(ExecutionContext &context, GlobalSinkState &gstate, LocalSinkState &lstate) const override; SinkFinalizeType Finalize(Pipeline &pipeline, Event &event, ClientContext &context, GlobalSinkState &gstate) const override; bool IsSink() const override { return true; } bool ParallelSink() const override { return true; } }; } // namespace duckdb