#pragma once #include #include #include #include #include namespace DB { using Poco::SharedPtr; /** шаблон для столбцов-констант (столбцов одинаковых значений). */ template class ColumnConst : public IColumn { public: typedef T Type; ColumnConst(size_t s_, const T & data_) : s(s_), data(data_) {} bool isNumeric() const { return IsNumber::value; } ColumnPtr cloneEmpty() const { return new ColumnConst(0, data); } size_t size() const { return s; } Field operator[](size_t n) const { return typename NearestFieldType::Type(data); } void cut(size_t start, size_t length) { s = length; } void clear() { s = 0; } void insert(const Field & x) { throw Exception("Cannot insert element into constant column", ErrorCodes::CANNOT_INSERT_ELEMENT_INTO_CONSTANT_COLUMN); } void insertDefault() { ++s; } void filter(const Filter & filt) {} /** Более эффективные методы манипуляции */ T & getData() { return data; } const T & getData() const { return data; } /** Преобразование из константы в полноценный столбец */ // virtual ColumnPtr convertToFullColumn() const = 0; private: size_t s; T data; }; typedef ColumnConst ColumnConstString; }