1#include <AggregateFunctions/AggregateFunctionFactory.h>
2#include <AggregateFunctions/Helpers.h>
3#include <AggregateFunctions/FactoryHelpers.h>
4#include <DataTypes/DataTypeAggregateFunction.h>
5#include "registerAggregateFunctions.h"
6
7// TODO include this last because of a broken roaring header. See the comment
8// inside.
9#include <AggregateFunctions/AggregateFunctionGroupBitmap.h>
10
11namespace DB
12{
13
14namespace
15{
16
17template <template <typename> class Data>
18AggregateFunctionPtr createAggregateFunctionBitmap(const std::string & name, const DataTypes & argument_types, const Array & parameters)
19{
20 assertNoParameters(name, parameters);
21 assertUnary(name, argument_types);
22
23 if (!argument_types[0]->canBeUsedInBitOperations())
24 throw Exception("The type " + argument_types[0]->getName() + " of argument for aggregate function " + name
25 + " is illegal, because it cannot be used in Bitmap operations",
26 ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
27
28 AggregateFunctionPtr res(createWithUnsignedIntegerType<AggregateFunctionBitmap, Data>(*argument_types[0], argument_types[0]));
29
30 if (!res)
31 throw Exception("Illegal type " + argument_types[0]->getName() + " of argument for aggregate function " + name, ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
32
33 return res;
34}
35
36template <template <typename, typename> class AggregateFunctionTemplate>
37AggregateFunctionPtr createAggregateFunctionBitmapL2(const std::string & name, const DataTypes & argument_types, const Array & parameters)
38{
39 assertNoParameters(name, parameters);
40 assertUnary(name, argument_types);
41 DataTypePtr argument_type_ptr = argument_types[0];
42 WhichDataType which(*argument_type_ptr);
43 if (which.idx != TypeIndex::AggregateFunction)
44 throw Exception("Illegal type " + argument_types[0]->getName() + " of argument for aggregate function " + name, ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
45
46 const DataTypeAggregateFunction& datatype_aggfunc = dynamic_cast<const DataTypeAggregateFunction&>(*argument_type_ptr);
47 AggregateFunctionPtr aggfunc = datatype_aggfunc.getFunction();
48 argument_type_ptr = aggfunc->getArgumentTypes()[0];
49 AggregateFunctionPtr res(createWithUnsignedIntegerType<AggregateFunctionTemplate, AggregateFunctionGroupBitmapData>(*argument_type_ptr, argument_type_ptr));
50 if (!res)
51 throw Exception("Illegal type " + argument_types[0]->getName() + " of argument for aggregate function " + name, ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
52
53 return res;
54}
55
56}
57
58void registerAggregateFunctionsBitmap(AggregateFunctionFactory & factory)
59{
60 factory.registerFunction("groupBitmap", createAggregateFunctionBitmap<AggregateFunctionGroupBitmapData>);
61 factory.registerFunction("groupBitmapAnd", createAggregateFunctionBitmapL2<AggregateFunctionBitmapL2And>);
62 factory.registerFunction("groupBitmapOr", createAggregateFunctionBitmapL2<AggregateFunctionBitmapL2Or>);
63 factory.registerFunction("groupBitmapXor", createAggregateFunctionBitmapL2<AggregateFunctionBitmapL2Xor>);
64}
65
66}
67