2019-07-24 18:00:09 +00:00
|
|
|
#pragma once
|
|
|
|
#include <DataStreams/IBlockInputStream.h>
|
|
|
|
#include <Processors/Formats/IInputFormat.h>
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
2020-02-25 18:10:48 +00:00
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
|
|
|
extern const int LOGICAL_ERROR;
|
|
|
|
}
|
2019-07-24 18:00:09 +00:00
|
|
|
|
|
|
|
class IInputFormat;
|
|
|
|
using InputFormatPtr = std::shared_ptr<IInputFormat>;
|
|
|
|
|
|
|
|
class InputStreamFromInputFormat : public IBlockInputStream
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit InputStreamFromInputFormat(InputFormatPtr input_format_)
|
|
|
|
: input_format(std::move(input_format_))
|
2019-07-25 09:15:33 +00:00
|
|
|
, port(input_format->getPort().getHeader(), input_format.get())
|
2019-07-24 18:00:09 +00:00
|
|
|
{
|
|
|
|
connect(input_format->getPort(), port);
|
2019-07-25 09:20:00 +00:00
|
|
|
port.setNeeded();
|
2019-07-24 18:00:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
String getName() const override { return input_format->getName(); }
|
|
|
|
Block getHeader() const override { return input_format->getPort().getHeader(); }
|
|
|
|
|
2019-08-01 14:25:41 +00:00
|
|
|
void cancel(bool kill) override
|
|
|
|
{
|
|
|
|
input_format->cancel();
|
|
|
|
IBlockInputStream::cancel(kill);
|
|
|
|
}
|
|
|
|
|
2019-07-30 18:48:40 +00:00
|
|
|
const BlockMissingValues & getMissingValues() const override { return input_format->getMissingValues(); }
|
|
|
|
|
2019-07-24 18:00:09 +00:00
|
|
|
protected:
|
|
|
|
|
|
|
|
Block readImpl() override
|
|
|
|
{
|
|
|
|
while (true)
|
|
|
|
{
|
|
|
|
auto status = input_format->prepare();
|
|
|
|
|
|
|
|
switch (status)
|
|
|
|
{
|
|
|
|
case IProcessor::Status::Ready:
|
|
|
|
input_format->work();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case IProcessor::Status::Finished:
|
|
|
|
return {};
|
|
|
|
|
|
|
|
case IProcessor::Status::PortFull:
|
|
|
|
return input_format->getPort().getHeader().cloneWithColumns(port.pull().detachColumns());
|
|
|
|
|
|
|
|
case IProcessor::Status::NeedData:
|
|
|
|
case IProcessor::Status::Async:
|
|
|
|
case IProcessor::Status::Wait:
|
|
|
|
case IProcessor::Status::ExpandPipeline:
|
|
|
|
throw Exception("Source processor returned status " + IProcessor::statusToName(status), ErrorCodes::LOGICAL_ERROR);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
InputFormatPtr input_format;
|
|
|
|
InputPort port;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|