ClickHouse
110 строк · 3.1 Кб
1#include <DataTypes/DataTypeString.h>2#include <DataTypes/DataTypeCustomGeo.h>3#include <Functions/FunctionFactory.h>4#include <Functions/FunctionHelpers.h>5#include <Functions/geometryConverters.h>6#include <Columns/ColumnString.h>7
8#include <string>9#include <memory>10
11namespace DB12{
13
14namespace ErrorCodes15{
16extern const int ILLEGAL_TYPE_OF_ARGUMENT;17}
18
19namespace
20{
21
22template <class DataTypeName, class Geometry, class Serializer, class NameHolder>23class FunctionReadWKT : public IFunction24{
25public:26explicit FunctionReadWKT() = default;27
28static constexpr const char * name = NameHolder::name;29
30String getName() const override31{32return name;33}34
35size_t getNumberOfArguments() const override36{37return 1;38}39
40bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }41
42DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override43{44if (checkAndGetDataType<DataTypeString>(arguments[0].get()) == nullptr)45{46throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument should be String");47}48
49return DataTypeFactory::instance().get(DataTypeName().getName());50}51
52ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override53{54const auto * column_string = checkAndGetColumn<ColumnString>(arguments[0].column.get());55
56Serializer serializer;57Geometry geometry;58
59for (size_t i = 0; i < input_rows_count; ++i)60{61const auto & str = column_string->getDataAt(i).toString();62boost::geometry::read_wkt(str, geometry);63serializer.add(geometry);64}65
66return serializer.finalize();67}68
69bool useDefaultImplementationForConstants() const override70{71return true;72}73
74static FunctionPtr create(ContextPtr)75{76return std::make_shared<FunctionReadWKT<DataTypeName, Geometry, Serializer, NameHolder>>();77}78};79
80struct ReadWKTPointNameHolder81{
82static constexpr const char * name = "readWKTPoint";83};84
85struct ReadWKTRingNameHolder86{
87static constexpr const char * name = "readWKTRing";88};89
90struct ReadWKTPolygonNameHolder91{
92static constexpr const char * name = "readWKTPolygon";93};94
95struct ReadWKTMultiPolygonNameHolder96{
97static constexpr const char * name = "readWKTMultiPolygon";98};99
100}
101
102REGISTER_FUNCTION(ReadWKT)103{
104factory.registerFunction<FunctionReadWKT<DataTypePointName, CartesianPoint, PointSerializer<CartesianPoint>, ReadWKTPointNameHolder>>();105factory.registerFunction<FunctionReadWKT<DataTypeRingName, CartesianRing, RingSerializer<CartesianPoint>, ReadWKTRingNameHolder>>();106factory.registerFunction<FunctionReadWKT<DataTypePolygonName, CartesianPolygon, PolygonSerializer<CartesianPoint>, ReadWKTPolygonNameHolder>>();107factory.registerFunction<FunctionReadWKT<DataTypeMultiPolygonName, CartesianMultiPolygon, MultiPolygonSerializer<CartesianPoint>, ReadWKTMultiPolygonNameHolder>>();108}
109
110}
111