//===----------------------------------------------------------------------===// // DuckDB // // duckdb/execution/operator/order/physical_order.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/types/chunk_collection.hpp" #include "duckdb/execution/physical_operator.hpp" #include "duckdb/parallel/pipeline.hpp" #include "duckdb/planner/bound_query_node.hpp" namespace duckdb { class OrderGlobalSinkState; //! Physically re-orders the input data class PhysicalOrder : public PhysicalOperator { public: static constexpr const PhysicalOperatorType TYPE = PhysicalOperatorType::ORDER_BY; public: PhysicalOrder(vector types, vector orders, vector projections, idx_t estimated_cardinality); //! Input data vector orders; vector projections; public: // Source interface unique_ptr GetLocalSourceState(ExecutionContext &context, GlobalSourceState &gstate) const override; unique_ptr GetGlobalSourceState(ClientContext &context) const override; SourceResultType GetData(ExecutionContext &context, DataChunk &chunk, OperatorSourceInput &input) const override; idx_t GetBatchIndex(ExecutionContext &context, DataChunk &chunk, GlobalSourceState &gstate, LocalSourceState &lstate) const override; bool IsSource() const override { return true; } bool ParallelSource() const override { return true; } bool SupportsBatchIndex() const override { return true; } OrderPreservationType SourceOrder() const override { return OrderPreservationType::FIXED_ORDER; } public: // Sink interface unique_ptr GetLocalSinkState(ExecutionContext &context) const override; unique_ptr GetGlobalSinkState(ClientContext &context) const override; SinkResultType Sink(ExecutionContext &context, DataChunk &chunk, OperatorSinkInput &input) const override; void Combine(ExecutionContext &context, GlobalSinkState &gstate_p, LocalSinkState &lstate_p) 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; } bool SinkOrderDependent() const override { return false; } public: string ParamsToString() const override; //! Schedules tasks to merge the data during the Finalize phase static void ScheduleMergeTasks(Pipeline &pipeline, Event &event, OrderGlobalSinkState &state); }; } // namespace duckdb