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

79 lines
2.9 KiB
C
Raw Normal View History

2012-08-26 06:48:39 +00:00
#pragma once
#include <DB/DataTypes/IDataType.h>
namespace DB
{
using Poco::SharedPtr;
class DataTypeArray : public IDataType
{
private:
/// Тип элементов массивов.
DataTypePtr nested;
2012-08-26 11:14:52 +00:00
/// Тип смещений.
DataTypePtr offsets;
2012-08-26 06:48:39 +00:00
public:
2012-08-26 11:14:52 +00:00
DataTypeArray(DataTypePtr nested_);
2012-08-26 06:48:39 +00:00
std::string getName() const
{
return "Array(" + nested->getName() + ")";
}
DataTypePtr clone() const
{
return new DataTypeArray(nested);
}
void serializeBinary(const Field & field, WriteBuffer & ostr) const;
void deserializeBinary(Field & field, ReadBuffer & istr) const;
void serializeText(const Field & field, WriteBuffer & ostr) const;
void deserializeText(Field & field, ReadBuffer & istr) const;
void serializeTextEscaped(const Field & field, WriteBuffer & ostr) const;
void deserializeTextEscaped(Field & field, ReadBuffer & istr) const;
void serializeTextQuoted(const Field & field, WriteBuffer & ostr) const;
void deserializeTextQuoted(Field & field, ReadBuffer & istr) const;
/** Потоковая сериализация массивов устроена по-особенному:
2012-08-27 05:13:14 +00:00
* - запиваются/читаются элементы, уложенные подряд, без размеров массивов;
* - размеры записываются/читаются в отдельный столбец,
* и о записи/чтении размеров должна позаботиться вызывающая сторона.
* Это нужно, так как при реализации вложенных структур, несколько массивов могут иметь общие размеры.
2012-08-26 06:48:39 +00:00
*/
2012-08-27 05:13:14 +00:00
/** Записать только значения, без размеров. Вызывающая сторона также должна куда-нибудь записать смещения. */
void serializeBinary(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const;
2012-08-26 06:48:39 +00:00
2012-08-27 05:13:14 +00:00
/** Прочитать только значения, без размеров.
* При этом, в column уже заранее должны быть считаны все размеры.
*/
2012-08-26 06:48:39 +00:00
void deserializeBinary(IColumn & column, ReadBuffer & istr, size_t limit) const;
2012-08-27 05:13:14 +00:00
/** Записать размеры. */
void serializeOffsets(const IColumn & column, WriteBuffer & ostr, size_t offset = 0, size_t limit = 0) const;
2012-08-27 05:13:14 +00:00
/** Прочитать размеры. Вызывайте этот метод перед чтением значений. */
void deserializeOffsets(IColumn & column, ReadBuffer & istr, size_t limit) const;
2012-08-26 06:48:39 +00:00
ColumnPtr createColumn() const;
ColumnPtr createConstColumn(size_t size, const Field & field) const;
Field getDefault() const
{
return Array();
}
2012-08-26 11:14:52 +00:00
const DataTypePtr & getNestedType() const { return nested; }
const DataTypePtr & getOffsetsType() const { return offsets; }
2012-08-26 06:48:39 +00:00
};
}