// #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // namespace DB // { // template // class FunctionPolygonPerimeter : public IFunction // { // public: // static const char * name; // explicit FunctionPolygonPerimeter() = default; // static FunctionPtr create(const Context &) // { // return std::make_shared(); // } // String getName() const override // { // return name; // } // bool isVariadic() const override // { // return false; // } // size_t getNumberOfArguments() const override // { // return 1; // } // DataTypePtr getReturnTypeImpl(const DataTypes &) const override // { // return std::make_shared(); // } // ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & /*result_type*/, size_t input_rows_count) const override // { // auto parser = getConverterBasedOnType(arguments[0]); // auto figures = parseFigure(parser); // auto res_column = ColumnFloat64::create(); // auto & res_data = res_column->getData(); // res_data.reserve(input_rows_count); // for (size_t i = 0; i < input_rows_count; i++) // { // boost::geometry::correct(figures[i]); // res_data.emplace_back(boost::geometry::perimeter(figures[i])); // } // return res_column; // } // bool useDefaultImplementationForConstants() const override // { // return true; // } // }; // template <> // const char * FunctionPolygonPerimeter::name = "polygonPerimeterCartesian"; // template <> // const char * FunctionPolygonPerimeter::name = "polygonPerimeterGeographic"; // void registerFunctionPolygonPerimeter(FunctionFactory & factory) // { // factory.registerFunction>(); // factory.registerFunction>(); // } // }