X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/2712c5f90ee9e15d69424e367c7e53ab2a579f7b..734dff037405469ada9a226be9c98be583823226:/test/bdd/steps/steps_osm_data.py diff --git a/test/bdd/steps/steps_osm_data.py b/test/bdd/steps/steps_osm_data.py index 465ad718..4cee75f7 100644 --- a/test/bdd/steps/steps_osm_data.py +++ b/test/bdd/steps/steps_osm_data.py @@ -1,6 +1,33 @@ +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of Nominatim. (https://nominatim.org) +# +# Copyright (C) 2024 by the Nominatim developer community. +# For a full list of authors see the git log. import tempfile import random import os +from pathlib import Path + +from nominatim_db.tools.exec_utils import run_osm2pgsql +from nominatim_db.tools.replication import run_osm2pgsql_updates + +from geometry_alias import ALIASES + +def get_osm2pgsql_options(nominatim_env, fname, append): + return dict(import_file=fname, + osm2pgsql='osm2pgsql', + osm2pgsql_cache=50, + osm2pgsql_style=str(nominatim_env.get_test_config().get_import_style_file()), + osm2pgsql_style_path=nominatim_env.get_test_config().config_dir, + threads=1, + dsn=nominatim_env.get_libpq_dsn(), + flatnode_file='', + tablespaces=dict(slim_data='', slim_index='', + main_data='', main_index=''), + append=append + ) + def write_opl_file(opl, grid): """ Create a temporary OSM file from OPL and return the file name. It is @@ -22,8 +49,17 @@ def write_opl_file(opl, grid): return fd.name -@given(u'the ([0-9.]+ )?grid') -def define_node_grid(context, grid_step): +@given('the lua style file') +def lua_style_file(context): + """ Define a custom style file to use for the import. + """ + style = Path(context.nominatim.website_dir.name) / 'custom.lua' + style.write_text(context.text) + context.nominatim.test_env['NOMINATIM_IMPORT_STYLE'] = str(style) + + +@given(u'the ([0-9.]+ )?grid(?: with origin (?P.*))?') +def define_node_grid(context, grid_step, origin): """ Define a grid of node positions. Use a table to define the grid. The nodes must be integer ids. Optionally @@ -34,8 +70,22 @@ def define_node_grid(context, grid_step): else: grid_step = 0.00001 + if origin: + if ',' in origin: + # TODO coordinate + coords = origin.split(',') + if len(coords) != 2: + raise RuntimeError('Grid origin expects origin with x,y coordinates.') + origin = (float(coords[0]), float(coords[1])) + elif origin in ALIASES: + origin = ALIASES[origin] + else: + raise RuntimeError('Grid origin must be either coordinate or alias.') + else: + origin = (0.0, 0.0) + context.osm.set_grid([context.table.headings] + [list(h) for h in context.table], - grid_step) + grid_step, origin) @when(u'loading osm data') @@ -48,9 +98,10 @@ def load_osm_file(context): """ # create an OSM file and import it fname = write_opl_file(context.text, context.osm) - context.nominatim.run_setup_script('import-data', osm_file=fname, - osm2pgsql_cache=300) - os.remove(fname) + try: + run_osm2pgsql(get_osm2pgsql_options(context.nominatim, fname, append=False)) + finally: + os.remove(fname) ### reintroduce the triggers/indexes we've lost by having osm2pgsql set up place again cur = context.db.cursor() @@ -70,22 +121,22 @@ def update_from_osm_file(context): 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, address, extratags, geometry) - select osm_type, osm_id, class, type, name, admin_level, address, extratags, geometry from place""") - cur.execute( - """insert into location_property_osmline (osm_id, address, linegeo) - SELECT osm_id, address, geometry from place - WHERE class='place' and type='houses' and osm_type='W' - and ST_GeometryType(geometry) = 'ST_LineString'""") - context.db.commit() - context.nominatim.run_setup_script('index', 'index-noanalyse') - context.nominatim.run_setup_script('create-functions', 'create-partition-functions', - 'enable-diff-updates') + context.nominatim.copy_from_place(context.db) + context.nominatim.run_nominatim('index') + context.nominatim.run_nominatim('refresh', '--functions') # create an OSM file and import it fname = write_opl_file(context.text, context.osm) - context.nominatim.run_update_script(import_diff=fname) - os.remove(fname) + try: + run_osm2pgsql_updates(context.db, + get_osm2pgsql_options(context.nominatim, fname, append=True)) + finally: + os.remove(fname) + +@when('indexing') +def index_database(context): + """ + Run the Nominatim indexing step. This will process data previously + loaded with 'updating osm data' + """ + context.nominatim.run_nominatim('index')