468 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			468 lines
		
	
	
		
			15 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.
 | |
|  */
 | |
| 
 | |
| #include <gtest/gtest.h>
 | |
| #include <boost/geometry.hpp>
 | |
| #include <boost/geometry/geometries/point_xy.hpp>
 | |
| #include <boost/geometry/geometries/polygon.hpp>
 | |
| #include <boost/foreach.hpp>
 | |
| #define private public
 | |
| #include "lib/geo/ob_geo_bin.h"
 | |
| #include "lib/geo/ob_geo_tree.h"
 | |
| #include "lib/geo/ob_geo_to_tree_visitor.h"
 | |
| #include "lib/geo/ob_geo_tree_traits.h"
 | |
| #include "lib/geo/ob_geo_bin_traits.h"
 | |
| #include "lib/geo/ob_geo_func_register.h"
 | |
| #include "lib/geo/ob_geo_func_box.h"
 | |
| #include "lib/geo/ob_geo_func_utils.h"
 | |
| #include "lib/json_type/ob_json_common.h"
 | |
| #include "lib/random/ob_random.h"
 | |
| #undef private
 | |
| 
 | |
| #include <sys/time.h>
 | |
| #include <stdexcept>
 | |
| #include <exception>
 | |
| #include <typeinfo>
 | |
| 
 | |
| namespace bg = boost::geometry;
 | |
| using namespace oceanbase::common;
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| 
 | |
| namespace common
 | |
| {
 | |
| 
 | |
| class TestGeoFuncBox : public ::testing::Test
 | |
| {
 | |
| public:
 | |
|   TestGeoFuncBox()
 | |
|   {}
 | |
|   ~TestGeoFuncBox()
 | |
|   {}
 | |
|   virtual void SetUp()
 | |
|   {}
 | |
|   virtual void TearDown()
 | |
|   {}
 | |
| 
 | |
|   static void SetUpTestCase()
 | |
|   {}
 | |
| 
 | |
|   static void TearDownTestCase()
 | |
|   {}
 | |
| 
 | |
| private:
 | |
|   // disallow copy
 | |
|   DISALLOW_COPY_AND_ASSIGN(TestGeoFuncBox);
 | |
| };
 | |
| 
 | |
| int append_bo(ObJsonBuffer &data, ObGeoWkbByteOrder bo = ObGeoWkbByteOrder::LittleEndian)
 | |
| {
 | |
|   uint8_t sbo = static_cast<uint8_t>(bo);
 | |
|   return data.append(reinterpret_cast<char *>(&sbo), sizeof(uint8_t));
 | |
| }
 | |
| 
 | |
| int append_type(ObJsonBuffer &data, ObGeoType type, ObGeoWkbByteOrder bo = ObGeoWkbByteOrder::LittleEndian)
 | |
| {
 | |
|   INIT_SUCC(ret);
 | |
|   uint32_t stype = static_cast<uint32_t>(type);
 | |
|   if (OB_FAIL(data.reserve(sizeof(uint32_t)))) {
 | |
|   } else {
 | |
|     char *ptr = data.ptr() + data.length();
 | |
|     ObGeoWkbByteOrderUtil::write<uint32_t>(ptr, stype, bo);
 | |
|     ret = data.set_length(data.length() + sizeof(uint32_t));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| int append_uint32(ObJsonBuffer &data, uint32_t val, ObGeoWkbByteOrder bo = ObGeoWkbByteOrder::LittleEndian)
 | |
| {
 | |
|   INIT_SUCC(ret);
 | |
|   if (OB_FAIL(data.reserve(sizeof(uint32_t)))) {
 | |
|   } else {
 | |
|     char *ptr = data.ptr() + data.length();
 | |
|     ObGeoWkbByteOrderUtil::write<uint32_t>(ptr, val, bo);
 | |
|     ret = data.set_length(data.length() + sizeof(uint32_t));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| int append_double(ObJsonBuffer &data, double val, ObGeoWkbByteOrder bo = ObGeoWkbByteOrder::LittleEndian)
 | |
| {
 | |
|   INIT_SUCC(ret);
 | |
|   if (OB_FAIL(data.reserve(sizeof(double)))) {
 | |
|   } else {
 | |
|     char *ptr = data.ptr() + data.length();
 | |
|     ObGeoWkbByteOrderUtil::write<double>(ptr, val, bo);
 | |
|     ret = data.set_length(data.length() + sizeof(double));
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| void create_point(ObJsonBuffer &data, double x, double y)
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::POINT));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_double(data, x));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_double(data, y));
 | |
| }
 | |
| 
 | |
| void create_line(ObJsonBuffer &data, std::vector<std::pair<double, double> > &value)
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::LINESTRING));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_uint32(data, value.size()));
 | |
