2011-09-19 01:42:16 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/AggregateFunctions/IAggregateFunction.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/DataTypes/IDataType.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
using Poco::SharedPtr;
|
|
|
|
|
|
|
|
|
|
/** Тип - состояние агрегатной функции.
|
2014-03-25 18:16:26 +00:00
|
|
|
|
* Параметры типа - это агрегатная функция, типы её аргументов и её параметры (для параметрических агрегатных функций).
|
2011-09-19 01:42:16 +00:00
|
|
|
|
*/
|
|
|
|
|
class DataTypeAggregateFunction : public IDataType
|
|
|
|
|
{
|
|
|
|
|
private:
|
2012-10-24 18:14:36 +00:00
|
|
|
|
AggregateFunctionPtr function;
|
|
|
|
|
DataTypes argument_types;
|
2014-03-25 18:16:26 +00:00
|
|
|
|
Array parameters;
|
2011-09-19 01:42:16 +00:00
|
|
|
|
|
|
|
|
|
public:
|
2014-03-25 18:16:26 +00:00
|
|
|
|
DataTypeAggregateFunction(const AggregateFunctionPtr & function_, const DataTypes & argument_types_, const Array & parameters_)
|
|
|
|
|
: function(function_), argument_types(argument_types_), parameters(parameters_)
|
2012-10-24 18:14:36 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
2014-05-21 13:27:40 +00:00
|
|
|
|
|
|
|
|
|
std::string getFunctionName() const { return function->getName(); }
|
2012-10-24 18:14:36 +00:00
|
|
|
|
|
|
|
|
|
std::string getName() const
|
|
|
|
|
{
|
|
|
|
|
std::stringstream stream;
|
|
|
|
|
stream << "AggregateFunction(" << function->getName();
|
|
|
|
|
|
2014-03-25 18:16:26 +00:00
|
|
|
|
if (!parameters.empty())
|
|
|
|
|
{
|
|
|
|
|
stream << "(";
|
|
|
|
|
for (size_t i = 0; i < parameters.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if (i)
|
|
|
|
|
stream << ", ";
|
|
|
|
|
stream << apply_visitor(DB::FieldVisitorToString(), parameters[i]);
|
|
|
|
|
}
|
|
|
|
|
stream << ")";
|
|
|
|
|
}
|
|
|
|
|
|
2012-10-24 18:14:36 +00:00
|
|
|
|
for (DataTypes::const_iterator it = argument_types.begin(); it != argument_types.end(); ++it)
|
|
|
|
|
stream << ", " << (*it)->getName();
|
|
|
|
|
|
|
|
|
|
stream << ")";
|
|
|
|
|
return stream.str();
|
|
|
|
|
}
|
2014-05-21 13:27:40 +00:00
|
|
|
|
|
2014-05-22 14:09:10 +00:00
|
|
|
|
DataTypePtr getReturnType() const { return function->getReturnType(); };
|
2014-05-21 13:27:40 +00:00
|
|
|
|
DataTypes getArgumentsDataTypes() const { return argument_types; }
|
2011-09-19 01:42:16 +00:00
|
|
|
|
|
2014-03-25 18:16:26 +00:00
|
|
|
|
DataTypePtr clone() const { return new DataTypeAggregateFunction(function, argument_types, parameters); }
|
2011-09-19 01:42:16 +00:00
|
|
|
|
|
|
|
|
|
void serializeBinary(const Field & field, WriteBuffer & ostr) const;
|
|
|
|
|
void deserializeBinary(Field & field, ReadBuffer & istr) const;
|
2012-12-11 20:31:39 +00:00
|
|
|
|
void serializeBinary(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const;
|
2011-09-19 01:42:16 +00:00
|
|
|
|
void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const;
|
|
|
|
|
void serializeText(const Field & field, WriteBuffer & ostr) const;
|
|
|
|
|
void deserializeText(Field & field, ReadBuffer & istr) const;
|
|
|
|
|
void serializeTextEscaped(const Field & field, WriteBuffer & ostr) const;
|
|
|
|
|
void deserializeTextEscaped(Field & field, ReadBuffer & istr) const;
|
2012-08-26 06:48:39 +00:00
|
|
|
|
void serializeTextQuoted(const Field & field, WriteBuffer & ostr) const;
|
|
|
|
|
void deserializeTextQuoted(Field & field, ReadBuffer & istr) const;
|
2013-05-16 12:52:09 +00:00
|
|
|
|
void serializeTextJSON(const Field & field, WriteBuffer & ostr) const;
|
2011-09-19 01:42:16 +00:00
|
|
|
|
|
|
|
|
|
ColumnPtr createColumn() const;
|
|
|
|
|
ColumnPtr createConstColumn(size_t size, const Field & field) const;
|
2012-08-13 20:16:06 +00:00
|
|
|
|
|
|
|
|
|
Field getDefault() const
|
|
|
|
|
{
|
|
|
|
|
throw Exception("There is no default value for AggregateFunction data type", ErrorCodes::THERE_IS_NO_DEFAULT_VALUE);
|
|
|
|
|
}
|
2011-09-19 01:42:16 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|