222 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * 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 geo_func_mockx.
 | |
|  */
 | |
| 
 | |
| #include "lib/geo/ob_geo_dispatcher.h"
 | |
| #include "lib/geo/ob_geo_ibin.h"
 | |
| #include "ob_geo_func_testx.h"
 | |
| #include "ob_geo_func_testy.h"
 | |
| 
 | |
| using namespace oceanbase::common;
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace sql
 | |
| {
 | |
| // unittest codes
 | |
| class ObGeoFuncTypeXImpl : public ObIGeoDispatcher<int, ObGeoFuncTypeXImpl>
 | |
| {
 | |
| public:
 | |
|   ObGeoFuncTypeXImpl();
 | |
|   virtual ~ObGeoFuncTypeXImpl() = default;
 | |
| 
 | |
|   // template for unary
 | |
|   template <typename GeometyType>
 | |
|   struct Eval {
 | |
|     static int eval(const ObGeometry *g, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSED(context);
 | |
|       result = static_cast<int>(g->type());
 | |
|       return OB_SUCCESS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   template <typename GeometyType>
 | |
|   struct EvalTree {
 | |
|     static int eval(const ObGeometry *g, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSED(context);
 | |
|       result = static_cast<int>(g->type());
 | |
|       return OB_SUCCESS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   // templates for binary
 | |
|   template <typename GeometyType1, typename GeometyType2>
 | |
|   struct EvalWkbBi {
 | |
|     static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSED(context);
 | |
|       result = 0;
 | |
|       result += static_cast<int>(g1->type());
 | |
|       result += static_cast<int>(g2->type());
 | |
|       return OB_SUCCESS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   template <typename GeometyType1, typename GeometyType2>
 | |
|   struct EvalWkbBiGeog {
 | |
|     static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSED(context);
 | |
|       result = 0;
 | |
|       result += static_cast<int>(g1->type());
 | |
|       result += static_cast<int>(g2->type());
 | |
|       return OB_SUCCESS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   OB_GEO_CART_TREE_FUNC_DEFAULT(int, OB_ERR_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS);
 | |
|   OB_GEO_GEOG_TREE_FUNC_DEFAULT(int, OB_ERR_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS);
 | |
| 
 | |
|   // unary specialization for geographic geometrycollection
 | |
|   template <>
 | |
|   struct Eval<ObWkbGeogCollection> {
 | |
|     static int eval(const ObGeometry *g, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSED(context);
 | |
|       result = static_cast<int>(g->type());
 | |
|       return OB_ERR_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   // binary specialization for geographic geometrycollection and geographic geometrycollection
 | |
|   template <>
 | |
|   struct EvalWkbBiGeog<ObWkbGeogCollection, ObWkbGeogCollection> {
 | |
|     static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSED(context);
 | |
|       result = 0;
 | |
|       result += static_cast<int>(g1->type());
 | |
|       result += static_cast<int>(g2->type());
 | |
|       return OB_ERR_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   // binary specialization for geographic multipoint and geographic multipoint
 | |
|   template <>
 | |
|   struct EvalWkbBiGeog<ObWkbGeogMultiPoint, ObWkbGeogMultiPoint> {
 | |
|     static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSEDx(context, g1, g2);
 | |
|       ObGeoEvalCtx gis_context(context.get_allocator(), context.get_srs());
 | |
|       ObString dumy_wkb(4, 4, "dumy");
 | |
|       ObIWkbGeogPoint gmp1;
 | |
|       ObIWkbGeogPoint gmp2;
 | |
|       gmp1.set_data(dumy_wkb);
 | |
|       gmp2.set_data(dumy_wkb);
 | |
|       gis_context.append_geo_arg(&gmp1);
 | |
|       gis_context.append_geo_arg(&gmp2);
 | |
|       return ObGeoFuncTypeX::eval(gis_context, result);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   // binary partial specialization for geographic point
 | |
|   template <typename GeometyType2>
 | |
|   struct EvalWkbBiGeog<ObWkbGeogPoint, GeometyType2> {
 | |
|     static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|     {
 | |
|       UNUSEDx(context, g1, g2);
 | |
|       result = 100;
 | |
|       return OB_SUCCESS;
 | |
|     }
 | |
|   };
 | |
| 
 | |
| };
 | |
| 
 | |
| template <typename GeometyType1>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<GeometyType1, ObWkbGeogPoint> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = -100;
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| // binary specializations
 | |
| template <>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<ObWkbGeogPoint, ObWkbGeogPoint> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     INIT_SUCC(ret);
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = 300;
 | |
|     int tmp_result;
 | |
|     ret = ObGeoFuncMockY::eval(context, tmp_result);
 | |
|     result += tmp_result;
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<ObWkbGeogPolygon, ObWkbGeogPoint> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = 400;
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<ObWkbGeogPoint, ObWkbGeogPolygon> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = -400;
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<ObWkbGeogPolygon, ObWkbGeogPolygon> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = 800;
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| // binary partial specialization for geographic polygon
 | |
| template<typename GeometryType2>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<ObWkbGeogPolygon, GeometryType2> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = 777;
 | |
|     throw boost::geometry::centroid_exception();
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| template<typename GeometryType1>
 | |
| struct ObGeoFuncTypeXImpl::EvalWkbBiGeog<GeometryType1, ObWkbGeogPolygon> {
 | |
|   static int eval(const ObGeometry *g1, const ObGeometry *g2, const ObGeoEvalCtx &context, int &result)
 | |
|   {
 | |
|     UNUSEDx(context, g1, g2);
 | |
|     result = 666;
 | |
|     throw boost::geometry::centroid_exception();
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| // implement of outer class eval
 | |
| // use an outer class to void implement templates in header files
 | |
| int ObGeoFuncTypeX::eval(const ObGeoEvalCtx &gis_context, int &result)
 | |
| {
 | |
|   return ObGeoFuncTypeXImpl::eval_geo_func(gis_context, result);
 | |
| }
 | |
| 
 | |
| } // sql
 | |
| } // oceanbase
 | 
