[Opt](function) opt the function of ndv (#13887)

This commit is contained in:
HappenLee
2022-11-02 22:21:20 +08:00
committed by GitHub
parent 62f765b7f5
commit fbc8b7311f
3 changed files with 31 additions and 8 deletions

View File

@ -22,6 +22,7 @@
#include "udf/udf.h"
#include "vec/aggregate_functions/aggregate_function.h"
#include "vec/aggregate_functions/aggregate_function_simple_factory.h"
#include "vec/common/hash_table/hash.h"
#include "vec/common/string_ref.h"
#include "vec/data_types/data_type_number.h"
#include "vec/io/io_helper.h"
@ -31,9 +32,7 @@ namespace doris::vectorized {
struct AggregateFunctionApproxCountDistinctData {
HyperLogLog hll_data;
void add(StringRef value) {
StringVal sv = value.to_string_val();
uint64_t hash_value = AnyValUtil::hash64_murmur(sv, HashUtil::MURMUR_SEED);
void add(uint64_t hash_value) {
if (hash_value != 0) {
hll_data.update(hash_value);
}
@ -80,7 +79,17 @@ public:
void add(AggregateDataPtr __restrict place, const IColumn** columns, size_t row_num,
Arena*) const override {
this->data(place).add(static_cast<const ColumnDataType*>(columns[0])->get_data_at(row_num));
if constexpr (IsFixLenColumnType<ColumnDataType>::value) {
auto column = static_cast<const ColumnDataType*>(columns[0]);
auto value = column->get_element(row_num);
this->data(place).add(
HashUtil::murmur_hash64A((char*)&value, sizeof(value), HashUtil::MURMUR_SEED));
} else {
auto value = static_cast<const ColumnDataType*>(columns[0])->get_data_at(row_num);
StringVal sv = value.to_string_val();
uint64_t hash_value = AnyValUtil::hash64_murmur(sv, HashUtil::MURMUR_SEED);
this->data(place).add(hash_value);
}
}
void reset(AggregateDataPtr place) const override { this->data(place).reset(); }

View File

@ -298,8 +298,4 @@ ColumnPtr ColumnDecimal<T>::index_impl(const PaddedPODArray<Type>& indexes, size
return res;
}
using ColumnDecimal32 = ColumnDecimal<Decimal32>;
using ColumnDecimal64 = ColumnDecimal<Decimal64>;
using ColumnDecimal128 = ColumnDecimal<Decimal128>;
} // namespace doris::vectorized

View File

@ -20,6 +20,7 @@
#pragma once
#include "vec/columns/column_decimal.h"
#include "vec/columns/column_vector.h"
#include "vec/core/types.h"
@ -48,4 +49,21 @@ using ColumnDateTimeV2 = ColumnVector<UInt64>;
using ColumnFloat32 = ColumnVector<Float32>;
using ColumnFloat64 = ColumnVector<Float64>;
using ColumnDecimal32 = ColumnDecimal<Decimal32>;
using ColumnDecimal64 = ColumnDecimal<Decimal64>;
using ColumnDecimal128 = ColumnDecimal<Decimal128>;
template <typename T>
struct IsFixLenColumnType {
static constexpr bool value = false;
};
template <typename... Arg>
struct IsFixLenColumnType<ColumnVector<Arg...>> {
static constexpr bool value = true;
};
template <typename... Arg>
struct IsFixLenColumnType<ColumnDecimal<Arg...>> {
static constexpr bool value = true;
};
} // namespace doris::vectorized