ClickHouse/dbms/src/Processors/ForkProcessor.cpp

71 lines
1.2 KiB
C++
Raw Normal View History

#include <Processors/ForkProcessor.h>
namespace DB
{
ForkProcessor::Status ForkProcessor::prepare()
{
auto & input = inputs.front();
2019-02-07 18:51:53 +00:00
/// Check can output.
bool all_finished = true;
bool all_can_push = true;
for (const auto & output : outputs)
{
2019-02-07 18:51:53 +00:00
if (!output.isFinished())
{
2019-02-07 18:51:53 +00:00
all_finished = false;
/// The order is important.
if (!output.canPush())
all_can_push = false;
}
}
2019-02-07 18:51:53 +00:00
if (all_finished)
{
input.close();
return Status::Finished;
}
if (!all_can_push)
{
input.setNotNeeded();
2019-02-07 18:51:53 +00:00
return Status::PortFull;
}
2019-02-07 18:51:53 +00:00
/// Check can input.
2019-02-07 18:51:53 +00:00
if (input.isFinished())
{
2019-02-07 18:51:53 +00:00
for (auto & output : outputs)
output.finish();
return Status::Finished;
}
2019-02-07 18:51:53 +00:00
input.setNeeded();
if (!input.hasData())
return Status::NeedData;
/// Move data.
auto data = input.pull();
for (auto & output : outputs)
2019-02-07 18:51:53 +00:00
if (!output.isFinished()) /// Skip finished outputs.
output.push(data); /// Can push because no full or unneeded outputs.
2019-02-07 18:51:53 +00:00
/// Now, we pulled from input. It must be empty.
return Status::NeedData;
}
}