2011-09-19 03:40:05 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2011-12-19 08:06:31 +00:00
|
|
|
|
#include <memory>
|
|
|
|
|
|
2011-09-19 03:40:05 +00:00
|
|
|
|
#include <Poco/SharedPtr.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/Core/Row.h>
|
|
|
|
|
#include <DB/DataTypes/IDataType.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/** Интерфейс для агрегатных функций.
|
|
|
|
|
* Агрегатные функции аккумулируют значения, которые в них передают, держа в себе некоторое состояние.
|
2011-09-26 04:00:46 +00:00
|
|
|
|
* Поэтому, в отличие от обычных функций, вам необходимо при каждой агрегации, создавать новый экземпляр класса.
|
2011-09-19 03:40:05 +00:00
|
|
|
|
*/
|
|
|
|
|
class IAggregateFunction
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
/// Получить основное имя функции.
|
|
|
|
|
virtual String getName() const = 0;
|
|
|
|
|
|
2011-09-25 05:07:47 +00:00
|
|
|
|
/// Получить строку, по которой можно потом будет создать объект того же типа (с помощью AggregateFunctionFactory)
|
|
|
|
|
virtual String getTypeID() const = 0;
|
|
|
|
|
|
2011-09-19 03:40:05 +00:00
|
|
|
|
/// Создать новую агрегатную функцию того же типа.
|
2011-12-19 08:06:31 +00:00
|
|
|
|
virtual IAggregateFunction* cloneEmpty() const = 0;
|
2011-09-19 03:40:05 +00:00
|
|
|
|
|
|
|
|
|
/** Указать типы аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
|
|
|
|
|
* Необходимо вызывать перед остальными вызовами.
|
|
|
|
|
*/
|
|
|
|
|
virtual void setArguments(const DataTypes & arguments) = 0;
|
|
|
|
|
|
2012-10-29 02:58:52 +00:00
|
|
|
|
/** Указать параметры - для параметрических агрегатных функций.
|
|
|
|
|
* Если параметры не предусмотрены или переданные параметры недопустимы - кинуть исключение.
|
|
|
|
|
* Если параметры есть - необходимо вызывать перед остальными вызовами, иначе - не вызывать.
|
|
|
|
|
*/
|
|
|
|
|
virtual void setParameters(const Row & params)
|
|
|
|
|
{
|
|
|
|
|
throw Exception("Aggregate function " + getName() + " doesn't allow parameters.", ErrorCodes::AGGREGATE_FUNCTION_DOESNT_ALLOW_PARAMETERS);
|
|
|
|
|
}
|
|
|
|
|
|
2011-09-19 03:40:05 +00:00
|
|
|
|
/// Получить тип результата.
|
|
|
|
|
virtual DataTypePtr getReturnType() const = 0;
|
|
|
|
|
|
|
|
|
|
/// Добавить значение.
|
|
|
|
|
virtual void add(const Row & row) = 0;
|
|
|
|
|
|
|
|
|
|
/// Объединить состояние с другой агрегатной функцией.
|
|
|
|
|
virtual void merge(const IAggregateFunction & rhs) = 0;
|
|
|
|
|
|
|
|
|
|
/// Сериализовать состояние (например, для передачи по сети).
|
|
|
|
|
virtual void serialize(WriteBuffer & buf) const = 0;
|
|
|
|
|
|
|
|
|
|
/// Десериализовать состояние и объединить своё состояние с ним.
|
|
|
|
|
virtual void deserializeMerge(ReadBuffer & buf) = 0;
|
|
|
|
|
|
|
|
|
|
/// Получить результат
|
|
|
|
|
virtual Field getResult() const = 0;
|
2012-11-19 03:38:13 +00:00
|
|
|
|
|
2012-11-16 22:09:47 +00:00
|
|
|
|
virtual ~IAggregateFunction() {};
|
2011-09-19 03:40:05 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using Poco::SharedPtr;
|
|
|
|
|
|
|
|
|
|
typedef SharedPtr<IAggregateFunction> AggregateFunctionPtr;
|
2011-12-19 08:06:31 +00:00
|
|
|
|
typedef IAggregateFunction* AggregateFunctionPlainPtr;
|
|
|
|
|
typedef std::vector<AggregateFunctionPlainPtr> AggregateFunctionsPlainPtrs;
|
2011-09-19 03:40:05 +00:00
|
|
|
|
|
|
|
|
|
template <> struct TypeName<AggregateFunctionPtr> { static std::string get() { return "AggregateFunctionPtr"; } };
|
|
|
|
|
template <> struct NearestFieldType<AggregateFunctionPtr> { typedef AggregateFunctionPtr Type; };
|
|
|
|
|
|
|
|
|
|
}
|