|   for (auto &p : value) {
 | |
|     ASSERT_EQ(OB_SUCCESS, append_double(data, p.first));
 | |
|     ASSERT_EQ(OB_SUCCESS, append_double(data, p.second));
 | |
|   }
 | |
| }
 | |
| 
 | |
| void create_polygon(ObJsonBuffer &data, int lnum, int pnum, std::vector<std::pair<double, double> > &value)
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::POLYGON));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_uint32(data, lnum));
 | |
|   int i = 0;
 | |
|   for (int l = 0; l < lnum; l++) {
 | |
|     ASSERT_EQ(OB_SUCCESS, append_uint32(data, pnum));
 | |
|     for (int p = 0; p < pnum; p++) {
 | |
|       ASSERT_EQ(OB_SUCCESS, append_double(data, value[i].first));
 | |
|       ASSERT_EQ(OB_SUCCESS, append_double(data, value[i].second));
 | |
|       i++;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void create_multipoint(ObJsonBuffer &data, std::vector<std::pair<double, double> > &value)
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::MULTIPOINT));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_uint32(data, value.size()));
 | |
|   for (auto &p : value) {
 | |
|     create_point(data, p.first, p.second);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void create_multiline(ObJsonBuffer &data, int lnum, int pnum, std::vector<std::pair<double, double> > &value)
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::MULTILINESTRING));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_uint32(data, lnum));
 | |
|   int i = 0;
 | |
|   for (int l = 0; l < lnum; l++) {
 | |
|     ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|     ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::LINESTRING));
 | |
|     ASSERT_EQ(OB_SUCCESS, append_uint32(data, pnum));
 | |
|     for (int p = 0; p < pnum; p++) {
 | |
|       ASSERT_EQ(OB_SUCCESS, append_double(data, value[i].first));
 | |
|       ASSERT_EQ(OB_SUCCESS, append_double(data, value[i].second));
 | |
|       i++;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| // anum: polygon num; rnum: ring num per polygon; pnum: point num per ring
 | |
| void create_multipolygon(
 | |
|     ObJsonBuffer &data, int anum, int rnum, int pnum, std::vector<std::pair<double, double> > &value)
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::MULTIPOLYGON));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_uint32(data, anum));
 | |
|   int i = 0;
 | |
|   for (int a = 0; a < anum; a++) {
 | |
|     ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|     ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::POLYGON));
 | |
|     ASSERT_EQ(OB_SUCCESS, append_uint32(data, rnum));
 | |
