summaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/Functions/s2CapUnion.cpp
diff options
context:
space:
mode:
authorAlexSm <[email protected]>2024-01-04 15:09:05 +0100
committerGitHub <[email protected]>2024-01-04 15:09:05 +0100
commitdab291146f6cd7d35684e3a1150e5bb1c412982c (patch)
tree36ef35f6cacb6432845a4a33f940c95871036b32 /contrib/clickhouse/src/Functions/s2CapUnion.cpp
parent63660ad5e7512029fd0218e7a636580695a24e1f (diff)
Library import 5, delete go dependencies (#832)
* Library import 5, delete go dependencies * Fix yt client
Diffstat (limited to 'contrib/clickhouse/src/Functions/s2CapUnion.cpp')
-rw-r--r--contrib/clickhouse/src/Functions/s2CapUnion.cpp179
1 files changed, 0 insertions, 179 deletions
diff --git a/contrib/clickhouse/src/Functions/s2CapUnion.cpp b/contrib/clickhouse/src/Functions/s2CapUnion.cpp
deleted file mode 100644
index f86f21f847c..00000000000
--- a/contrib/clickhouse/src/Functions/s2CapUnion.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-#include "clickhouse_config.h"
-
-#if USE_S2_GEOMETRY
-
-#include <Columns/ColumnsNumber.h>
-#include <Columns/ColumnTuple.h>
-#include <DataTypes/DataTypesNumber.h>
-#include <DataTypes/DataTypeTuple.h>
-#include <Functions/FunctionFactory.h>
-#include <Common/typeid_cast.h>
-#include <Common/NaNUtils.h>
-#include <base/range.h>
-
-#error #include "s2_fwd.h"
-
-namespace DB
-{
-
-namespace ErrorCodes
-{
- extern const int ILLEGAL_TYPE_OF_ARGUMENT;
- extern const int BAD_ARGUMENTS;
- extern const int ILLEGAL_COLUMN;
-}
-
-namespace
-{
-
-/**
- * The cap represents a portion of the sphere that has been cut off by a plane.
- * See comment for s2CapContains function.
- * This function returns the smallest cap that contains both of input caps.
- * It is represented by identifier of the center and a radius.
- */
-class FunctionS2CapUnion : public IFunction
-{
-public:
- static constexpr auto name = "s2CapUnion";
-
- static FunctionPtr create(ContextPtr)
- {
- return std::make_shared<FunctionS2CapUnion>();
- }
-
- std::string getName() const override
- {
- return name;
- }
-
- size_t getNumberOfArguments() const override { return 4; }
-
- bool useDefaultImplementationForConstants() const override { return true; }
-
- bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
-
- DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
- {
- for (size_t index = 0; index < getNumberOfArguments(); ++index)
- {
- const auto * arg = arguments[index].get();
- if (index == 1 || index == 3)
- {
- if (!WhichDataType(arg).isFloat64())
- throw Exception(
- ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
- "Illegal type {} of argument {} of function {}. Must be Float64",
- arg->getName(), index + 1, getName());
- }
- else if (!WhichDataType(arg).isUInt64())
- throw Exception(
- ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
- "Illegal type {} of argument {} of function {}. Must be UInt64",
- arg->getName(), index + 1, getName()
- );
- }
-
- DataTypePtr center = std::make_shared<DataTypeUInt64>();
- DataTypePtr radius = std::make_shared<DataTypeFloat64>();
-
- return std::make_shared<DataTypeTuple>(DataTypes{center, radius});
- }
-
- ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
- {
- auto non_const_arguments = arguments;
- for (auto & argument : non_const_arguments)
- argument.column = argument.column->convertToFullColumnIfConst();
-
- const auto * col_center1 = checkAndGetColumn<ColumnUInt64>(non_const_arguments[0].column.get());
- if (!col_center1)
- throw Exception(
- ErrorCodes::ILLEGAL_COLUMN,
- "Illegal type {} of argument {} of function {}. Must be UInt64",
- arguments[0].type->getName(),
- 1,
- getName());
- const auto & data_center1 = col_center1->getData();
-
- const auto * col_radius1 = checkAndGetColumn<ColumnFloat64>(non_const_arguments[1].column.get());
- if (!col_radius1)
- throw Exception(
- ErrorCodes::ILLEGAL_COLUMN,
- "Illegal type {} of argument {} of function {}. Must be Float64",
- arguments[1].type->getName(),
- 2,
- getName());
- const auto & data_radius1 = col_radius1->getData();
-
- const auto * col_center2 = checkAndGetColumn<ColumnUInt64>(non_const_arguments[2].column.get());
- if (!col_center2)
- throw Exception(
- ErrorCodes::ILLEGAL_COLUMN,
- "Illegal type {} of argument {} of function {}. Must be UInt64",
- arguments[2].type->getName(),
- 3,
- getName());
- const auto & data_center2 = col_center2->getData();
-
- const auto * col_radius2 = checkAndGetColumn<ColumnFloat64>(non_const_arguments[3].column.get());
- if (!col_radius2)
- throw Exception(
- ErrorCodes::ILLEGAL_COLUMN,
- "Illegal type {} of argument {} of function {}. Must be Float64",
- arguments[3].type->getName(),
- 4,
- getName());
- const auto & data_radius2 = col_radius2->getData();
-
- auto col_res_center = ColumnUInt64::create();
- auto col_res_radius = ColumnFloat64::create();
-
- auto & vec_res_center = col_res_center->getData();
- vec_res_center.reserve(input_rows_count);
-
- auto & vec_res_radius = col_res_radius->getData();
- vec_res_radius.reserve(input_rows_count);
-
- for (size_t row = 0; row < input_rows_count; ++row)
- {
- const UInt64 first_center = data_center1[row];
- const Float64 first_radius = data_radius1[row];
- const UInt64 second_center = data_center2[row];
- const Float64 second_radius = data_radius2[row];
-
- if (isNaN(first_radius) || isNaN(second_radius))
- throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Radius of the cap must not be nan");
-
- if (std::isinf(first_radius) || std::isinf(second_radius))
- throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Radius of the cap must not be infinite");
-
- auto first_center_cell = S2CellId(first_center);
- auto second_center_cell = S2CellId(second_center);
-
- if (!first_center_cell.is_valid() || !second_center_cell.is_valid())
- throw Exception(ErrorCodes::BAD_ARGUMENTS, "Center of the cap is not valid");
-
- S2Cap cap1(first_center_cell.ToPoint(), S1Angle::Degrees(first_radius));
- S2Cap cap2(second_center_cell.ToPoint(), S1Angle::Degrees(second_radius));
-
- S2Cap cap_union = cap1.Union(cap2);
-
- vec_res_center.emplace_back(S2CellId(cap_union.center()).id());
- vec_res_radius.emplace_back(cap_union.GetRadius().degrees());
- }
-
- return ColumnTuple::create(Columns{std::move(col_res_center), std::move(col_res_radius)});
- }
-};
-
-}
-
-REGISTER_FUNCTION(S2CapUnion)
-{
- factory.registerFunction<FunctionS2CapUnion>();
-}
-
-}
-
-#endif