#pragma once #include namespace DB { /** Интерфейс для ноль-арных агрегатных функций. Это, например, агрегатная функция count. */ template class INullaryAggregateFunction : public IAggregateFunctionHelper { private: Derived & getDerived() { return static_cast(*this); } const Derived & getDerived() const { return static_cast(*this); } public: /// Получить тип результата по типам аргументов. Если функция неприменима для данных аргументов - кинуть исключение. void setArguments(const DataTypes & arguments) override final { if (arguments.size() != 0) throw Exception("Passed " + toString(arguments.size()) + " arguments to nullary aggregate function " + this->getName(), ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH); } /// Добавить значение. void add(AggregateDataPtr place, const IColumn ** columns, size_t row_num) const override final { getDerived().addImpl(place); } static void addFree(const IAggregateFunction * that, AggregateDataPtr place, const IColumn ** columns, size_t row_num) { return static_cast(*that).addImpl(place); } IAggregateFunction::AddFunc getAddressOfAddFunction() const override final { return &addFree; } /** Реализуйте это в классе-наследнике: * void addImpl(AggregateDataPtr place) const; */ }; }