def run_setup_script(self, *args, **kwargs):
self.run_nominatim_script('setup', *args, **kwargs)
- def run_update_script(self, *args):
- self.run_nominatim_script('update', *args)
+ def run_update_script(self, *args, **kwargs):
+ self.run_nominatim_script('update', *args, **kwargs)
def run_nominatim_script(self, script, *args, **kwargs):
cmd = [os.path.join(self.build_dir, 'utils', '%s.php' % script)]
--- /dev/null
+@DB
+Feature: Update of relations by osm2pgsql
+ Testing relation update by osm2pgsql.
+
+ Scenario: Remove all members of a relation
+ When loading osm data
+ """
+ n1 Tamenity=prison,name=foo
+ n200 x0 y0
+ n201 x0 y0.0001
+ n202 x0.0001 y0.0001
+ n203 x0.0001 y0
+ w2 Tref=45' Nn200,n201,n202,n203,n200
+ r1 Ttype=multipolygon,tourism=hotel,name=XZ' Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'XZ'
+ When updating osm data
+ """
+ r1 Ttype=multipolygon,tourism=hotel,name=XZ Mn1@
+ """
+ Then place has no entry for R1
+
+
+ Scenario: Change type of a relation
+ When loading osm data
+ """
+ n200 x0 y0
+ n201 x0 y0.0001
+ n202 x0.0001 y0.0001
+ n203 x0.0001 y0
+ w2 Tref=45 Nn200,n201,n202,n203,n200
+ r1 Ttype=multipolygon,tourism=hotel,name=XZ Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'XZ'
+ When updating osm data
+ """
+ r1 Ttype=multipolygon,amenity=prison,name=XZ Mw2@
+ """
+ Then place has no entry for R1:tourism
+ And place contains
+ | object | class | type | name
+ | R1 | amenity | prison | 'name' : 'XZ'
+
+ Scenario: Change name of a relation
+ When loading osm data
+ """
+ n200 x0 y0
+ n201 x0 y0.0001
+ n202 x0.0001 y0.0001
+ n203 x0.0001 y0
+ w2 Tref=45 Nn200,n201,n202,n203,n200
+ r1 Ttype=multipolygon,tourism=hotel,name=AB Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'AB'
+ When updating osm data
+ """
+ r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'XZ'
+
+ Scenario: Change type of a relation into something unknown
+ When loading osm data
+ """
+ n200 x0 y0
+ n201 x0 y0.0001
+ n202 x0.0001 y0.0001
+ n203 x0.0001 y0
+ w2 Tref=45 Nn200,n201,n202,n203,n200
+ r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'XZ'
+ When updating osm data
+ """
+ r1 Ttype=multipolygon,amenities=prison,name=XY Mw2@
+ """
+ Then place has no entry for R1
+
+ Scenario: Type tag is removed
+ When loading osm data
+ """
+ n200 x0 y0
+ n201 x0 y0.0001
+ n202 x0.0001 y0.0001
+ n203 x0.0001 y0
+ w2 Tref=45 Nn200,n201,n202,n203,n200
+ r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'XZ'
+ When updating osm data
+ """
+ r1 Ttourism=hotel,name=XY Mw2@
+ """
+ Then place has no entry for R1
+
+ @wip
+ Scenario: Type tag is renamed to something unknown
+ When loading osm data
+ """
+ n200 x0 y0
+ n201 x0 y0.0001
+ n202 x0.0001 y0.0001
+ n203 x0.0001 y0
+ w2 Tref=45 Nn200,n201,n202,n203,n200
+ r1 Ttype=multipolygon,tourism=hotel,name=XY Mw2@
+ """
+ Then place contains
+ | object | class | type | name
+ | R1 | tourism | hotel | 'name' : 'XZ'
+ When updating osm data
+ """
+ r1 Ttype=multipolygonn,tourism=hotel,name=XY Mw2@
+ """
+ Then place has no entry for R1
+
--- /dev/null
+@DB
+Feature: Update of simple objects by osm2pgsql
+ Testing basic update functions of osm2pgsql.
+
+ Scenario: Import object with two main tags
+ When loading osm data
+ """
+ n1 Ttourism=hotel,amenity=restaurant,name=foo
+ n2 Tplace=locality,name=spotty
+ """
+ Then place contains
+ | object | type | name
+ | N1:tourism | hotel | 'name' : 'foo'
+ | N1:amenity | restaurant | 'name' : 'foo'
+ | N2:place | locality | 'name' : 'spotty'
+ When updating osm data
+ """
+ n1 dV Ttourism=hotel,name=foo
+ n2 dD
+ """
+ Then place has no entry for N1:amenity
+ And place has no entry for N2
+ And place contains
+ | object | class | type | name
+ | N1:tourism | tourism | hotel | 'name' : 'foo'
+
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)
+ line += " x%d y%d" % (random.random() * 360 - 180,
+ random.random() * 180 - 90)
fd.write(line.encode('utf-8'))
fd.write(b'\n')
os.remove(fname)
+@when(u'updating osm data')
+def update_from_osm_file(context):
+ 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""")
+ context.db.commit()
+ context.nominatim.run_setup_script('index', 'index-noanalyse')
+ context.nominatim.run_setup_script('create-functions', 'create-partition-functions',
+ 'enable-diff-updates')
+
+ # 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)
+ fd.write(line.encode('utf-8'))
+ fd.write(b'\n')
+
+ context.nominatim.run_update_script(import_diff=fname)
+ os.remove(fname)