ClickHouse/dbms/include/DB/DataTypes/IDataType.h

105 lines
4.7 KiB
C
Raw Normal View History

2011-08-09 19:19:00 +00:00
#pragma once
2010-03-01 16:59:51 +00:00
2012-07-18 18:27:42 +00:00
#include <boost/function.hpp>
2010-03-18 19:32:14 +00:00
#include <Poco/SharedPtr.h>
2010-03-01 16:59:51 +00:00
#include <DB/Core/Field.h>
2010-06-04 18:25:25 +00:00
#include <DB/IO/ReadBuffer.h>
#include <DB/IO/WriteBuffer.h>
2010-03-12 18:25:35 +00:00
#include <DB/Columns/IColumn.h>
2010-03-01 16:59:51 +00:00
namespace DB
{
2010-03-18 19:32:14 +00:00
using Poco::SharedPtr;
2010-03-01 16:59:51 +00:00
/** Метаданные типа для хранения (столбца).
* Содержит методы для сериализации/десериализации.
*/
2010-03-05 17:38:01 +00:00
class IDataType
2010-03-01 16:59:51 +00:00
{
public:
2011-08-18 20:33:20 +00:00
/// Основное имя типа (например, UInt64).
2010-03-01 16:59:51 +00:00
virtual std::string getName() const = 0;
/// Является ли тип числовым. Дата и дата-с-временем тоже считаются такими.
2011-08-18 20:33:20 +00:00
virtual bool isNumeric() const { return false; }
/// Если тип числовой, уместны ли с ним все арифметические операции и приведение типов.
/// true для чисел, false для даты и даты-с-временем.
virtual bool behavesAsNumber() const { return false; }
2010-05-21 19:52:50 +00:00
/// Клонировать
virtual SharedPtr<IDataType> clone() const = 0;
2010-03-01 16:59:51 +00:00
/** Бинарная сериализация - для сохранения на диск / в сеть и т. п.
* Обратите внимание, что присутствует по два вида методов
* - для работы с единичными значениями и целыми столбцами.
*/
2010-06-04 18:25:25 +00:00
virtual void serializeBinary(const Field & field, WriteBuffer & ostr) const = 0;
virtual void deserializeBinary(Field & field, ReadBuffer & istr) const = 0;
2012-07-18 18:27:42 +00:00
/** Сериализация столбца.
* offset и limit используются, чтобы сериализовать часть столбца.
* limit = 0 - означает - не ограничено.
* offset не должен быть больше размера столбца.
* offset + limit может быть больше размера столбца
* - в этом случае, столбец сериализуется до конца.
2012-07-18 18:27:42 +00:00
*/
virtual void serializeBinary(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const = 0;
/** Считать не более limit значений и дописать их в конец столбца.
* avg_value_size_hint - если не 0, то может использоваться, чтобы избежать реаллокаций при чтении строкового столбца.
*/
virtual void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit, double avg_value_size_hint) const = 0;
2010-03-01 16:59:51 +00:00
/** Текстовая сериализация - для вывода на экран / сохранения в текстовый файл и т. п.
* Без эскейпинга и квотирования.
*/
2010-06-04 18:25:25 +00:00
virtual void serializeText(const Field & field, WriteBuffer & ostr) const = 0;
virtual void deserializeText(Field & field, ReadBuffer & istr) const = 0;
2010-03-01 16:59:51 +00:00
/** Текстовая сериализация с эскейпингом, но без квотирования.
*/
2010-06-04 18:25:25 +00:00
virtual void serializeTextEscaped(const Field & field, WriteBuffer & ostr) const = 0;
virtual void deserializeTextEscaped(Field & field, ReadBuffer & istr) const = 0;
2010-03-01 16:59:51 +00:00
/** Текстовая сериализация в виде литерала, который может быть вставлен в запрос.
*/
2012-08-26 06:48:39 +00:00
virtual void serializeTextQuoted(const Field & field, WriteBuffer & ostr) const = 0;
virtual void deserializeTextQuoted(Field & field, ReadBuffer & istr) const = 0;
2013-05-16 12:52:09 +00:00
/** Текстовая сериализация в виде литерала для использования в формате JSON.
*/
virtual void serializeTextJSON(const Field & field, WriteBuffer & ostr) const = 0;
2010-03-01 16:59:51 +00:00
2010-03-18 19:32:14 +00:00
/** Создать пустой столбец соответствующего типа.
*/
virtual SharedPtr<IColumn> createColumn() const = 0;
2010-03-01 16:59:51 +00:00
2011-08-12 18:27:39 +00:00
/** Создать столбец соответствующего типа, содержащий константу со значением Field, длины size.
*/
virtual SharedPtr<IColumn> createConstColumn(size_t size, const Field & field) const = 0;
2012-08-13 20:16:06 +00:00
/** Получить значение "по-умолчанию".
*/
virtual Field getDefault() const = 0;
2012-05-09 13:12:38 +00:00
/// Вернуть приблизительный (оценочный) размер значения.
virtual size_t getSizeOfField() const
{
throw Exception("getSizeOfField() method is not implemented for data type " + getName(), ErrorCodes::NOT_IMPLEMENTED);
}
2010-03-05 17:38:01 +00:00
virtual ~IDataType() {}
2010-03-01 16:59:51 +00:00
};
2011-08-09 19:19:00 +00:00
typedef Poco::SharedPtr<IDataType> DataTypePtr;
typedef std::vector<DataTypePtr> DataTypes;
2010-03-01 16:59:51 +00:00
}