diff options
author | cc-engineering <13055392+cc-engineering@users.noreply.github.com> | 2019-01-18 19:27:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-18 19:27:17 +0300 |
commit | d8f32e8165d00a841e11467e476fc354a1bafe53 (patch) | |
tree | 6b57ec3b39ed81576b9bea47e7fcbc56bd08da74 /indexer | |
parent | a33a7db094eacec0d6e6eaa9419f992d9da85996 (diff) | |
parent | 0be3b828ecce1f8992163b02649fd23ce427568b (diff) |
Merge pull request #10217 from tatiana-yan/add_locality_index_tests
[indexer][tests] Add tests for LocalityIndex top size.
Diffstat (limited to 'indexer')
-rw-r--r-- | indexer/indexer_tests/locality_index_test.cpp | 54 | ||||
-rw-r--r-- | indexer/locality_object.hpp | 25 |
2 files changed, 56 insertions, 23 deletions
diff --git a/indexer/indexer_tests/locality_index_test.cpp b/indexer/indexer_tests/locality_index_test.cpp index 811313a49d..c15b8a8eff 100644 --- a/indexer/indexer_tests/locality_index_test.cpp +++ b/indexer/indexer_tests/locality_index_test.cpp @@ -73,10 +73,10 @@ UNIT_TEST(BuildLocalityIndexTest) { LocalityObjectVector objects; objects.m_objects.resize(4); - objects.m_objects[0].SetForTests(1, m2::PointD{0, 0}); - objects.m_objects[1].SetForTests(2, m2::PointD{1, 0}); - objects.m_objects[2].SetForTests(3, m2::PointD{1, 1}); - objects.m_objects[3].SetForTests(4, m2::PointD{0, 1}); + objects.m_objects[0].SetForTesting(1, m2::PointD{0, 0}); + objects.m_objects[1].SetForTesting(2, m2::PointD{1, 0}); + objects.m_objects[2].SetForTesting(3, m2::PointD{1, 1}); + objects.m_objects[3].SetForTesting(4, m2::PointD{0, 1}); vector<char> localityIndex; MemWriter<vector<char>> writer(localityIndex); @@ -94,10 +94,10 @@ UNIT_TEST(LocalityIndexRankTest) { LocalityObjectVector objects; objects.m_objects.resize(4); - objects.m_objects[0].SetForTests(1, m2::PointD{1, 0}); - objects.m_objects[1].SetForTests(2, m2::PointD{2, 0}); - objects.m_objects[2].SetForTests(3, m2::PointD{3, 0}); - objects.m_objects[3].SetForTests(4, m2::PointD{4, 0}); + objects.m_objects[0].SetForTesting(1, m2::PointD{1, 0}); + objects.m_objects[1].SetForTesting(2, m2::PointD{2, 0}); + objects.m_objects[2].SetForTesting(3, m2::PointD{3, 0}); + objects.m_objects[3].SetForTesting(4, m2::PointD{4, 0}); vector<char> localityIndex; MemWriter<vector<char>> writer(localityIndex); @@ -125,17 +125,19 @@ UNIT_TEST(LocalityIndexRankTest) UNIT_TEST(LocalityIndexTopSizeTest) { LocalityObjectVector objects; - objects.m_objects.resize(7); + objects.m_objects.resize(8); // Same cell. - objects.m_objects[0].SetForTests(1, m2::PointD{1.0, 0.0}); - objects.m_objects[1].SetForTests(2, m2::PointD{1.0, 0.0}); - objects.m_objects[2].SetForTests(3, m2::PointD{1.0, 0.0}); - objects.m_objects[3].SetForTests(4, m2::PointD{1.0, 0.0}); + objects.m_objects[0].SetForTesting(1, m2::PointD{1.0, 0.0}); + objects.m_objects[1].SetForTesting(2, m2::PointD{1.0, 0.0}); + objects.m_objects[2].SetForTesting(3, m2::PointD{1.0, 0.0}); + objects.m_objects[3].SetForTesting(4, m2::PointD{1.0, 0.0}); // Another close cell. - objects.m_objects[4].SetForTests(5, m2::PointD{1.0, 1.0}); - objects.m_objects[5].SetForTests(6, m2::PointD{1.0, 1.0}); + objects.m_objects[4].SetForTesting(5, m2::PointD{1.0, 1.0}); + objects.m_objects[5].SetForTesting(6, m2::PointD{1.0, 1.0}); // Far cell. - objects.m_objects[6].SetForTests(7, m2::PointD{10.0, 10.0}); + objects.m_objects[6].SetForTesting(7, m2::PointD{10.0, 10.0}); + // The big object contains all points and must be returned on any query. + objects.m_objects[7].SetForTesting(8, m2::RectD{0.0, 0.0, 10.0, 10.0}); vector<char> localityIndex; MemWriter<vector<char>> writer(localityIndex); @@ -143,17 +145,25 @@ UNIT_TEST(LocalityIndexTopSizeTest) MemReader reader(localityIndex.data(), localityIndex.size()); indexer::GeoObjectsIndex<MemReader> index(reader); + + // There is only one object (the big object) at this point. + TEST_EQUAL(GetRankedIds(index, m2::PointD{2.0, 2.0} /* center */, + m2::PointD{2.0, 2.0} /* border */, 8 /* topSize */) + .size(), + 1, ()); + + // There are 4 small objects and 1 big object at this point. TEST_EQUAL(GetRankedIds(index, m2::PointD{1.0, 0.0} /* center */, - m2::PointD{10.0, 10.0} /* border */, 4 /* topSize */) + m2::PointD{10.0, 10.0} /* border */, 5 /* topSize */) .size(), - 4, ()); + 5, ()); // 4 objects are indexed at the central cell. Index does not guarantee the order but must - // return 4 objects. + // return 4 objects from central cell and the big object. TEST_EQUAL(GetRankedIds(index, m2::PointD{1.0, 0.0} /* center */, m2::PointD{10.0, 10.0} /* border */, 3 /* topSize */) .size(), - 4, ()); + 5, ()); // At the {1.0, 1.0} point there are also 2 objects, but it's not a central cell, index must // return 5 (topSize) objects. @@ -170,8 +180,8 @@ UNIT_TEST(LocalityIndexTopSizeTest) 5, ()); TEST_EQUAL(GetRankedIds(index, m2::PointD{4.0, 0.0} /* center */, - m2::PointD{10.0, 10.0} /* border */, 7 /* topSize */) + m2::PointD{10.0, 10.0} /* border */, 8 /* topSize */) .size(), - 7, ()); + 8, ()); } } // namespace diff --git a/indexer/locality_object.hpp b/indexer/locality_object.hpp index d6c390d5dd..27c50b5093 100644 --- a/indexer/locality_object.hpp +++ b/indexer/locality_object.hpp @@ -1,6 +1,10 @@ #pragma once #include "geometry/point2d.hpp" +#include "geometry/polygon.hpp" +#include "geometry/rect2d.hpp" + +#include "coding/geometry_coding.hpp" #include "base/buffer_vector.hpp" #include "base/geo_object_id.hpp" @@ -41,13 +45,32 @@ public: toDo(m_triangles[i - 2], m_triangles[i - 1], m_triangles[i]); } - void SetForTests(uint64_t id, m2::PointD point) + void SetForTesting(uint64_t id, m2::PointD point) { m_id = id; m_points.clear(); m_points.push_back(point); } + void SetForTesting(uint64_t id, m2::RectD rect) + { + m_id = id; + + m_points.clear(); + m_points.push_back(rect.LeftBottom()); + m_points.push_back(rect.RightBottom()); + m_points.push_back(rect.RightTop()); + m_points.push_back(rect.LeftTop()); + + buffer_vector<m2::PointD, 32> strip; + auto const index = FindSingleStrip( + m_points.size(), IsDiagonalVisibleFunctor<std::vector<m2::PointD>::const_iterator>( + m_points.begin(), m_points.end())); + MakeSingleStripFromIndex(index, m_points.size(), + [&](size_t i) { strip.push_back(m_points[i]); }); + serial::StripToTriangles(strip.size(), strip, m_triangles); + } + private: uint64_t m_id = 0; std::vector<m2::PointD> m_points; |