ClickHouse/src/DataTypes/DataTypeOneElementTuple.cpp

113 lines
3.5 KiB
C++
Raw Normal View History

2020-11-05 13:24:31 +00:00
#include <DataTypes/DataTypeOneElementTuple.h>
#include <DataTypes/DataTypeFactory.h>
2020-11-10 12:13:33 +00:00
#include <DataTypes/DataTypeCustom.h>
2020-11-05 13:24:31 +00:00
#include <IO/WriteBufferFromString.h>
#include <IO/Operators.h>
#include <Common/quoteString.h>
#include <Parsers/ASTNameTypePair.h>
2020-11-10 17:32:00 +00:00
#include <Columns/IColumn.h>
2020-11-05 13:24:31 +00:00
namespace DB
{
2020-11-10 12:13:33 +00:00
namespace
2020-11-05 13:24:31 +00:00
{
2021-01-11 11:36:31 +00:00
/** Custom substreams representation for single subcolumn.
* It serializes/deserializes column as a nested type, but in that way
* if it was a named tuple with one element and a given name.
*/
2020-11-10 12:13:33 +00:00
class DataTypeOneElementTupleStreams : public IDataTypeCustomStreams
2020-11-05 13:24:31 +00:00
{
2020-11-10 12:13:33 +00:00
private:
DataTypePtr nested;
String name;
bool escape_delimiter;
public:
2020-12-17 17:10:33 +00:00
DataTypeOneElementTupleStreams(const DataTypePtr & nested_, const String & name_, bool escape_delimiter_)
2020-11-10 12:13:33 +00:00
: nested(nested_), name(name_), escape_delimiter(escape_delimiter_) {}
void enumerateStreams(
const IDataType::StreamCallback & callback,
IDataType::SubstreamPath & path) const override
{
addToPath(path);
nested->enumerateStreams(callback, path);
path.pop_back();
}
void serializeBinaryBulkStatePrefix(
IDataType:: SerializeBinaryBulkSettings & settings,
IDataType::SerializeBinaryBulkStatePtr & state) const override
{
addToPath(settings.path);
nested->serializeBinaryBulkStatePrefix(settings, state);
settings.path.pop_back();
}
void serializeBinaryBulkStateSuffix(
IDataType::SerializeBinaryBulkSettings & settings,
IDataType::SerializeBinaryBulkStatePtr & state) const override
{
addToPath(settings.path);
nested->serializeBinaryBulkStateSuffix(settings, state);
settings.path.pop_back();
}
void deserializeBinaryBulkStatePrefix(
IDataType::DeserializeBinaryBulkSettings & settings,
IDataType::DeserializeBinaryBulkStatePtr & state) const override
{
addToPath(settings.path);
nested->deserializeBinaryBulkStatePrefix(settings, state);
settings.path.pop_back();
}
void serializeBinaryBulkWithMultipleStreams(
const IColumn & column,
size_t offset,
size_t limit,
IDataType::SerializeBinaryBulkSettings & settings,
IDataType::SerializeBinaryBulkStatePtr & state) const override
{
addToPath(settings.path);
nested->serializeBinaryBulkWithMultipleStreams(column, offset, limit, settings, state);
settings.path.pop_back();
}
void deserializeBinaryBulkWithMultipleStreams(
2020-11-10 17:32:00 +00:00
ColumnPtr & column,
2020-11-10 12:13:33 +00:00
size_t limit,
IDataType::DeserializeBinaryBulkSettings & settings,
2020-11-10 17:32:00 +00:00
IDataType::DeserializeBinaryBulkStatePtr & state,
IDataType::SubstreamsCache * cache) const override
2020-11-10 12:13:33 +00:00
{
addToPath(settings.path);
2020-11-10 17:32:00 +00:00
nested->deserializeBinaryBulkWithMultipleStreams(column, limit, settings, state, cache);
2020-11-10 12:13:33 +00:00
settings.path.pop_back();
}
private:
void addToPath(IDataType::SubstreamPath & path) const
{
path.push_back(IDataType::Substream::TupleElement);
path.back().tuple_element_name = name;
path.back().escape_tuple_delimiter = escape_delimiter;
}
};
2020-11-05 13:24:31 +00:00
}
2020-11-10 12:13:33 +00:00
DataTypePtr createOneElementTuple(const DataTypePtr & type, const String & name, bool escape_delimiter)
2020-11-05 13:24:31 +00:00
{
2020-11-10 12:13:33 +00:00
auto custom_desc = std::make_unique<DataTypeCustomDesc>(
2020-12-17 17:10:33 +00:00
std::make_unique<DataTypeCustomFixedName>(type->getName()),nullptr,
2020-11-10 12:13:33 +00:00
std::make_unique<DataTypeOneElementTupleStreams>(type, name, escape_delimiter));
2020-11-05 13:24:31 +00:00
2020-11-10 12:13:33 +00:00
return DataTypeFactory::instance().getCustom(std::move(custom_desc));
2020-11-05 13:24:31 +00:00
}
}