[FEAT MERGE] GIS
This commit is contained in:
116
src/sql/engine/expr/ob_geo_expr_utils.h
Normal file
116
src/sql/engine/expr/ob_geo_expr_utils.h
Normal file
@ -0,0 +1,116 @@
|
||||
/**
|
||||
* Copyright (c) 2021 OceanBase
|
||||
* OceanBase CE is licensed under Mulan PubL v2.
|
||||
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
||||
* You may obtain a copy of Mulan PubL v2 at:
|
||||
* http://license.coscl.org.cn/MulanPubL-2.0
|
||||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||
* See the Mulan PubL v2 for more details.
|
||||
* This file contains implementation for ob_geo_expr_utils.
|
||||
*/
|
||||
|
||||
#ifndef OCEANBASE_SQL_OB_GEO_EXPR_UTILS_H_
|
||||
#define OCEANBASE_SQL_OB_GEO_EXPR_UTILS_H_
|
||||
|
||||
#include "lib/allocator/ob_allocator.h"
|
||||
#include "lib/string/ob_string.h"
|
||||
#include "lib/geo/ob_geo.h"
|
||||
#include "lib/geo/ob_geo_utils.h"
|
||||
#include "lib/geo/ob_geo_common.h"
|
||||
#include "sql/engine/expr/ob_expr.h" // for ObExpr
|
||||
#include "sql/session/ob_sql_session_info.h"
|
||||
#include "sql/engine/ob_exec_context.h"
|
||||
#include "share/ob_i_sql_expression.h" // for ObExprCtx
|
||||
#include "observer/omt/ob_tenant_srs_mgr.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace sql
|
||||
{
|
||||
|
||||
enum class ObGeoAxisOrder
|
||||
{
|
||||
LONG_LAT = 0,
|
||||
LAT_LONG = 1,
|
||||
SRID_DEFINED = 2,
|
||||
INVALID = 3,
|
||||
};
|
||||
|
||||
class ObGeoExprUtils
|
||||
{
|
||||
public:
|
||||
ObGeoExprUtils();
|
||||
virtual ~ObGeoExprUtils() = default;
|
||||
static int get_srs_item(uint64_t tenant_id,
|
||||
omt::ObSrsCacheGuard &srs_guard,
|
||||
const uint32_t srid,
|
||||
const common::ObSrsItem *&srs);
|
||||
static int get_srs_item(ObEvalCtx &ctx,
|
||||
omt::ObSrsCacheGuard &srs_guard,
|
||||
const common::ObString &wkb,
|
||||
const common::ObSrsItem *&srs,
|
||||
bool use_little_bo = false,
|
||||
const char *func_name = NULL);
|
||||
static int build_geometry(common::ObIAllocator &allocator,
|
||||
const common::ObString &wkb,
|
||||
common::ObGeometry *&geo,
|
||||
const common::ObSrsItem *srs,
|
||||
const char *func_name,
|
||||
const bool need_normlize = true,
|
||||
const bool need_check_ring = false,
|
||||
const bool need_correct = true);
|
||||
static int construct_geometry(common::ObIAllocator &allocator,
|
||||
const common::ObString &wkb,
|
||||
omt::ObSrsCacheGuard &srs_guard,
|
||||
const common::ObSrsItem *&srs,
|
||||
common::ObGeometry *&geo,
|
||||
const char *func_name,
|
||||
bool has_srid = true);
|
||||
static int check_coordinate_range(const common::ObSrsItem *srs,
|
||||
common::ObGeometry *geo,
|
||||
const char *func_name,
|
||||
const bool is_param = false,
|
||||
const bool is_normalized = false);
|
||||
static int parse_axis_order(const common::ObString option_str,
|
||||
const char *func_name,
|
||||
ObGeoAxisOrder &axis_order);
|
||||
static int check_need_reverse(ObGeoAxisOrder axis_order,
|
||||
bool &need_reverse);
|
||||
static int correct_coordinate_range(const common::ObSrsItem *srs_item,
|
||||
common::ObGeometry *geo,
|
||||
const char *func_name);
|
||||
static int check_empty(common::ObGeometry *geo,
|
||||
bool &is_empty);
|
||||
static int parse_srid(const common::ObString &srid_str,
|
||||
uint32_t &srid);
|
||||
static int get_box_bestsrid(common::ObGeogBox *geo_box1,
|
||||
common::ObGeogBox *geo_box2,
|
||||
int32 &bestsrid);
|
||||
static int normalize_wkb(const common::ObSrsItem *srs,
|
||||
common::ObString &wkb,
|
||||
common::ObArenaAllocator &allocator,
|
||||
common::ObGeometry *&geo);
|
||||
static int normalize_wkb(common::ObString &proj4text,
|
||||
common::ObGeometry *geo); // for st_transform
|
||||
static int denormalize_wkb(common::ObString &proj4text,
|
||||
common::ObGeometry *geo); // for st_transform
|
||||
static int geo_to_wkb(common::ObGeometry &geo,
|
||||
const ObExpr &expr,
|
||||
ObEvalCtx &ctx,
|
||||
const common::ObSrsItem *srs_item,
|
||||
common::ObString &res_wkb,
|
||||
uint32_t srs_id = 0);
|
||||
static int geo_to_wkb(common::ObGeometry &geo,
|
||||
common::ObExprCtx &expr_ctx,
|
||||
const common::ObSrsItem *srs_item,
|
||||
common::ObString &res_wkb,
|
||||
uint32_t srs_id = 0);
|
||||
static void geo_func_error_handle(int ret, const char* func_name);
|
||||
static int zoom_in_geos_for_relation(common::ObGeometry &geo1, common::ObGeometry &geo2);
|
||||
};
|
||||
|
||||
} // sql
|
||||
} // oceanbase
|
||||
#endif // OCEANBASE_SQL_OB_GEO_EXPR_UTILS_H_
|
||||
Reference in New Issue
Block a user