X-Git-Url: https://git.openstreetmap.org/nominatim.git/blobdiff_plain/c26f323bf5e7679c8f4411862de32fae20709cf8..8f0885f6cb24f545a2f5021d53d8aec64a72bf9b:/nominatim/cli.py diff --git a/nominatim/cli.py b/nominatim/cli.py index 75790b13..edfddcbc 100644 --- a/nominatim/cli.py +++ b/nominatim/cli.py @@ -10,8 +10,9 @@ from pathlib import Path from .config import Configuration from .tools.exec_utils import run_legacy_script, run_api_script +from .db.connection import connect -from .indexer.indexer import Indexer +LOG = logging.getLogger() def _num_system_cpus(): try: @@ -233,20 +234,39 @@ class UpdateReplication: @staticmethod def run(args): + try: + import osmium # pylint: disable=W0611 + except ModuleNotFoundError: + LOG.fatal("pyosmium not installed. Replication functions not available.\n" + "To install pyosmium via pip: pip3 install osmium") + return 1 + + from .tools import replication, refresh + + conn = connect(args.config.get_libpq_dsn()) + params = ['update.php'] if args.init: - params.append('--init-updates') - if not args.update_functions: - params.append('--no-update-functions') - elif args.check_for_updates: - params.append('--check-for-updates') + LOG.warning("Initialising replication updates") + replication.init_replication(conn, args.config.REPLICATION_URL) + if args.update_functions: + LOG.warning("Create functions") + refresh.create_functions(conn, args.config, args.data_dir, + True, False) + conn.close() + return 0 + + if args.check_for_updates: + ret = replication.check_for_updates(conn, args.config.REPLICATION_URL) + conn.close() + return ret + + if args.once: + params.append('--import-osmosis') else: - if args.once: - params.append('--import-osmosis') - else: - params.append('--import-osmosis-all') - if not args.do_index: - params.append('--no-index') + params.append('--import-osmosis-all') + if not args.do_index: + params.append('--no-index') return run_legacy_script(*params, nominatim_env=args) @@ -320,6 +340,8 @@ class UpdateIndex: @staticmethod def run(args): + from .indexer.indexer import Indexer + indexer = Indexer(args.config.get_libpq_dsn(), args.threads or _num_system_cpus() or 1) @@ -366,22 +388,28 @@ class UpdateRefresh: @staticmethod def run(args): + from .tools import refresh + + conn = connect(args.config.get_libpq_dsn()) + if args.postcodes: - run_legacy_script('update.php', '--calculate-postcodes', - nominatim_env=args, throw_on_fail=True) + LOG.warning("Update postcodes centroid") + refresh.update_postcodes(conn, args.data_dir) + if args.word_counts: - run_legacy_script('update.php', '--recompute-word-counts', - nominatim_env=args, throw_on_fail=True) + LOG.warning('Recompute frequency of full-word search terms') + refresh.recompute_word_counts(conn, args.data_dir) + if args.address_levels: - run_legacy_script('update.php', '--update-address-levels', - nominatim_env=args, throw_on_fail=True) + cfg = Path(args.config.ADDRESS_LEVEL_CONFIG) + LOG.warning('Updating address levels from %s', cfg) + refresh.load_address_levels_from_file(conn, cfg) + if args.functions: - params = ['setup.php', '--create-functions', '--create-partition-functions'] - if args.diffs: - params.append('--enable-diff-updates') - if args.enable_debug_statements: - params.append('--enable-debug-statements') - run_legacy_script(*params, nominatim_env=args, throw_on_fail=True) + LOG.warning('Create functions') + refresh.create_functions(conn, args.config, args.data_dir, + args.diffs, args.enable_debug_statements) + if args.wiki_data: run_legacy_script('setup.php', '--import-wikipedia-articles', nominatim_env=args, throw_on_fail=True) @@ -393,6 +421,10 @@ class UpdateRefresh: run_legacy_script('setup.php', '--setup-website', nominatim_env=args, throw_on_fail=True) + conn.close() + + return 0 + class AdminCheckDatabase: """\ @@ -513,6 +545,24 @@ DETAILS_SWITCHES = ( ('polygon_geojson', 'Include geometry of result.') ) +def _add_api_output_arguments(parser): + group = parser.add_argument_group('Output arguments') + group.add_argument('--format', default='jsonv2', + choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], + help='Format of result') + for name, desc in EXTRADATA_PARAMS: + group.add_argument('--' + name, action='store_true', help=desc) + + group.add_argument('--lang', '--accept-language', metavar='LANGS', + help='Preferred language order for presenting search results') + group.add_argument('--polygon-output', + choices=['geojson', 'kml', 'svg', 'text'], + help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') + group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', + help="""Simplify output geometry. + Parameter is difference tolerance in degrees.""") + + class APISearch: """\ Execute API search query. @@ -526,21 +576,7 @@ class APISearch: for name, desc in STRUCTURED_QUERY: group.add_argument('--' + name, help='Structured query: ' + desc) - group = parser.add_argument_group('Output arguments') - group.add_argument('--format', default='jsonv2', - choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], - help='Format of result') - for name, desc in EXTRADATA_PARAMS: - group.add_argument('--' + name, action='store_true', help=desc) - - group.add_argument('--lang', '--accept-language', metavar='LANGS', - help='Preferred language order for presenting search results') - group.add_argument('--polygon-output', - choices=['geojson', 'kml', 'svg', 'text'], - help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') - group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', - help="""Simplify output geometry. - Parameter is difference tolerance in degrees.""") + _add_api_output_arguments(parser) group = parser.add_argument_group('Result limitation') group.add_argument('--countrycodes', metavar='CC,..', @@ -601,21 +637,7 @@ class APIReverse: group.add_argument('--zoom', type=int, help='Level of detail required for the address') - group = parser.add_argument_group('Output arguments') - group.add_argument('--format', default='jsonv2', - choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], - help='Format of result') - for name, desc in EXTRADATA_PARAMS: - group.add_argument('--' + name, action='store_true', help=desc) - - group.add_argument('--lang', '--accept-language', metavar='LANGS', - help='Preferred language order for presenting search results') - group.add_argument('--polygon-output', - choices=['geojson', 'kml', 'svg', 'text'], - help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') - group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', - help="""Simplify output geometry. - Parameter is difference tolerance in degrees.""") + _add_api_output_arguments(parser) @staticmethod @@ -652,21 +674,7 @@ class APILookup: action='append', required=True, dest='ids', help='OSM id to lookup in format (may be repeated)') - group = parser.add_argument_group('Output arguments') - group.add_argument('--format', default='jsonv2', - choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], - help='Format of result') - for name, desc in EXTRADATA_PARAMS: - group.add_argument('--' + name, action='store_true', help=desc) - - group.add_argument('--lang', '--accept-language', metavar='LANGS', - help='Preferred language order for presenting search results') - group.add_argument('--polygon-output', - choices=['geojson', 'kml', 'svg', 'text'], - help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') - group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', - help="""Simplify output geometry. - Parameter is difference tolerance in degrees.""") + _add_api_output_arguments(parser) @staticmethod