[Opt](function) opt the function of ndv (#13887)
This commit is contained in:
@ -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(); }
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user