ClickHouse/dbms/include/DB/AggregateFunctions/IAggregateFunction.h

129 lines
5.4 KiB
C
Raw Normal View History

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
{
typedef char * AggregateDataPtr;
typedef const char * ConstAggregateDataPtr;
2011-09-19 03:40:05 +00:00
/** Интерфейс для агрегатных функций.
* Экземпляры классов с этим интерфейсом не содержат самих данных для агрегации,
* а содержат лишь метаданные (описание) агрегатной функции,
* а также методы для создания, удаления и работы с данными.
* Данные, получающиеся во время агрегации (промежуточные состояния вычислений), хранятся в других объектах
* (которые могут быть созданы в каком-нибудь пуле),
* а IAggregateFunction - внешний интерфейс для манипулирования ими.
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
/** Указать типы аргументов. Если функция неприменима для данных аргументов - кинуть исключение.
* Необходимо вызывать перед остальными вызовами.
*/
virtual void setArguments(const DataTypes & arguments) = 0;
/** Указать параметры - для параметрических агрегатных функций.
* Если параметры не предусмотрены или переданные параметры недопустимы - кинуть исключение.
* Если параметры есть - необходимо вызывать перед остальными вызовами, иначе - не вызывать.
*/
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 ~IAggregateFunction() {};
/** Функции по работе с данными. */
/** Создать пустые данные для агрегации с помощью placement new в заданном месте.
* Вы должны будете уничтожить их с помощью метода destroy.
*/
virtual void create(AggregateDataPtr place) const = 0;
/// Уничтожить данные для агрегации.
virtual void destroy(AggregateDataPtr place) const = 0;
/// Получить sizeof структуры с данными.
virtual size_t sizeOfData() const = 0;
2013-02-09 02:20:26 +00:00
/// Как должна быть выровнена структура с данными. NOTE: Сейчас не используется (структуры с состоянием агрегации кладутся без выравнивания).
virtual size_t alignOfData() const = 0;
2011-09-19 03:40:05 +00:00
/// Добавить значение.
virtual void add(AggregateDataPtr place, const Row & row) const = 0;
2011-09-19 03:40:05 +00:00
/// Объединить состояние с другим состоянием.
/// Нельзя объединять с "пустым" состоянием, то есть - состоянием, для которого ни разу не был выполнен метод add.
virtual void merge(AggregateDataPtr place, ConstAggregateDataPtr rhs) const = 0;
2011-09-19 03:40:05 +00:00
/// Сериализовать состояние (например, для передачи по сети). Нельзя сериализовывать "пустое" состояние.
virtual void serialize(ConstAggregateDataPtr place, WriteBuffer & buf) const = 0;
2011-09-19 03:40:05 +00:00
/// Десериализовать состояние и объединить своё состояние с ним.
virtual void deserializeMerge(AggregateDataPtr place, ReadBuffer & buf) const = 0;
2011-09-19 03:40:05 +00:00
/// Получить результат
virtual Field getResult(ConstAggregateDataPtr place) const = 0;
};
/// Реализует несколько методов. T - тип структуры с данными для агрегации.
template <typename T>
class IAggregateFunctionHelper : public IAggregateFunction
{
protected:
typedef T Data;
2012-11-19 03:38:13 +00:00
static Data & data(AggregateDataPtr place) { return *reinterpret_cast<Data*>(place); }
static const Data & data(ConstAggregateDataPtr place) { return *reinterpret_cast<const Data*>(place); }
public:
void create(AggregateDataPtr place) const
{
new (place) Data;
}
void destroy(AggregateDataPtr place) const
{
data(place).~Data();
}
size_t sizeOfData() const
{
return sizeof(Data);
}
2013-02-09 02:20:26 +00:00
/// NOTE: Сейчас не используется (структуры с состоянием агрегации кладутся без выравнивания).
size_t alignOfData() const
{
return __alignof__(Data);
}
2011-09-19 03:40:05 +00:00
};
using Poco::SharedPtr;
typedef SharedPtr<IAggregateFunction> AggregateFunctionPtr;
}