dbms: better [#METR-2944].

This commit is contained in:
Alexey Milovidov 2015-11-21 21:56:54 +03:00
parent 8a592860ef
commit 6584d9ca6c
2 changed files with 12 additions and 14 deletions

View File

@ -600,7 +600,8 @@ public:
/** То же самое, но с двумя аргументами. Второй аргумент - "вес" (целое число) - сколько раз учитывать значение.
*/
template <typename ArgumentFieldType, typename WeightFieldType>
class AggregateFunctionQuantileTimingWeighted final : public IAggregateFunctionHelper<QuantileTiming>
class AggregateFunctionQuantileTimingWeighted final
: public IBinaryAggregateFunction<QuantileTiming, AggregateFunctionQuantileTimingWeighted<ArgumentFieldType, WeightFieldType>>
{
private:
double level;
@ -615,7 +616,7 @@ public:
return new DataTypeFloat32;
}
void setArguments(const DataTypes & arguments) override
void setArgumentsImpl(const DataTypes & arguments)
{
}
@ -627,12 +628,11 @@ public:
level = apply_visitor(FieldVisitorConvertToNumber<Float64>(), params[0]);
}
void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num) const override
void addImpl(AggregateDataPtr place, const IColumn & column_value, const IColumn & column_weight, size_t row_num) const
{
this->data(place).insertWeighted(
static_cast<const ColumnVector<ArgumentFieldType> &>(*columns[0]).getData()[row_num],
static_cast<const ColumnVector<WeightFieldType> &>(*columns[1]).getData()[row_num]);
static_cast<const ColumnVector<ArgumentFieldType> &>(column_value).getData()[row_num],
static_cast<const ColumnVector<WeightFieldType> &>(column_weight).getData()[row_num]);
}
void merge(AggregateDataPtr place, ConstAggregateDataPtr rhs) const override

View File

@ -1,6 +1,7 @@
#pragma once
#include <DB/AggregateFunctions/AggregateFunctionsMinMaxAny.h>
#include <DB/AggregateFunctions/IBinaryAggregateFunction.h>
namespace DB
@ -20,7 +21,7 @@ struct AggregateFunctionsArgMinMaxData
/// Возвращает первое попавшееся значение arg для минимального/максимального value. Пример: argMax(arg, value).
template <typename Data>
class AggregateFunctionsArgMinMax final : public IAggregateFunctionHelper<Data>
class AggregateFunctionsArgMinMax final : public IBinaryAggregateFunction<Data, AggregateFunctionsArgMinMax<Data>>
{
private:
DataTypePtr type_res;
@ -34,19 +35,16 @@ public:
return type_res;
}
void setArguments(const DataTypes & arguments) override
void setArgumentsImpl(const DataTypes & arguments)
{
if (arguments.size() != 2)
throw Exception("Aggregate function " + getName() + " requires exactly two arguments.", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
type_res = arguments[0];
type_val = arguments[1];
}
void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num) const override
void addImpl(AggregateDataPtr place, const IColumn & columns_arg, const IColumn & column_max, size_t row_num) const
{
if (this->data(place).value.changeIfBetter(*columns[1], row_num))
this->data(place).result.change(*columns[0], row_num);
if (this->data(place).value.changeIfBetter(columns_arg, row_num))
this->data(place).result.change(column_max, row_num);
}
void merge(AggregateDataPtr place, ConstAggregateDataPtr rhs) const override