#pragma once #include #include #include #include #include #include #include namespace DB { /** Тип данных для представления подмножества строк и столбцов в оперативке. * Содержит также метаданные (типы) столбцов и их имена. * Позволяет вставлять, удалять столбцы в любом порядке, менять порядок столбцов. */ class Block { public: typedef std::list Container_t; typedef std::vector IndexByPosition_t; typedef std::map IndexByName_t; private: Container_t data; IndexByPosition_t index_by_position; IndexByName_t index_by_name; void rebuildIndexByPosition(); public: Block() {} /// нужны, чтобы правильно скопировались индексы Block(const Block & other); Block & operator= (const Block & other); /// вставить столбец в заданную позицию void insert(size_t position, const ColumnWithNameAndType & elem); /// вставить столбец в конец void insert(const ColumnWithNameAndType & elem); /// вставить столбец в конец, если столбца с таким именем ещё нет void insertUnique(const ColumnWithNameAndType & elem); /// удалить столбец в заданной позиции void erase(size_t position); ColumnWithNameAndType & getByPosition(size_t position); const ColumnWithNameAndType & getByPosition(size_t position) const; ColumnWithNameAndType & getByName(const std::string & name); const ColumnWithNameAndType & getByName(const std::string & name) const; size_t getPositionByName(const std::string & name) const; NamesAndTypesList getColumnsList() const; /** Возвращает количество строк в блоке. * Заодно проверяет, что все столбцы кроме констант (которые содержат единственное значение), * содержат одинаковое число значений. */ size_t rows() const; size_t columns() const; operator bool() const { return !data.empty(); } bool operator!() const { return data.empty(); } /** Получить список имён столбцов через запятую. */ std::string dumpNames() const; /** Получить такой же блок, но пустой. */ Block cloneEmpty() const; }; }