|     for (int r = 0; r < rnum; r++) {
 | |
|       ASSERT_EQ(OB_SUCCESS, append_uint32(data, pnum));
 | |
|       for (int p = 0; p < pnum; p++) {
 | |
|         ASSERT_EQ(OB_SUCCESS, append_double(data, value[i].first));
 | |
|         ASSERT_EQ(OB_SUCCESS, append_double(data, value[i].second));
 | |
|         i++;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| template<typename GEO1, typename GEO2>
 | |
| bool is_geo_equal(GEO1 &geo1, GEO2 &geo2)
 | |
| {
 | |
|   std::stringstream left;
 | |
|   std::stringstream right;
 | |
|   left << bg::dsv(geo1);
 | |
|   right << bg::dsv(geo2);
 | |
|   if (left.str() == right.str()) {
 | |
|     return true;
 | |
|   }
 | |
|   std::cout << left.str() << std::endl;
 | |
|   std::cout << right.str() << std::endl;
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| typedef bg::strategy::within::geographic_winding<ObWkbGeogPoint> ObPlPaStrategy;
 | |
| typedef bg::strategy::intersection::geographic_segments<> ObLlLaAaStrategy;
 | |
| 
 | |
| typedef bg::model::d2::point_xy<double> point_geom_t;
 | |
| typedef bg::model::multi_point<point_geom_t> mpoint_geom_t;
 | |
| typedef bg::model::linestring<point_geom_t> line_geom_t;
 | |
| typedef bg::model::multi_linestring<line_geom_t> mline_geom_t;
 | |
| typedef bg::model::polygon<point_geom_t, false> polygon_geom_t;
 | |
| typedef bg::model::multi_polygon<polygon_geom_t> mpolygon_geom_t;
 | |
| 
 | |
| typedef bg::model::d2::point_xy<double, bg::cs::geographic<bg::radian> > point_geog_t;
 | |
| typedef bg::model::multi_point<point_geog_t> mpoint_geog_t;
 | |
| typedef bg::model::linestring<point_geog_t> line_geog_t;
 | |
| typedef bg::model::multi_linestring<line_geog_t> mline_geog_t;
 | |
| typedef bg::model::polygon<point_geog_t, false> polygon_geog_t;
 | |
| typedef bg::model::multi_polygon<polygon_geog_t> mpolygon_geog_t;
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_point)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObJsonBuffer data(&allocator);
 | |
|   double x = 1.2;
 | |
|   double y = 3.5;
 | |
|   create_point(data, x, y);
 | |
|   ObIWkbGeomPoint p;
 | |
|   p.set_data(data.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &p);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(x, result->xmax);
 | |
|   ASSERT_EQ(x, result->xmin);
 | |
|   ASSERT_EQ(y, result->ymax);
 | |
|   ASSERT_EQ(y, result->ymin);
 | |
| }
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_linestring)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObJsonBuffer data(&allocator);
 | |
|   std::vector<std::pair<double, double> > val;
 | |
|   val.push_back(std::make_pair(1.5, 1.2));
 | |
|   val.push_back(std::make_pair(2.0, 4.0));
 | |
|   create_line(data, val);
 | |
|   ObIWkbGeomLineString line;
 | |
|   line.set_data(data.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &line);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(2.0, result->xmax);
 | |
|   ASSERT_EQ(1.5, result->xmin);
 | |
|   ASSERT_EQ(4.0, result->ymax);
 | |
|   ASSERT_EQ(1.2, result->ymin);
 | |
| }
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_polygon)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObJsonBuffer data(&allocator);
 | |
|   std::vector<std::pair<double, double> > pol_val;
 | |
|   pol_val.push_back(std::make_pair(1, 1));
 | |
|   pol_val.push_back(std::make_pair(1, 3));
 | |
|   pol_val.push_back(std::make_pair(3, 3));
 | |
|   pol_val.push_back(std::make_pair(3, 1));
 | |
|   pol_val.push_back(std::make_pair(1, 1));
 | |
|   create_polygon(data, 1, 5, pol_val);
 | |
|   ObIWkbGeomPolygon poly;
 | |
|   poly.set_data(data.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &poly);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(1.0, result->xmin);
 | |
|   ASSERT_EQ(3.0, result->xmax);
 | |
|   ASSERT_EQ(1.0, result->ymin);
 | |
|   ASSERT_EQ(3.0, result->ymax);
 | |
| }
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_multipoint)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
| 
 | |
