1#include <AggregateFunctions/AggregateFunctionResample.h>
2
3#include <AggregateFunctions/AggregateFunctionCombinatorFactory.h>
4#include "registerAggregateFunctions.h"
5
6
7namespace DB
8{
9
10namespace ErrorCodes
11{
12 extern const int ILLEGAL_TYPE_OF_ARGUMENT;
13 extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
14}
15
16class AggregateFunctionCombinatorResample final : public IAggregateFunctionCombinator
17{
18public:
19 String getName() const override
20 {
21 return "Resample";
22 }
23
24 DataTypes transformArguments(const DataTypes & arguments) const override
25 {
26 if (arguments.empty())
27 throw Exception("Incorrect number of arguments for aggregate function with "
28 + getName() + " suffix",
29 ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
30
31 return DataTypes(arguments.begin(), arguments.end() - 1);
32 }
33
34 Array transformParameters(const Array & params) const override
35 {
36 if (params.size() < 3)
37 throw Exception("Incorrect number of parameters for aggregate function with "
38 + getName() + " suffix",
39 ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
40
41 return Array(params.begin(), params.end() - 3);
42 }
43
44 AggregateFunctionPtr transformAggregateFunction(
45 const AggregateFunctionPtr & nested_function,
46 const DataTypes & arguments,
47 const Array & params) const override
48 {
49 WhichDataType which{arguments.back()};
50
51 if (which.isNativeUInt() || which.isDateOrDateTime())
52 {
53 UInt64 begin = params[params.size() - 3].safeGet<UInt64>();
54 UInt64 end = params[params.size() - 2].safeGet<UInt64>();
55
56 UInt64 step = params[params.size() - 1].safeGet<UInt64>();
57
58 return std::make_shared<AggregateFunctionResample<UInt64>>(
59 nested_function,
60 begin,
61 end,
62 step,
63 arguments,
64 params);
65 }
66
67 if (which.isNativeInt() || which.isEnum() || which.isInterval())
68 {
69 Int64 begin, end;
70
71 // notice: UInt64 -> Int64 may lead to overflow
72 if (!params[params.size() - 3].tryGet<Int64>(begin))
73 begin = params[params.size() - 3].safeGet<UInt64>();
74 if (!params[params.size() - 2].tryGet<Int64>(end))
75 end = params[params.size() - 2].safeGet<UInt64>();
76
77 UInt64 step = params[params.size() - 1].safeGet<UInt64>();
78
79 return std::make_shared<AggregateFunctionResample<Int64>>(
80 nested_function,
81 begin,
82 end,
83 step,
84 arguments,
85 params);
86 }
87
88 throw Exception(
89 "Illegal types of argument for aggregate function " + getName()
90 + ", the type of the last argument should be native integer or integer-like",
91 ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
92 }
93};
94
95void registerAggregateFunctionCombinatorResample(AggregateFunctionCombinatorFactory & factory)
96{
97 factory.registerCombinator(std::make_shared<AggregateFunctionCombinatorResample>());
98}
99
100}
101