From: Sarah Hoffmann Date: Mon, 9 Jan 2017 19:41:57 +0000 (+0100) Subject: add node grids for tests and test for interpolation update X-Git-Tag: v3.0.0~68 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/e04838cc7106a6bb35589231dead41edee0bc408 add node grids for tests and test for interpolation update --- diff --git a/test/bdd/environment.py b/test/bdd/environment.py index 6411d011..65afc816 100644 --- a/test/bdd/environment.py +++ b/test/bdd/environment.py @@ -196,6 +196,15 @@ class OSMDataFactory(object): return scene + def clear_grid(self): + self.grid = {} + + def add_grid_node(self, nodeid, x, y): + self.grid[nodeid] = (x, y) + + def grid_node(self, nodeid): + return self.grid.get(nodeid) + def before_all(context): # logging setup diff --git a/test/bdd/osm2pgsql/update/interpolation.feature b/test/bdd/osm2pgsql/update/interpolation.feature new file mode 100644 index 00000000..3cb19297 --- /dev/null +++ b/test/bdd/osm2pgsql/update/interpolation.feature @@ -0,0 +1,40 @@ +@DB +Feature: Update of interpolations + + @wip + # Test case for #598 + Scenario: add an interpolation way + Given the grid + | 4 | 7 | 5 | + | 10| | 12| + When loading osm data + """ + n3 + n4 Taddr:housenumber=1 + n5 Taddr:housenumber=5 + n10 + n12 + w11 Thighway=residential,name=X Nn4,n5 + w12 Thighway=residential,name=Highway Nn10,n12 + """ + And updating osm data + """ + n4 Taddr:housenumber=1 + n5 Taddr:housenumber=5 + w1 Taddr:interpolation=odd Nn4,n5 + w2 Tbuilding=yes,name=ggg Nn4,n10,n7,n4 + w3 Tbuilding=yes,name=ggg Nn4,n10,n7,n4 + w4 Tbuilding=yes,name=ggg Nn4,n10,n7,n4 + w5 Tbuilding=yes,name=ggg Nn4,n10,n7,n4 + w6 Tbuilding=yes,name=ggg Nn4,n10,n7,n4 + w7 Tbuilding=yes,name=ggg Nn4,n10,n7,n4 + w11 dD + """ + Then place contains + | object | housenumber | + | N4:place | 1 | + | N5:place | 5 | + | W1:place | odd | + And W1 expands to interpolation + | start | end | + | 1 | 5 | diff --git a/test/bdd/steps/osm_data.py b/test/bdd/steps/osm_data.py index 926fb9ab..588dcefe 100644 --- a/test/bdd/steps/osm_data.py +++ b/test/bdd/steps/osm_data.py @@ -4,16 +4,52 @@ import random import os from nose.tools import * # for assert functions +@given(u'the (\d+ )?grid') +def define_node_grid(context, grid_step): + """ + Define a grid of node positions. + """ + if grid_step is not None: + grid_step = int(grd_step.strip()) + else: + grid_step = 0.00001 + + context.osm.clear_grid() + + i = 0 + for h in context.table.headings: + if h.isdigit(): + context.osm.add_grid_node(int(h), 0, i) + i += grid_step + + x = grid_step + for r in context.table: + y = 0 + for h in r: + if h.isdigit(): + context.osm.add_grid_node(int(h), x, y) + y += grid_step + x += grid_step + + @when(u'loading osm data') def load_osm_file(context): + """ + Load the given data into a freshly created test data using osm2pgsql. + No further indexing is done. + The data is expected as attached text in OPL format. + """ # create a OSM file in /tmp and import it with tempfile.NamedTemporaryFile(dir='/tmp', suffix='.opl', delete=False) as fd: fname = fd.name for line in context.text.splitlines(): if line.startswith('n') and line.find(' x') < 0: - line += " x%d y%d" % (random.random() * 360 - 180, - random.random() * 180 - 90) + coord = context.osm.grid_node(int(line[1:].split(' ')[0])) + if coord is None: + coord = (random.random() * 360 - 180, + random.random() * 180 - 90) + line += " x%f y%f" % coord fd.write(line.encode('utf-8')) fd.write(b'\n') @@ -33,12 +69,22 @@ def load_osm_file(context): @when(u'updating osm data') def update_from_osm_file(context): + """ + Update a database previously populated with 'loading osm data'. + Needs to run indexing on the existing data first to yield the correct result. + + The data is expected as attached text in OPL format. + """ context.nominatim.run_setup_script('create-functions', 'create-partition-functions') cur = context.db.cursor() cur.execute("""insert into placex (osm_type, osm_id, class, type, name, admin_level, housenumber, street, addr_place, isin, postcode, country_code, extratags, geometry) select * from place""") + cur.execute( + """select insert_osmline (osm_id, housenumber, street, addr_place, + postcode, country_code, geometry) + from place where class='place' and type='houses' and osm_type='W'""") context.db.commit() context.nominatim.run_setup_script('index', 'index-noanalyse') context.nominatim.run_setup_script('create-functions', 'create-partition-functions',