|   ObJsonBuffer data1(&allocator);
 | |
|   std::vector<std::pair<double, double> > val;
 | |
|   val.push_back(std::make_pair(1.0, 1.0));
 | |
|   val.push_back(std::make_pair(1.0, 0.0));
 | |
|   val.push_back(std::make_pair(1.0, 2.0));
 | |
|   create_multipoint(data1, val);
 | |
|   ObIWkbGeomMultiPoint multi_point;
 | |
|   multi_point.set_data(data1.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &multi_point);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(1.0, result->xmin);
 | |
|   ASSERT_EQ(1.0, result->xmax);
 | |
|   ASSERT_EQ(0.0, result->ymin);
 | |
|   ASSERT_EQ(2.0, result->ymax);
 | |
| }
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_multilinestring)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
| 
 | |
|   ObJsonBuffer data1(&allocator);
 | |
|   std::vector<std::pair<double, double> > val;
 | |
|   val.push_back(std::make_pair(0.0, 0.0));
 | |
|   val.push_back(std::make_pair(1.0, 1.0));
 | |
|   val.push_back(std::make_pair(1.0, 1.0));
 | |
|   val.push_back(std::make_pair(2.0, 2.0));
 | |
|   val.push_back(std::make_pair(2.0, 2.0));
 | |
|   val.push_back(std::make_pair(3.0, 3.0));
 | |
|   create_multiline(data1, 3, 2, val);
 | |
|   ObIWkbGeomMultiLineString multi_line;
 | |
|   multi_line.set_data(data1.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &multi_line);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(0.0, result->xmin);
 | |
|   ASSERT_EQ(3.0, result->xmax);
 | |
|   ASSERT_EQ(0.0, result->ymin);
 | |
|   ASSERT_EQ(3.0, result->ymax);
 | |
| }
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_multipolygon)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
| 
 | |
|   ObJsonBuffer data1(&allocator);
 | |
|   std::vector<std::pair<double, double> > val;
 | |
|   val.push_back(std::make_pair(1.0, 1.0));
 | |
|   val.push_back(std::make_pair(1.0, 3.0));
 | |
|   val.push_back(std::make_pair(3.0, 3.0));
 | |
|   val.push_back(std::make_pair(3.0, 1.0));
 | |
|   val.push_back(std::make_pair(1.0, 1.0));
 | |
|   val.push_back(std::make_pair(4.0, 4.0));
 | |
|   val.push_back(std::make_pair(4.0, 6.0));
 | |
|   val.push_back(std::make_pair(6.0, 6.0));
 | |
|   val.push_back(std::make_pair(6.0, 4.0));
 | |
|   val.push_back(std::make_pair(4.0, 4.0));
 | |
|   create_multipolygon(data1, 2, 1, 5, val);
 | |
|   ObIWkbGeomMultiPolygon multi_poly;
 | |
|   multi_poly.set_data(data1.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &multi_poly);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(1.0, result->xmin);
 | |
|   ASSERT_EQ(6.0, result->xmax);
 | |
|   ASSERT_EQ(1.0, result->ymin);
 | |
|   ASSERT_EQ(6.0, result->ymax);
 | |
| }
 | |
| 
 | |
| TEST_F(TestGeoFuncBox, geom_collection)
 | |
| {
 | |
|   ObArenaAllocator allocator(ObModIds::TEST);
 | |
|   ObJsonBuffer data(&allocator);
 | |
|   ASSERT_EQ(OB_SUCCESS, append_bo(data));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_type(data, ObGeoType::GEOMETRYCOLLECTION));
 | |
|   ASSERT_EQ(OB_SUCCESS, append_uint32(data, 6));
 | |
| 
 | |
|   create_point(data, 1.2, 3.5);
 | |
| 
 | |
|   std::vector<std::pair<double, double> > line_val;
 | |
|   line_val.push_back(std::make_pair(1.5, 1.2));
 | |
