ClickHouse/dbms/include/DB/Columns/IColumn.h

140 lines
6.4 KiB
C
Raw Normal View History

2011-08-22 08:43:52 +00:00
#pragma once
2010-03-12 18:25:35 +00:00
2010-05-21 19:52:50 +00:00
#include <Poco/SharedPtr.h>
2010-03-12 18:25:35 +00:00
#include <DB/Core/Field.h>
2011-09-26 12:50:50 +00:00
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
#include <DB/Core/StringRef.h>
2010-03-12 18:25:35 +00:00
2011-08-22 08:43:52 +00:00
2010-03-12 18:25:35 +00:00
namespace DB
{
2010-05-21 19:52:50 +00:00
using Poco::SharedPtr;
2011-08-22 08:43:52 +00:00
class IColumn;
typedef SharedPtr<IColumn> ColumnPtr;
typedef std::vector<ColumnPtr> Columns;
2012-07-25 19:53:43 +00:00
typedef std::vector<IColumn *> ColumnPlainPtrs;
typedef std::vector<const IColumn *> ConstColumnPlainPtrs;
2011-08-22 08:43:52 +00:00
2010-03-12 18:25:35 +00:00
/** Интерфейс для хранения столбцов значений в оперативке.
*/
class IColumn
{
public:
2011-08-28 00:31:30 +00:00
/** Имя столбца. Для информационных сообщений.
*/
virtual std::string getName() const = 0;
2011-08-21 03:41:37 +00:00
/** Столбец представляет собой вектор чисел или числовую константу.
*/
virtual bool isNumeric() const { return false; }
2011-09-26 01:50:32 +00:00
/** Столбец представляет собой константу
*/
virtual bool isConst() const { return false; }
2011-09-26 12:50:50 +00:00
/** Для числовых столбцов - вернуть sizeof числового типа
*/
virtual size_t sizeOfField() const { throw Exception("Cannot get sizeOfField() for column " + getName(), ErrorCodes::CANNOT_GET_SIZE_OF_FIELD); }
2011-08-21 03:41:37 +00:00
2010-05-21 19:52:50 +00:00
/** Создать пустой столбец такого же типа */
virtual SharedPtr<IColumn> cloneEmpty() const = 0;
2010-05-20 19:29:04 +00:00
/** Количество значений в столбце. */
2010-03-12 18:25:35 +00:00
virtual size_t size() const = 0;
2011-08-28 08:02:11 +00:00
bool empty() const { return size() == 0; }
2010-05-20 19:29:04 +00:00
/** Получить значение n-го элемента.
* Используется для преобразования из блоков в строки (например, при выводе значений в текстовый дамп)
*/
2010-03-12 18:25:35 +00:00
virtual Field operator[](size_t n) const = 0;
/** То же самое, но позволяет избежать лишнего копирования, если Field, например, кладётся в контейнер.
*/
virtual void get(size_t n, Field & res) const = 0;
/** Получить кусок памяти, в котором хранится значение, если возможно.
* (если не реализуемо - кидает исключение)
* Используется для оптимизации некоторых вычислений (например, агрегации).
* Строки переменной длины возвращаются с нулём на конце.
*/
virtual StringRef getDataAt(size_t n) const = 0;
2010-05-20 19:29:04 +00:00
/** Удалить всё кроме диапазона элементов.
* Используется, например, для операции LIMIT.
*/
2010-03-12 18:25:35 +00:00
virtual void cut(size_t start, size_t length) = 0;
2010-05-20 19:29:04 +00:00
/** Вставить значение в конец столбца (количество значений увеличится на 1).
* Используется для преобразования из строк в блоки (например, при чтении значений из текстового дампа)
*/
virtual void insert(const Field & x) = 0;
/** Вставить значение в конец столбца из другого столбца такого же типа, по заданному индексу.
* Используется для merge-sort. Может быть реализована оптимальнее, чем реализация по-умолчанию.
*/
virtual void insertFrom(const IColumn & src, size_t n) { insert(src[n]); }
2010-05-20 19:29:04 +00:00
/** Вставить значение "по умолчанию".
* Используется, когда нужно увеличить размер столбца, но значение не имеет смысла.
* Например, для ColumnNullable, если взведён флаг null, то соответствующее значение во вложенном столбце игнорируется.
*/
virtual void insertDefault() = 0;
2011-08-22 08:43:52 +00:00
/** Соединить столбец с одним или несколькими другими.
* Используется при склейке маленьких блоков.
*/
//virtual void merge(const Columns & columns) = 0;
/** Оставить только значения, соответствующие фильтру.
* Используется для операции WHERE / HAVING.
*/
typedef std::vector<UInt8> Filter;
2011-08-22 20:24:45 +00:00
virtual void filter(const Filter & filt) = 0;
2011-08-22 08:43:52 +00:00
2011-09-04 00:22:19 +00:00
/** Переставить значения местами, используя указанную перестановку.
* Используется при сортировке.
*/
typedef std::vector<size_t> Permutation;
2011-09-04 00:22:19 +00:00
virtual void permute(const Permutation & perm) = 0;
/** Сравнить (*this)[n] и rhs[m].
* Вернуть отрицательное число, 0, или положительное число, если меньше, равно, или больше, соответственно.
* Используется при сортировке.
*/
virtual int compareAt(size_t n, size_t m, const IColumn & rhs) const = 0;
2011-09-26 11:05:38 +00:00
/** Получить перестановку чисел, такую, что их порядок соответствует порядку значений в столбце.
* Используется при сортировке.
*/
virtual Permutation getPermutation() const = 0;
2011-09-26 11:05:38 +00:00
2012-08-27 05:13:14 +00:00
/** Размножить все значения столько раз, сколько прописано в offsets.
* (i-е значение размножается в offsets[i] - offsets[i - 1] значений.)
*/
2012-09-17 04:31:25 +00:00
typedef UInt64 Offset_t;
typedef std::vector<Offset_t> Offsets_t;
2012-08-27 05:13:14 +00:00
virtual void replicate(const Offsets_t & offsets) = 0;
2010-05-13 16:13:38 +00:00
/** Очистить */
virtual void clear() = 0;
/** Если возможно - зарезервировать место для указанного количества элементов. Если невозможно или не поддерживается - ничего не делать.
* Функция влияет только на производительность.
*/
virtual void reserve(size_t n) {};
2011-08-27 22:43:31 +00:00
/** Приблизительный размер столбца в оперативке в байтах - для профайлинга. 0 - если неизвестно. */
2012-05-17 19:15:53 +00:00
virtual size_t byteSize() const = 0;
2011-08-27 22:43:31 +00:00
2010-03-12 18:25:35 +00:00
virtual ~IColumn() {}
};
}