mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-17 13:13:36 +00:00
forgot new files
This commit is contained in:
parent
88e7bc5b60
commit
6f991725c3
110
src/Processors/QueryPlan/WindowStep.cpp
Normal file
110
src/Processors/QueryPlan/WindowStep.cpp
Normal file
@ -0,0 +1,110 @@
|
||||
#include <Processors/QueryPlan/WindowStep.h>
|
||||
|
||||
#include <Processors/Transforms/WindowTransform.h>
|
||||
#include <Processors/QueryPipeline.h>
|
||||
#include <Interpreters/ExpressionActions.h>
|
||||
#include <IO/Operators.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::Traits getTraits(const ActionsDAGPtr & actions)
|
||||
{
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = !actions->hasArrayJoin(),
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_sorting = !actions->hasArrayJoin(),
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = !actions->hasArrayJoin(),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static ITransformingStep::Traits getJoinTraits()
|
||||
{
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = false,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
WindowStep::WindowStep(const DataStream & input_stream_,
|
||||
ActionsDAGPtr actions_dag_)
|
||||
: ITransformingStep(
|
||||
input_stream_,
|
||||
Transform::transformHeader(input_stream_.header,
|
||||
std::make_shared<ExpressionActions>(actions_dag_)),
|
||||
getTraits(actions_dag_))
|
||||
, actions_dag(std::move(actions_dag_))
|
||||
{
|
||||
/// Some columns may be removed by expression.
|
||||
updateDistinctColumns(output_stream->header, output_stream->distinct_columns);
|
||||
}
|
||||
|
||||
void WindowStep::updateInputStream(DataStream input_stream, bool keep_header)
|
||||
{
|
||||
Block out_header = keep_header
|
||||
? std::move(output_stream->header)
|
||||
: Transform::transformHeader(input_stream.header,
|
||||
std::make_shared<ExpressionActions>(actions_dag));
|
||||
|
||||
output_stream = createOutputStream(
|
||||
input_stream,
|
||||
std::move(out_header),
|
||||
getDataStreamTraits());
|
||||
|
||||
input_streams.clear();
|
||||
input_streams.emplace_back(std::move(input_stream));
|
||||
}
|
||||
|
||||
void WindowStep::transformPipeline(QueryPipeline & pipeline)
|
||||
{
|
||||
auto expression = std::make_shared<ExpressionActions>(actions_dag);
|
||||
pipeline.addSimpleTransform([&](const Block & header)
|
||||
{
|
||||
return std::make_shared<Transform>(header, expression);
|
||||
});
|
||||
|
||||
if (!blocksHaveEqualStructure(pipeline.getHeader(), output_stream->header))
|
||||
{
|
||||
auto convert_actions_dag = ActionsDAG::makeConvertingActions(
|
||||
pipeline.getHeader().getColumnsWithTypeAndName(),
|
||||
output_stream->header.getColumnsWithTypeAndName(),
|
||||
ActionsDAG::MatchColumnsMode::Name);
|
||||
auto convert_actions = std::make_shared<ExpressionActions>(convert_actions_dag);
|
||||
|
||||
pipeline.addSimpleTransform([&](const Block & header)
|
||||
{
|
||||
return std::make_shared<ExpressionTransform>(header, convert_actions);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void WindowStep::describeActions(FormatSettings & settings) const
|
||||
{
|
||||
String prefix(settings.offset, ' ');
|
||||
bool first = true;
|
||||
|
||||
auto expression = std::make_shared<ExpressionActions>(actions_dag);
|
||||
for (const auto & action : expression->getActions())
|
||||
{
|
||||
settings.out << prefix << (first ? "Actions: "
|
||||
: " ");
|
||||
first = false;
|
||||
settings.out << action.toString() << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
32
src/Processors/QueryPlan/WindowStep.h
Normal file
32
src/Processors/QueryPlan/WindowStep.h
Normal file
@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
#include <Processors/QueryPlan/ITransformingStep.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
class ActionsDAG;
|
||||
using ActionsDAGPtr = std::shared_ptr<ActionsDAG>;
|
||||
|
||||
class WindowTransform;
|
||||
|
||||
class WindowStep : public ITransformingStep
|
||||
{
|
||||
public:
|
||||
using Transform = WindowTransform;
|
||||
|
||||
explicit WindowStep(const DataStream & input_stream_, ActionsDAGPtr actions_dag_);
|
||||
String getName() const override { return "Expression"; }
|
||||
|
||||
void transformPipeline(QueryPipeline & pipeline) override;
|
||||
|
||||
void updateInputStream(DataStream input_stream, bool keep_header);
|
||||
|
||||
void describeActions(FormatSettings & settings) const override;
|
||||
|
||||
const ActionsDAGPtr & getExpression() const { return actions_dag; }
|
||||
|
||||
private:
|
||||
ActionsDAGPtr actions_dag;
|
||||
};
|
||||
|
||||
}
|
33
src/Processors/Transforms/WindowTransform.cpp
Normal file
33
src/Processors/Transforms/WindowTransform.cpp
Normal file
@ -0,0 +1,33 @@
|
||||
#include <Processors/Transforms/WindowTransform.h>
|
||||
|
||||
#include <Interpreters/ExpressionActions.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
Block WindowTransform::transformHeader(Block header, const ExpressionActionsPtr & expression)
|
||||
{
|
||||
size_t num_rows = header.rows();
|
||||
expression->execute(header, num_rows, true);
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
WindowTransform::WindowTransform(const Block & header_,
|
||||
ExpressionActionsPtr expression_)
|
||||
: ISimpleTransform(header_, transformHeader(header_, expression_), false)
|
||||
, expression(std::move(expression_))
|
||||
{
|
||||
}
|
||||
|
||||
void WindowTransform::transform(Chunk & chunk)
|
||||
{
|
||||
size_t num_rows = chunk.getNumRows();
|
||||
auto block = getInputPort().getHeader().cloneWithColumns(chunk.detachColumns());
|
||||
|
||||
expression->execute(block, num_rows);
|
||||
|
||||
chunk.setColumns(block.getColumns(), num_rows);
|
||||
}
|
||||
|
||||
}
|
36
src/Processors/Transforms/WindowTransform.h
Normal file
36
src/Processors/Transforms/WindowTransform.h
Normal file
@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
#include <Processors/ISimpleTransform.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
class ExpressionActions;
|
||||
using ExpressionActionsPtr = std::shared_ptr<ExpressionActions>;
|
||||
|
||||
/** Executes a certain expression over the block.
|
||||
* The expression consists of column identifiers from the block, constants, common functions.
|
||||
* For example: hits * 2 + 3, url LIKE '%yandex%'
|
||||
* The expression processes each row independently of the others.
|
||||
*/
|
||||
class WindowTransform : public ISimpleTransform
|
||||
{
|
||||
public:
|
||||
WindowTransform(
|
||||
const Block & header_,
|
||||
ExpressionActionsPtr expression_);
|
||||
|
||||
String getName() const override
|
||||
{
|
||||
return "WindowTransform";
|
||||
}
|
||||
|
||||
static Block transformHeader(Block header, const ExpressionActionsPtr & expression);
|
||||
|
||||
protected:
|
||||
void transform(Chunk & chunk) override;
|
||||
|
||||
private:
|
||||
ExpressionActionsPtr expression;
|
||||
};
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user