From 48e6253442ff0670be6c3d91d6b13d8d885d17f7 Mon Sep 17 00:00:00 2001 From: Anton Popov Date: Wed, 29 Jul 2020 04:32:23 +0300 Subject: [PATCH] minor fixes --- .../external-dicts-dict-polygon.md | 5 +-- .../PolygonDictionaryImplementations.cpp | 5 ++- src/Dictionaries/PolygonDictionaryUtils.cpp | 36 ++++++++----------- src/Dictionaries/PolygonDictionaryUtils.h | 4 +-- .../01037_polygon_dicts_correctness_all.sh | 2 +- .../01037_polygon_dicts_simple_functions.sh | 2 +- 6 files changed, 26 insertions(+), 28 deletions(-) diff --git a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md index 5747d04c22e..81fe87745ce 100644 --- a/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md +++ b/docs/ru/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-polygon.md @@ -56,9 +56,9 @@ LAYOUT(POLYGON()) Пользователь может [загружать свои собственные данные](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources.md) во всех поддерживаемых ClickHouse форматах. -Доступно 3 типа [хранения данных в памяти](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md): (TODO: время, память) +Доступно 3 типа [хранения данных в памяти](../../../sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md): -- POLYGON. Это наивная реализация, в которой на каждый запрос делается линейный проход по всем полигонам, и для каждого проверяется принадлежность без использования дополнительных индексов. +- POLYGON_SIMPLE. Это наивная реализация, в которой на каждый запрос делается линейный проход по всем полигонам, и для каждого проверяется принадлежность без использования дополнительных индексов. - POLYGON_INDEX_EACH. Для каждого полигона строится отдельный индекс, который позволяет быстро проверять принадлежность в большинстве случаев (оптимизирован под географические регионы). Также на рассматриваемую область накладывается сетка, которая значительно сужает количество рассматриваемых полигонов. @@ -68,6 +68,7 @@ LAYOUT(POLYGON()) - POLYGON_INDEX_CELL. В этом размещении также строится сетка, описанная выше. Доступны такие же параметры. Для каждой ячейки-листа строится индекс на всех попадающих в неё кусках полигонов, который позволяет быстро отвечать на запрос. +- POLYGON. Синоним к POLYGON_INDEX_CELL. Запросы к словарю осуществляются с помощью стандартных [функций](../../../sql-reference/functions/ext-dict-functions.md) для работы со внешними словарями. Важным отличием является то, что здесь ключами будут являются точки, для которых хочется найти содержащий их полигон. diff --git a/src/Dictionaries/PolygonDictionaryImplementations.cpp b/src/Dictionaries/PolygonDictionaryImplementations.cpp index d61b5d5dfdf..4dd42ac8b6e 100644 --- a/src/Dictionaries/PolygonDictionaryImplementations.cpp +++ b/src/Dictionaries/PolygonDictionaryImplementations.cpp @@ -244,9 +244,12 @@ DictionaryPtr createLayout(const std::string & , void registerDictionaryPolygon(DictionaryFactory & factory) { - factory.registerLayout("polygon", createLayout, true); + factory.registerLayout("polygon_simple", createLayout, true); factory.registerLayout("polygon_index_each", createLayout, true); factory.registerLayout("polygon_index_cell", createLayout, true); + + /// Alias to the most performant dictionary type - polygon_index_cell + factory.registerLayout("polygon", createLayout, true); } } diff --git a/src/Dictionaries/PolygonDictionaryUtils.cpp b/src/Dictionaries/PolygonDictionaryUtils.cpp index fa8abc8a6b8..176711d9002 100644 --- a/src/Dictionaries/PolygonDictionaryUtils.cpp +++ b/src/Dictionaries/PolygonDictionaryUtils.cpp @@ -11,6 +11,11 @@ namespace DB { +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + FinalCell::FinalCell(const std::vector & polygon_ids_, const std::vector &, const Box &, bool is_last_covered_): polygon_ids(polygon_ids_) { @@ -62,7 +67,7 @@ const FinalCellWithSlabs * FinalCellWithSlabs::find(Coord, Coord) const SlabsPolygonIndex::SlabsPolygonIndex( const std::vector & polygons) - : log(&Logger::get("SlabsPolygonIndex")), + : log(&Poco::Logger::get("SlabsPolygonIndex")), sorted_x(uniqueX(polygons)) { indexBuild(polygons); @@ -100,7 +105,7 @@ void SlabsPolygonIndex::indexBuild(const std::vector & polygons) } /** Sorting edges of (left_point, right_point, polygon_id) in that order */ - std::sort(all_edges.begin(), all_edges.end(), Edge::compare1); + std::sort(all_edges.begin(), all_edges.end(), Edge::compareByLeftPoint); for (size_t i = 0; i != all_edges.size(); ++i) all_edges[i].edge_id = i; @@ -112,7 +117,7 @@ void SlabsPolygonIndex::indexBuild(const std::vector & polygons) /** Using custom comparator for fetching edges in right_point order, like in scanline */ auto cmp = [](const Edge & a, const Edge & b) { - return Edge::compare2(a, b); + return Edge::compareByRightPoint(a, b); }; std::set interesting_edges(cmp); @@ -155,9 +160,9 @@ void SlabsPolygonIndex::indexBuild(const std::vector & polygons) size_t r = edge_right[i]; if (l == n || sorted_x[l] != all_edges[i].l.x() || sorted_x[r] != all_edges[i].r.x()) { - LOG_ERROR(log, "Error occured while building polygon index. Edge {} is [{}, {}] but found [{}, {}]. l = {}, r = {}", - i, all_edges[i].l.x(), all_edges[i].r.x(), sorted_x[l], sorted_x[r], l, r); - throw Poco::Exception("polygon index build error"); + throw Exception(ErrorCodes::LOGICAL_ERROR, + "Error occured while building polygon index. Edge {} is [{}, {}] but found [{}, {}]. l = {}, r = {}", + i, all_edges[i].l.x(), all_edges[i].r.x(), sorted_x[l], sorted_x[r], l, r); } /** Adding [l, r) to the segment tree */ @@ -221,7 +226,7 @@ SlabsPolygonIndex::Edge::Edge( b = l.y() - k * l.x(); } -bool SlabsPolygonIndex::Edge::compare1(const Edge & a, const Edge & b) +bool SlabsPolygonIndex::Edge::compareByLeftPoint(const Edge & a, const Edge & b) { /** Comparing left point */ if (a.l.x() != b.l.x()) @@ -238,7 +243,7 @@ bool SlabsPolygonIndex::Edge::compare1(const Edge & a, const Edge & b) return a.polygon_id < b.polygon_id; } -bool SlabsPolygonIndex::Edge::compare2(const Edge & a, const Edge & b) +bool SlabsPolygonIndex::Edge::compareByRightPoint(const Edge & a, const Edge & b) { /** Comparing right point */ if (a.r.x() != b.r.x()) @@ -258,18 +263,6 @@ bool SlabsPolygonIndex::Edge::compare2(const Edge & a, const Edge & b) return a.edge_id < b.edge_id; } -namespace -{ - inline void update_result(bool & found, size_t & id, const size_t & new_id) - { - if (!found || new_id < id) - { - found = true; - id = new_id; - } - } -} - bool SlabsPolygonIndex::find(const Point & point, size_t & id) const { /** Vertical line or nothing at all, no match here */ @@ -315,7 +308,8 @@ bool SlabsPolygonIndex::find(const Point & point, size_t & id) const { if (i + 1 == intersections.size() || intersections[i] != intersections[i + 1]) { - update_result(found, id, intersections[i]); + found = true; + id = intersections[i]; break; } } diff --git a/src/Dictionaries/PolygonDictionaryUtils.h b/src/Dictionaries/PolygonDictionaryUtils.h index 81049cc76e8..83ce2c26944 100644 --- a/src/Dictionaries/PolygonDictionaryUtils.h +++ b/src/Dictionaries/PolygonDictionaryUtils.h @@ -58,8 +58,8 @@ public: Edge(const Point & l, const Point & r, size_t polygon_id, size_t edge_id); - static bool compare1(const Edge & a, const Edge & b); - static bool compare2(const Edge & a, const Edge & b); + static bool compareByLeftPoint(const Edge & a, const Edge & b); + static bool compareByRightPoint(const Edge & a, const Edge & b); }; /** EdgeLine is optimized version of Edge. */ diff --git a/tests/queries/0_stateless/01037_polygon_dicts_correctness_all.sh b/tests/queries/0_stateless/01037_polygon_dicts_correctness_all.sh index b7b1653d54a..9fe264ec30a 100755 --- a/tests/queries/0_stateless/01037_polygon_dicts_correctness_all.sh +++ b/tests/queries/0_stateless/01037_polygon_dicts_correctness_all.sh @@ -5,7 +5,7 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) TMP_DIR="/tmp" -declare -a SearchTypes=("POLYGON" "POLYGON_INDEX_EACH" "POLYGON_INDEX_CELL") +declare -a SearchTypes=("POLYGON" "POLYGON_SIMPLE" "POLYGON_INDEX_EACH" "POLYGON_INDEX_CELL") tar -xf ${CURDIR}/01037_test_data_search.tar.gz -C ${CURDIR} diff --git a/tests/queries/0_stateless/01037_polygon_dicts_simple_functions.sh b/tests/queries/0_stateless/01037_polygon_dicts_simple_functions.sh index fb7c374607e..0a407dffb6a 100755 --- a/tests/queries/0_stateless/01037_polygon_dicts_simple_functions.sh +++ b/tests/queries/0_stateless/01037_polygon_dicts_simple_functions.sh @@ -49,7 +49,7 @@ INSERT INTO test_01037.points VALUES (0.0, -2.0, 774, 'ffd'); " -declare -a SearchTypes=("POLYGON" "POLYGON_INDEX_EACH" "POLYGON_INDEX_CELL") +declare -a SearchTypes=("POLYGON" "POLYGON_SIMPLE" "POLYGON_INDEX_EACH" "POLYGON_INDEX_CELL") for type in ${SearchTypes[@]}; do