fixing test results

This commit is contained in:
myrrc 2020-11-04 18:23:29 +03:00
parent 832d37c424
commit 591ebcef49
3 changed files with 1840 additions and 1835 deletions

View File

@ -37,7 +37,7 @@ struct AvgFraction
{ {
if constexpr (IsDecimalNumber<Numerator> && IsDecimalNumber<Denominator>) if constexpr (IsDecimalNumber<Numerator> && IsDecimalNumber<Denominator>)
{ {
if constexpr(std::is_same_v<Numerator, Decimal256> && std::is_same_v<Denominator, Decimal128>) if constexpr (std::is_same_v<Numerator, Decimal256> && std::is_same_v<Denominator, Decimal128>)
///Special case as Decimal256 / Decimal128 = compile error (as Decimal128 is not parametrized by a wide ///Special case as Decimal256 / Decimal128 = compile error (as Decimal128 is not parametrized by a wide
///int), but an __int128 instead ///int), but an __int128 instead
return DecimalUtils::convertTo<Float64>( return DecimalUtils::convertTo<Float64>(
@ -139,10 +139,15 @@ private:
}; };
template <class T> template <class T>
class AggregateFunctionAvg final : public AggregateFunctionAvgBase<T, UInt64, AggregateFunctionAvg<T>> using AvgFieldType = std::conditional_t<IsDecimalNumber<T>,
std::conditional_t<std::is_same_v<T, Decimal256>, Decimal256, Decimal128>,
NearestFieldType<T>>;
template <class T>
class AggregateFunctionAvg final : public AggregateFunctionAvgBase<AvgFieldType<T>, UInt64, AggregateFunctionAvg<T>>
{ {
public: public:
using AggregateFunctionAvgBase<T, UInt64, AggregateFunctionAvg<T>>::AggregateFunctionAvgBase; using AggregateFunctionAvgBase<AvgFieldType<T>, UInt64, AggregateFunctionAvg<T>>::AggregateFunctionAvgBase;
void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num, Arena *) const final void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num, Arena *) const final
{ {

View File

@ -6,24 +6,24 @@
namespace DB namespace DB
{ {
template <class T> template <class T>
using FieldType = std::conditional_t<IsDecimalNumber<T>, using AvgWeightedFieldType = std::conditional_t<IsDecimalNumber<T>,
std::conditional_t<std::is_same_v<T, Decimal256>, Decimal256, Decimal128>, std::conditional_t<std::is_same_v<T, Decimal256>, Decimal256, Decimal128>,
std::conditional_t<DecimalOrExtendedInt<T>, std::conditional_t<DecimalOrExtendedInt<T>,
Float64, // no way to do UInt128 * UInt128, better cast to Float64 Float64, // no way to do UInt128 * UInt128, better cast to Float64
NearestFieldType<T>>>; NearestFieldType<T>>>;
template <class T, class U> template <class T, class U>
using MaxFieldType = std::conditional_t<(sizeof(FieldType<T>) > sizeof(FieldType<U>)), using MaxFieldType = std::conditional_t<(sizeof(AvgWeightedFieldType<T>) > sizeof(AvgWeightedFieldType<U>)),
FieldType<T>, FieldType<U>>; AvgWeightedFieldType<T>, AvgWeightedFieldType<U>>;
template <class Value, class Weight> template <class Value, class Weight>
class AggregateFunctionAvgWeighted final : class AggregateFunctionAvgWeighted final :
public AggregateFunctionAvgBase< public AggregateFunctionAvgBase<
MaxFieldType<Value, Weight>, FieldType<Weight>, AggregateFunctionAvgWeighted<Value, Weight>> MaxFieldType<Value, Weight>, AvgWeightedFieldType<Weight>, AggregateFunctionAvgWeighted<Value, Weight>>
{ {
public: public:
using Base = AggregateFunctionAvgBase< using Base = AggregateFunctionAvgBase<
MaxFieldType<Value, Weight>, FieldType<Weight>, AggregateFunctionAvgWeighted<Value, Weight>>; MaxFieldType<Value, Weight>, AvgWeightedFieldType<Weight>, AggregateFunctionAvgWeighted<Value, Weight>>;
using Base::Base; using Base::Base;
using ValueT = MaxFieldType<Value, Weight>; using ValueT = MaxFieldType<Value, Weight>;
@ -35,7 +35,7 @@ public:
this->data(place).numerator += static_cast<ValueT>(value) * static_cast<ValueT>(weight); this->data(place).numerator += static_cast<ValueT>(value) * static_cast<ValueT>(weight);
this->data(place).denominator += static_cast<FieldType<Weight>>(weight); this->data(place).denominator += static_cast<AvgWeightedFieldType<Weight>>(weight);
} }
String getName() const override { return "avgWeighted"; } String getName() const override { return "avgWeighted"; }