mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-16 03:12:43 +00:00
127 lines
4.9 KiB
C++
127 lines
4.9 KiB
C++
#include <DataTypes/DataTypeCustomGeo.h>
|
|
|
|
#include <Columns/ColumnsNumber.h>
|
|
#include <Columns/ColumnTuple.h>
|
|
#include <DataTypes/DataTypeArray.h>
|
|
#include <DataTypes/DataTypeCustom.h>
|
|
#include <DataTypes/DataTypeCustomSimpleTextSerialization.h>
|
|
#include <DataTypes/DataTypeFactory.h>
|
|
#include <DataTypes/DataTypeTuple.h>
|
|
#include <DataTypes/DataTypesNumber.h>
|
|
|
|
namespace DB
|
|
{
|
|
|
|
void DataTypeCustomPointSerialization::serializeText(
|
|
const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
|
{
|
|
nestedDataType()->serializeAsText(column, row_num, ostr, settings);
|
|
}
|
|
|
|
void DataTypeCustomPointSerialization::deserializeText(
|
|
IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
|
|
{
|
|
nestedDataType()->deserializeAsWholeText(column, istr, settings);
|
|
}
|
|
|
|
DataTypePtr DataTypeCustomPointSerialization::nestedDataType()
|
|
{
|
|
static auto data_type = DataTypePtr(std::make_unique<DataTypeTuple>(
|
|
DataTypes({std::make_unique<DataTypeFloat64>(), std::make_unique<DataTypeFloat64>()})));
|
|
return data_type;
|
|
}
|
|
|
|
class DataTypeCustomRingSerialization : public DataTypeCustomSimpleTextSerialization
|
|
{
|
|
public:
|
|
void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override
|
|
{
|
|
nestedDataType()->serializeAsText(column, row_num, ostr, settings);
|
|
}
|
|
|
|
void deserializeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override
|
|
{
|
|
nestedDataType()->deserializeAsWholeText(column, istr, settings);
|
|
}
|
|
|
|
static DataTypePtr nestedDataType()
|
|
{
|
|
static auto data_type = DataTypePtr(std::make_unique<DataTypeArray>(DataTypeCustomPointSerialization::nestedDataType()));
|
|
return data_type;
|
|
}
|
|
};
|
|
|
|
class DataTypeCustomPolygonSerialization : public DataTypeCustomSimpleTextSerialization
|
|
{
|
|
public:
|
|
void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override
|
|
{
|
|
nestedDataType()->serializeAsText(column, row_num, ostr, settings);
|
|
}
|
|
|
|
void deserializeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override
|
|
{
|
|
nestedDataType()->deserializeAsWholeText(column, istr, settings);
|
|
}
|
|
|
|
static DataTypePtr nestedDataType()
|
|
{
|
|
static auto data_type = DataTypePtr(std::make_unique<DataTypeArray>(DataTypeCustomRingSerialization::nestedDataType()));
|
|
return data_type;
|
|
}
|
|
};
|
|
|
|
class DataTypeCustomMultiPolygonSerialization : public DataTypeCustomSimpleTextSerialization
|
|
{
|
|
public:
|
|
void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override
|
|
{
|
|
nestedDataType()->serializeAsText(column, row_num, ostr, settings);
|
|
}
|
|
|
|
void deserializeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override
|
|
{
|
|
nestedDataType()->deserializeAsWholeText(column, istr, settings);
|
|
}
|
|
|
|
static DataTypePtr nestedDataType()
|
|
{
|
|
static auto data_type = DataTypePtr(std::make_unique<DataTypeArray>(DataTypeCustomPolygonSerialization::nestedDataType()));
|
|
return data_type;
|
|
}
|
|
};
|
|
|
|
void registerDataTypeDomainGeo(DataTypeFactory & factory)
|
|
{
|
|
// Custom type for point represented as its coordinates stored as Tuple(Float64, Float64)
|
|
factory.registerSimpleDataTypeCustom("Point", []
|
|
{
|
|
return std::make_pair(DataTypeFactory::instance().get("Tuple(Float64, Float64)"),
|
|
std::make_unique<DataTypeCustomDesc>(std::make_unique<DataTypeCustomFixedName>("Point"), std::make_unique<DataTypeCustomPointSerialization>()));
|
|
});
|
|
|
|
// Custom type for simple polygon without holes stored as Array(Point)
|
|
factory.registerSimpleDataTypeCustom("Ring", []
|
|
{
|
|
return std::make_pair(DataTypeFactory::instance().get("Array(Point)"),
|
|
std::make_unique<DataTypeCustomDesc>(std::make_unique<DataTypeCustomFixedName>("Ring"), std::make_unique<DataTypeCustomRingSerialization>()));
|
|
});
|
|
|
|
// Custom type for polygon with holes stored as Array(Ring)
|
|
// First element of outer array is outer shape of polygon and all the following are holes
|
|
factory.registerSimpleDataTypeCustom("Polygon", []
|
|
{
|
|
return std::make_pair(DataTypeFactory::instance().get("Array(Ring)"),
|
|
std::make_unique<DataTypeCustomDesc>(std::make_unique<DataTypeCustomFixedName>("Polygon"), std::make_unique<DataTypeCustomPolygonSerialization>()));
|
|
});
|
|
|
|
// Custom type for multiple polygons with holes stored as Array(Polygon)
|
|
factory.registerSimpleDataTypeCustom("MultiPolygon", []
|
|
{
|
|
return std::make_pair(DataTypeFactory::instance().get("Array(Polygon)"),
|
|
std::make_unique<DataTypeCustomDesc>(std::make_unique<DataTypeCustomFixedName>("MultiPolygon"), std::make_unique<DataTypeCustomMultiPolygonSerialization>()));
|
|
});
|
|
}
|
|
|
|
}
|