mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-18 21:51:57 +00:00
Split traits of ITransformingStep to DataStreamTraits and TransformTraits.
This commit is contained in:
parent
09b8cb0e5f
commit
e6508db4f0
@ -4,15 +4,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
.preserves_distinct_columns = false,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = false, /// New rows are added from delayed stream
|
||||
.preserves_sorting = false,
|
||||
{
|
||||
.preserves_distinct_columns = false,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false, /// New rows are added from delayed stream
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -7,15 +7,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = false, /// Actually, we may check that distinct names are in aggregation keys
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = true,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = true,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = true,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = true,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -5,15 +5,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = false,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -16,15 +16,19 @@ static bool checkColumnsAlreadyDistinct(const Names & columns, const NameSet & d
|
||||
return columns_already_distinct;
|
||||
}
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(bool pre_distinct, bool already_distinct_columns)
|
||||
static ITransformingStep::Traits getTraits(bool pre_distinct, bool already_distinct_columns)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = already_distinct_columns, /// Will be calculated separately otherwise
|
||||
.returns_single_stream = !pre_distinct && !already_distinct_columns,
|
||||
.preserves_number_of_streams = pre_distinct || already_distinct_columns,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = true, /// Sorting is preserved indeed because of implementation.
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -8,15 +8,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(const ExpressionActionsPtr & expression)
|
||||
static ITransformingStep::Traits getTraits(const ExpressionActionsPtr & expression)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = !expression->hasJoinOrArrayJoin(),
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = !expression->hasJoinOrArrayJoin(),
|
||||
.preserves_sorting = !expression->hasJoinOrArrayJoin(),
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = !expression->hasJoinOrArrayJoin(),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -4,15 +4,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = true,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = true,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -11,15 +11,19 @@ namespace ErrorCodes
|
||||
extern const int LOGICAL_ERROR;
|
||||
}
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = false, /// TODO: it seem to actually be true. Check it later.
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -7,15 +7,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(const ExpressionActionsPtr & expression)
|
||||
static ITransformingStep::Traits getTraits(const ExpressionActionsPtr & expression)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = !expression->hasJoinOrArrayJoin(), /// I suppose it actually never happens
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -9,15 +9,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(size_t limit)
|
||||
static ITransformingStep::Traits getTraits(size_t limit)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -4,19 +4,20 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
ITransformingStep::ITransformingStep(DataStream input_stream, Block output_header, DataStreamTraits traits, bool collect_processors_)
|
||||
: collect_processors(collect_processors_)
|
||||
, transform_traits(traits)
|
||||
ITransformingStep::ITransformingStep(DataStream input_stream, Block output_header, Traits traits, bool collect_processors_)
|
||||
: transform_traits(std::move(traits.transform_traits))
|
||||
, collect_processors(collect_processors_)
|
||||
, data_stream_traits(std::move(traits.data_stream_traits))
|
||||
{
|
||||
output_stream = DataStream{.header = std::move(output_header)};
|
||||
|
||||
if (traits.preserves_distinct_columns)
|
||||
if (data_stream_traits.preserves_distinct_columns)
|
||||
output_stream->distinct_columns = input_stream.distinct_columns;
|
||||
|
||||
output_stream->has_single_port = traits.returns_single_stream
|
||||
|| (input_stream.has_single_port && traits.preserves_number_of_streams);
|
||||
output_stream->has_single_port = data_stream_traits.returns_single_stream
|
||||
|| (input_stream.has_single_port && data_stream_traits.preserves_number_of_streams);
|
||||
|
||||
if (traits.preserves_sorting)
|
||||
if (data_stream_traits.preserves_sorting)
|
||||
{
|
||||
output_stream->sort_description = input_stream.sort_description;
|
||||
output_stream->sort_mode = input_stream.sort_mode;
|
||||
|
@ -9,6 +9,8 @@ namespace DB
|
||||
class ITransformingStep : public IQueryPlanStep
|
||||
{
|
||||
public:
|
||||
/// This flags are used to automatically set properties for output stream.
|
||||
/// They are specified in constructor and cannot be changed.
|
||||
struct DataStreamTraits
|
||||
{
|
||||
/// Keep distinct_columns unchanged.
|
||||
@ -24,22 +26,34 @@ public:
|
||||
/// Examples: true for ExpressionStep, false for MergeSortingStep
|
||||
bool preserves_number_of_streams;
|
||||
|
||||
/// Won't change the total number of rows.
|
||||
/// Examples: true ExpressionStep (without join or array join), false for FilterStep
|
||||
bool preserves_number_of_rows;
|
||||
|
||||
/// Doesn't change row order.
|
||||
/// Examples: true FilterStep, false for PartialSortingStep
|
||||
bool preserves_sorting;
|
||||
};
|
||||
|
||||
ITransformingStep(DataStream input_stream, Block output_header, DataStreamTraits traits, bool collect_processors_ = true);
|
||||
/// This flags are used by QueryPlan optimizers.
|
||||
/// They can be changed after some optimizations.
|
||||
struct TransformTraits
|
||||
{
|
||||
/// Won't change the total number of rows.
|
||||
/// Examples: true ExpressionStep (without join or array join), false for FilterStep
|
||||
bool preserves_number_of_rows;
|
||||
};
|
||||
|
||||
struct Traits
|
||||
{
|
||||
DataStreamTraits data_stream_traits;
|
||||
TransformTraits transform_traits;
|
||||
};
|
||||
|
||||
ITransformingStep(DataStream input_stream, Block output_header, Traits traits, bool collect_processors_ = true);
|
||||
|
||||
QueryPipelinePtr updatePipeline(QueryPipelines pipelines) override;
|
||||
|
||||
virtual void transformPipeline(QueryPipeline & pipeline) = 0;
|
||||
|
||||
const DataStreamTraits & getTransformTraits() const { return transform_traits; }
|
||||
const TransformTraits & getTransformTraits() const { return transform_traits; }
|
||||
const DataStreamTraits & getDataStreamTraits() const { return data_stream_traits; }
|
||||
|
||||
void describePipeline(FormatSettings & settings) const override;
|
||||
|
||||
@ -47,12 +61,14 @@ protected:
|
||||
/// Clear distinct_columns if res_header doesn't contain all of them.
|
||||
static void updateDistinctColumns(const Block & res_header, NameSet & distinct_columns);
|
||||
|
||||
TransformTraits transform_traits;
|
||||
|
||||
private:
|
||||
/// We collect processors got after pipeline transformation.
|
||||
Processors processors;
|
||||
bool collect_processors;
|
||||
|
||||
DataStreamTraits transform_traits;
|
||||
const DataStreamTraits data_stream_traits;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(size_t limit)
|
||||
static ITransformingStep::Traits getTraits(size_t limit)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -7,15 +7,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = false,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(size_t limit)
|
||||
static ITransformingStep::Traits getTraits(size_t limit)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -6,15 +6,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -7,15 +7,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(size_t limit)
|
||||
static ITransformingStep::Traits getTraits(size_t limit)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = false,
|
||||
.preserves_number_of_streams = true,
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = limit == 0,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -315,7 +315,7 @@ static void tryPushDownLimit(QueryPlanStepPtr & parent, QueryPlanStepPtr & child
|
||||
if (!limit)
|
||||
return;
|
||||
|
||||
const auto * transforming = typeid_cast<const ITransformingStep *>(child.get());
|
||||
const auto * transforming = dynamic_cast<const ITransformingStep *>(child.get());
|
||||
|
||||
/// Skip everything which is not transform.
|
||||
if (!transforming)
|
||||
@ -323,14 +323,15 @@ static void tryPushDownLimit(QueryPlanStepPtr & parent, QueryPlanStepPtr & child
|
||||
|
||||
/// Now we should decide if pushing down limit possible for this step.
|
||||
|
||||
const auto & traits = transforming->getTransformTraits();
|
||||
const auto & transform_traits = transforming->getTransformTraits();
|
||||
const auto & data_stream_traits = transforming->getDataStreamTraits();
|
||||
|
||||
/// Cannot push down if child changes the number of rows.
|
||||
if (!traits.preserves_number_of_rows)
|
||||
if (!transform_traits.preserves_number_of_rows)
|
||||
return;
|
||||
|
||||
/// Cannot push down if data was sorted exactly by child stream.
|
||||
if (!child->getOutputStream().sort_description.empty() && !traits.preserves_sorting)
|
||||
if (!child->getOutputStream().sort_description.empty() && !data_stream_traits.preserves_sorting)
|
||||
return;
|
||||
|
||||
parent.swap(child);
|
||||
|
@ -5,15 +5,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits()
|
||||
static ITransformingStep::Traits getTraits()
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = false,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = false,
|
||||
.preserves_sorting = false,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = false,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -8,15 +8,19 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
static ITransformingStep::DataStreamTraits getTraits(bool has_filter)
|
||||
static ITransformingStep::Traits getTraits(bool has_filter)
|
||||
{
|
||||
return ITransformingStep::DataStreamTraits
|
||||
return ITransformingStep::Traits
|
||||
{
|
||||
{
|
||||
.preserves_distinct_columns = true,
|
||||
.returns_single_stream = true,
|
||||
.preserves_number_of_streams = false,
|
||||
.preserves_number_of_rows = !has_filter,
|
||||
.preserves_sorting = true,
|
||||
},
|
||||
{
|
||||
.preserves_number_of_rows = !has_filter,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user