Skip to content

Commit 6b75714

Browse files
zhanglistarbaibaichen
authored andcommitted
bloomFilterContains process const col. indepdent.
1 parent ab5a691 commit 6b75714

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

cpp-ch/local-engine/Functions/FunctionsBloomFilter.h

+13-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#pragma once
1818

1919
#include <cstddef>
20+
#include <cstring>
2021
#include <memory>
2122
#include <type_traits>
2223
#include <AggregateFunctions/AggregateFunctionFactory.h>
@@ -118,7 +119,7 @@ class FunctionBloomFilterContains : public DB::IFunction
118119
mutable DB::AggregateFunctionPtr agg_func;
119120

120121
template <typename T>
121-
typename std::enable_if<std::is_same_v<T, Int64> || std::is_same_v<T, UInt64>, void>::type internalExecute(
122+
std::enable_if_t<std::is_same_v<T, Int64> || std::is_same_v<T, UInt64>, void> internalExecute(
122123
const DB::ColumnsWithTypeAndName & arguments,
123124
size_t input_rows_count,
124125
typename DB::ColumnVector<UInt8>::Container & vec_to,
@@ -129,16 +130,21 @@ class FunctionBloomFilterContains : public DB::IFunction
129130
const auto * column_ptr = arguments[1].column.get();
130131
auto second_arg_const = isColumnConst(*column_ptr);
131132

133+
AggregateFunctionGroupBloomFilterData & bloom_filter_data_0
134+
= *reinterpret_cast<AggregateFunctionGroupBloomFilterData *>(bloom_filter_state);
132135
if (second_arg_const)
133-
container_of_int = &typeid_cast<const ColumnType &>(typeid_cast<const DB::ColumnConst &>(*column_ptr).getDataColumn()).getData();
134-
else
135-
container_of_int = &typeid_cast<const ColumnType &>(*column_ptr).getData();
136+
{
137+
vec_to[0] = bloom_filter_data_0.bloom_filter.find(typeid_cast<const DB::ColumnConst &>(*column_ptr).getDataAt(0).data, sizeof(T));
138+
// copy to all rows, better use constant column
139+
std::memcpy(&vec_to[1], &vec_to[0], (input_rows_count - 1) * sizeof(UInt8));
136140

141+
return;
142+
}
143+
144+
container_of_int = &typeid_cast<const ColumnType &>(*column_ptr).getData();
137145
for (size_t i = 0; i < input_rows_count; ++i)
138146
{
139-
const T v = second_arg_const ? (*container_of_int)[0] : (*container_of_int)[i];
140-
AggregateFunctionGroupBloomFilterData & bloom_filter_data_0
141-
= *reinterpret_cast<AggregateFunctionGroupBloomFilterData *>(bloom_filter_state);
147+
const T v = (*container_of_int)[i];
142148
vec_to[i] = bloom_filter_data_0.bloom_filter.find(reinterpret_cast<const char *>(&v), sizeof(T));
143149
}
144150
}
@@ -195,7 +201,6 @@ class FunctionBloomFilterContains : public DB::IFunction
195201
arguments[0].type->getName());
196202
}
197203

198-
199204
const DB::IColumn * second_column_ptr = arguments[1].column.get();
200205
if (isColumnNullable(*second_column_ptr))
201206
second_column_ptr = &typeid_cast<const DB::ColumnNullable &>(*second_column_ptr).getNestedColumn();

0 commit comments

Comments
 (0)