|   line_val.push_back(std::make_pair(2.0, 4.0));
 | |
|   create_line(data, line_val);
 | |
| 
 | |
|   std::vector<std::pair<double, double> > pol_val;
 | |
|   pol_val.push_back(std::make_pair(1, 1));
 | |
|   pol_val.push_back(std::make_pair(1, 3));
 | |
|   pol_val.push_back(std::make_pair(3, 3));
 | |
|   pol_val.push_back(std::make_pair(3, 1));
 | |
|   pol_val.push_back(std::make_pair(1, 1));
 | |
|   create_polygon(data, 1, 5, pol_val);
 | |
| 
 | |
|   std::vector<std::pair<double, double> > mpt_val;
 | |
|   mpt_val.push_back(std::make_pair(1.0, 1.0));
 | |
|   mpt_val.push_back(std::make_pair(1.0, 0.0));
 | |
|   mpt_val.push_back(std::make_pair(1.0, 2.0));
 | |
|   create_multipoint(data, mpt_val);
 | |
| 
 | |
|   std::vector<std::pair<double, double> > mpl_val;
 | |
|   mpl_val.push_back(std::make_pair(0.0, 0.0));
 | |
|   mpl_val.push_back(std::make_pair(1.0, 1.0));
 | |
|   mpl_val.push_back(std::make_pair(1.0, 1.0));
 | |
|   mpl_val.push_back(std::make_pair(2.0, 2.0));
 | |
|   mpl_val.push_back(std::make_pair(2.0, 2.0));
 | |
|   mpl_val.push_back(std::make_pair(3.0, 3.0));
 | |
|   create_multiline(data, 3, 2, mpl_val);
 | |
| 
 | |
|   std::vector<std::pair<double, double> > mpy_val;
 | |
|   mpy_val.push_back(std::make_pair(1.0, 1.0));
 | |
|   mpy_val.push_back(std::make_pair(1.0, 3.0));
 | |
|   mpy_val.push_back(std::make_pair(3.0, 3.0));
 | |
|   mpy_val.push_back(std::make_pair(3.0, 1.0));
 | |
|   mpy_val.push_back(std::make_pair(1.0, 1.0));
 | |
|   mpy_val.push_back(std::make_pair(4.0, 4.0));
 | |
|   mpy_val.push_back(std::make_pair(4.0, 6.0));
 | |
|   mpy_val.push_back(std::make_pair(6.0, 6.0));
 | |
|   mpy_val.push_back(std::make_pair(6.0, 4.0));
 | |
|   mpy_val.push_back(std::make_pair(4.0, 4.0));
 | |
|   create_multipolygon(data, 2, 1, 5, mpy_val);
 | |
| 
 | |
|   ObIWkbGeomCollection collection;
 | |
|   collection.set_data(data.string());
 | |
| 
 | |
|   ObGeoEvalCtx gis_context(&allocator);
 | |
|   gis_context.ut_set_geo_count(1);
 | |
|   gis_context.ut_set_geo_arg(0, &collection);
 | |
|   ObGeogBox *result = NULL;
 | |
|   int ret = ObGeoFunc<ObGeoFuncType::Box>::geo_func::eval(gis_context, result);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ASSERT_TRUE(result != NULL);
 | |
|   ASSERT_EQ(0.0, result->xmin);
 | |
|   ASSERT_EQ(6.0, result->xmax);
 | |
|   ASSERT_EQ(0.0, result->ymin);
 | |
|   ASSERT_EQ(6.0, result->ymax);
 | |
| }
 | |
| 
 | |
| }  // namespace common
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   ::testing::InitGoogleTest(&argc, argv);
 | |
|   // system("rm -f test_geo_func_box.log");
 | |
|   // OB_LOGGER.set_file_name("test_geo_func_box.log");
 | |
|   // OB_LOGGER.set_log_level("INFO");
 | |
|   return RUN_ALL_TESTS();
 | |
| } | 
