Slight modifications for simple algorithm, improved test

This commit is contained in:
Andrei Chulkov 2020-01-15 16:28:18 +03:00
parent bf83e66905
commit 45d3537b99
3 changed files with 75 additions and 12 deletions

View File

@ -450,7 +450,8 @@ inline void makeDifferences(IColumn::Offsets & values)
}
void IPolygonDictionary::extractMultiPolygons(const ColumnPtr &column, std::vector<MultiPolygon> &dest) {
void IPolygonDictionary::extractMultiPolygons(const ColumnPtr &column, std::vector<MultiPolygon> &dest)
{
IColumn::Offsets polygons, rings, points;
const auto ptr_multi_polygons = typeid_cast<const ColumnArray*>(column.get());
if (!ptr_multi_polygons)
@ -606,15 +607,22 @@ std::shared_ptr<const IExternalLoadable> SimplePolygonDictionary::clone() const
bool SimplePolygonDictionary::find(const Point &point, size_t & id) const
{
bool found = false;
double area = 0;
for (size_t i = 0; i < (this->polygons).size(); ++i)
{
if (bg::covered_by(point, (this->polygons)[i]))
{
id = i;
return true;
double new_area = bg::area((this->polygons)[i]);
if (!found || new_area < area)
{
found = true;
id = i;
area = new_area;
}
}
}
return false;
return found;
}
void registerDictionaryPolygon(DictionaryFactory & factory)

View File

@ -1,24 +1,56 @@
dictGet test_01037.dict (-100,-42) qqq 101
dictGet test_01037.dict (0,0) Click 42
dictGet test_01037.dict (0.99,2.99) Click 42
dictGet test_01037.dict (-1,0) Click South 423
dictGet test_01037.dict (-0.1,0) Click South 423
dictGet test_01037.dict (0,-2) Click West 424
dictGet test_01037.dict (0,-1.1) Click West 424
dictGet test_01037.dict (0,1.1) Click North 422
dictGet test_01037.dict (0,2) Click North 422
dictGet test_01037.dict (0.1,0) Click East 421
dictGet test_01037.dict (0.99,2.99) Click North 422
dictGet test_01037.dict (1,0) Click East 421
dictGet test_01037.dict (3,3) House 314159
dictGet test_01037.dict (5,6) Click 42
dictGet test_01037.dict (7.01,7.01) qqq 101
dictGetOrDefault test_01037.dict (-100,-42) www 1234
dictGetOrDefault test_01037.dict (0,0) Click 42
dictGetOrDefault test_01037.dict (0.99,2.99) Click 42
dictGetOrDefault test_01037.dict (-1,0) Click South 423
dictGetOrDefault test_01037.dict (-0.1,0) Click South 423
dictGetOrDefault test_01037.dict (0,-2) Click West 424
dictGetOrDefault test_01037.dict (0,-1.1) Click West 424
dictGetOrDefault test_01037.dict (0,1.1) Click North 422
dictGetOrDefault test_01037.dict (0,2) Click North 422
dictGetOrDefault test_01037.dict (0.1,0) Click East 421
dictGetOrDefault test_01037.dict (0.99,2.99) Click North 422
dictGetOrDefault test_01037.dict (1,0) Click East 421
dictGetOrDefault test_01037.dict (3,3) House 314159
dictGetOrDefault test_01037.dict (5,6) Click 42
dictGetOrDefault test_01037.dict (7.01,7.01) www 1234
dictGetOrDefault test_01037.dict (-100,-42) dd 44
dictGetOrDefault test_01037.dict (0,0) Click 42
dictGetOrDefault test_01037.dict (0.99,2.99) Click 42
dictGetOrDefault test_01037.dict (-1,0) Click South 423
dictGetOrDefault test_01037.dict (-0.1,0) Click South 423
dictGetOrDefault test_01037.dict (0,-2) Click West 424
dictGetOrDefault test_01037.dict (0,-1.1) Click West 424
dictGetOrDefault test_01037.dict (0,1.1) Click North 422
dictGetOrDefault test_01037.dict (0,2) Click North 422
dictGetOrDefault test_01037.dict (0.1,0) Click East 421
dictGetOrDefault test_01037.dict (0.99,2.99) Click North 422
dictGetOrDefault test_01037.dict (1,0) Click East 421
dictGetOrDefault test_01037.dict (3,3) House 314159
dictGetOrDefault test_01037.dict (5,6) Click 42
dictGetOrDefault test_01037.dict (7.01,7.01) ee 55
dictHas test_01037.dict (-100,-42) 0
dictHas test_01037.dict (-1,0) 1
dictHas test_01037.dict (-0.1,0) 1
dictHas test_01037.dict (0,-2) 1
dictHas test_01037.dict (0,-1.1) 1
dictHas test_01037.dict (0,-1) 1
dictHas test_01037.dict (0,0) 1
dictHas test_01037.dict (0,1) 1
dictHas test_01037.dict (0,1.1) 1
dictHas test_01037.dict (0,2) 1
dictHas test_01037.dict (0.1,0) 1
dictHas test_01037.dict (0.99,2.99) 1
dictHas test_01037.dict (1,0) 1
dictHas test_01037.dict (1,1) 1
dictHas test_01037.dict (1,3) 1
dictHas test_01037.dict (3,3) 1
dictHas test_01037.dict (5,1) 1

View File

@ -10,6 +10,10 @@ DROP TABLE IF EXISTS test_01037.polygons;
CREATE TABLE test_01037.polygons (key Array(Array(Array(Array(Float64)))), name String, value UInt64) ENGINE = Memory;
INSERT INTO test_01037.polygons VALUES ([[[[1, 3], [1, 1], [3, 1], [3, -1], [1, -1], [1, -3], [-1, -3], [-1, -1], [-3, -1], [-3, 1], [-1, 1], [-1, 3]]], [[[5, 5], [5, 1], [7, 1], [7, 7], [1, 7], [1, 5]]]], 'Click', 42);
INSERT INTO test_01037.polygons VALUES ([[[[5, 5], [5, -5], [-5, -5], [-5, 5]], [[1, 3], [1, 1], [3, 1], [3, -1], [1, -1], [1, -3], [-1, -3], [-1, -1], [-3, -1], [-3, 1], [-1, 1], [-1, 3]]]], 'House', 314159);
INSERT INTO test_01037.polygons VALUES ([[[[3, 1], [0, 1], [0, -1], [3, -1]]]], 'Click East', 421);
INSERT INTO test_01037.polygons VALUES ([[[[-1, 1], [1, 1], [1, 3], [-1, 3]]]], 'Click North', 422);
INSERT INTO test_01037.polygons VALUES ([[[[-3, 1], [-3, -1], [0, -1], [0, 1]]]], 'Click South', 423);
INSERT INTO test_01037.polygons VALUES ([[[[-1, -1], [1, -1], [1, -3], [-1, -3]]]], 'Click West', 424);
CREATE DICTIONARY test_01037.dict
(
@ -25,7 +29,19 @@ LAYOUT(POLYGON());
DROP TABLE IF EXISTS test_01037.points;
CREATE TABLE test_01037.points (x Float64, y Float64, def_i UInt64, def_s String) ENGINE = Memory;
INSERT INTO test_01037.points VALUES (0.0, 0.0, 11, 'aa'), (3.0, 3.0, 22, 'bb'), (5.0, 6.0, 33, 'cc'), (-100.0, -42.0, 44, 'dd'), (7.01, 7.01, 55, 'ee'), (0.99, 2.99, 66, 'ee');
INSERT INTO test_01037.points VALUES (0.1, 0.0, 112, 'aax');
INSERT INTO test_01037.points VALUES (-0.1, 0.0, 113, 'aay');
INSERT INTO test_01037.points VALUES (0.0, 1.1, 114, 'aaz');
INSERT INTO test_01037.points VALUES (0.0, -1.1, 115, 'aat');
INSERT INTO test_01037.points VALUES (3.0, 3.0, 22, 'bb');
INSERT INTO test_01037.points VALUES (5.0, 6.0, 33, 'cc');
INSERT INTO test_01037.points VALUES (-100.0, -42.0, 44, 'dd');
INSERT INTO test_01037.points VALUES (7.01, 7.01, 55, 'ee')
INSERT INTO test_01037.points VALUES (0.99, 2.99, 66, 'ee');
INSERT INTO test_01037.points VALUES (1.0, 0.0, 771, 'ffa');
INSERT INTO test_01037.points VALUES (-1.0, 0.0, 772, 'ffb');
INSERT INTO test_01037.points VALUES (0.0, 2.0, 773, 'ffc');
INSERT INTO test_01037.points VALUES (0.0, -2.0, 774, 'ffd');
select 'dictGet', 'test_01037.dict' as dict_name, tuple(x, y) as key,
dictGet(dict_name, 'name', key),
@ -37,7 +53,14 @@ select 'dictGetOrDefault', 'test_01037.dict' as dict_name, tuple(x, y) as key,
dictGetOrDefault(dict_name, 'name', key, def_s),
dictGetOrDefault(dict_name, 'value', key, def_i) from test_01037.points order by x, y;
INSERT INTO test_01037.points VALUES (5.0, 5.0, 0, ''), (5.0, 1.0, 0, ''), (1.0, 3.0, 0, '');
INSERT INTO test_01037.points VALUES (5.0, 5.0, 0, '');
INSERT INTO test_01037.points VALUES (5.0, 1.0, 0, '');
INSERT INTO test_01037.points VALUES (1.0, 3.0, 0, '');
INSERT INTO test_01037.points VALUES (0.0, 0.0, 0, '');
INSERT INTO test_01037.points VALUES (0.0, 1.0, 0, '');
INSERT INTO test_01037.points VALUES (0.0, -1.0, 0, '');
INSERT INTO test_01037.points VALUES (1.0, 1.0, 0, '');
select 'dictHas', 'test_01037.dict' as dict_name, tuple(x, y) as key,
dictHas(dict_name, key) from test_01037.points order by x, y;