2019-09-13 12:34:05 +00:00
|
|
|
#pragma once
|
|
|
|
#include <DataStreams/IBlockInputStream.h>
|
|
|
|
#include <Processors/IProcessor.h>
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2019-10-04 15:40:05 +00:00
|
|
|
class ISourceWithProgress;
|
|
|
|
|
2019-09-13 12:34:05 +00:00
|
|
|
class TreeExecutor : public IBlockInputStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit TreeExecutor(Processors processors_) : processors(std::move(processors_)) { init(); }
|
|
|
|
|
|
|
|
String getName() const override { return root->getName(); }
|
|
|
|
Block getHeader() const override { return root->getOutputs().front().getHeader(); }
|
|
|
|
|
2019-10-04 15:40:05 +00:00
|
|
|
/// This methods does not affect TreeExecutor as IBlockInputStream itself.
|
|
|
|
/// They just passed to all SourceWithProgress processors.
|
|
|
|
void setProgressCallback(const ProgressCallback & callback) final;
|
|
|
|
void setProcessListElement(QueryStatus * elem) final;
|
|
|
|
void setLimits(const LocalLimits & limits_) final;
|
|
|
|
void setQuota(QuotaForIntervals & quota_) final;
|
|
|
|
void addTotalRowsApprox(size_t value) final;
|
|
|
|
|
2019-09-13 12:34:05 +00:00
|
|
|
protected:
|
|
|
|
Block readImpl() override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
Processors processors;
|
|
|
|
IProcessor * root = nullptr;
|
|
|
|
std::unique_ptr<InputPort> port;
|
|
|
|
|
2019-10-04 15:40:05 +00:00
|
|
|
/// Remember sources that support progress.
|
|
|
|
std::vector<ISourceWithProgress *> sources_with_progress;
|
|
|
|
|
2019-09-13 12:34:05 +00:00
|
|
|
void init();
|
|
|
|
void execute();
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|