]> git.openstreetmap.org Git - nominatim.git/commitdiff
Use place instead of placex to compute postcodes
authorAntoJvlt <antonin.jolivat@gmail.com>
Fri, 4 Jun 2021 19:26:13 +0000 (21:26 +0200)
committerroot <root@gsoc2021-qa.nominatim.org>
Wed, 9 Jun 2021 07:31:32 +0000 (09:31 +0200)
lib-sql/functions/place_triggers.sql
nominatim/clicmd/refresh.py
nominatim/tools/database_import.py
nominatim/tools/postcodes.py

index 5316374648ff5c5e6ac4ae56b081430319506cac..c19b22747f5fc6882b03a33a4f40fbe89469e56e 100644 (file)
@@ -77,6 +77,12 @@ BEGIN
 
   ELSE -- insert to placex
 
 
   ELSE -- insert to placex
 
+    -- Pure postcodes are never queried from placex so we don't add them.
+    -- location_postcodes is filled from the place table directly.
+    IF NEW.class = 'place' AND NEW.type = 'postcode' THEN
+      RETURN NEW;
+    END IF;
+
     -- Patch in additional country names
     IF NEW.admin_level = 2 AND NEW.type = 'administrative'
           AND NEW.address is not NULL AND NEW.address ? 'country' THEN
     -- Patch in additional country names
     IF NEW.admin_level = 2 AND NEW.type = 'administrative'
           AND NEW.address is not NULL AND NEW.address ? 'country' THEN
index 386516d6ec9297073c5a29f124784a6b7541ecad..c7142c5f2265e46400a52df20fdcc67f964c93b1 100644 (file)
@@ -52,13 +52,17 @@ class UpdateRefresh:
 
 
         if args.postcodes:
 
 
         if args.postcodes:
-            LOG.warning("Update postcodes centroid")
-            tokenizer = self._get_tokenizer(args.config)
-            postcodes.update_postcodes(args.config.get_libpq_dsn(),
-                                       args.project_dir, tokenizer)
-            indexer = Indexer(args.config.get_libpq_dsn(), tokenizer,
-                              args.threads or 1)
-            indexer.index_postcodes()
+            if postcodes.can_compute(args.config.get_libpq_dsn()):
+                LOG.warning("Update postcodes centroid")
+                tokenizer = self._get_tokenizer(args.config)
+                postcodes.update_postcodes(args.config.get_libpq_dsn(),
+                                           args.project_dir, tokenizer)
+                indexer = Indexer(args.config.get_libpq_dsn(), tokenizer,
+                                  args.threads or 1)
+                indexer.index_postcodes()
+            else:
+                LOG.error("The place table doesn\'t exists. " \
+                          "Postcode updates on a frozen database is not possible.")
 
         if args.word_counts:
             LOG.warning('Recompute frequency of full-word search terms')
 
         if args.word_counts:
             LOG.warning('Recompute frequency of full-word search terms')
index 664d3c6b39ed2fafb57e45960c052ccd76401505..28a10ebeb742f907f4b4efc1c3b2abe9925d40fa 100644 (file)
@@ -199,7 +199,7 @@ def load_data(dsn, threads):
         conn.perform("""INSERT INTO placex ({0})
                          SELECT {0} FROM place
                          WHERE osm_id % {1} = {2}
         conn.perform("""INSERT INTO placex ({0})
                          SELECT {0} FROM place
                          WHERE osm_id % {1} = {2}
-                           AND NOT (class='place' and type='houses')
+                           AND NOT (class='place' and (type='houses' or type='postcode'))
                            AND ST_IsValid(geometry)
                      """.format(_COPY_COLUMNS, place_threads, imod))
         sel.register(conn, selectors.EVENT_READ, conn)
                            AND ST_IsValid(geometry)
                      """.format(_COPY_COLUMNS, place_threads, imod))
         sel.register(conn, selectors.EVENT_READ, conn)
index 195d407ee3b8c7e43c591c2d0b74cbc910d5e28c..fd35507901e1c6d123361c51263adac7c44fdab9 100644 (file)
@@ -163,17 +163,19 @@ def update_postcodes(dsn, project_dir, tokenizer):
 
             # Recompute the list of valid postcodes from placex.
             with conn.cursor(name="placex_postcodes") as cur:
 
             # Recompute the list of valid postcodes from placex.
             with conn.cursor(name="placex_postcodes") as cur:
-                cur.execute("""SELECT country_code, pc, ST_X(centroid), ST_Y(centroid)
-                               FROM (
-                                 SELECT country_code,
-                                        token_normalized_postcode(address->'postcode') as pc,
-                                        ST_Centroid(ST_Collect(ST_Centroid(geometry))) as centroid
-                                 FROM placex
-                                 WHERE address ? 'postcode' and geometry IS NOT null
-                                       and country_code is not null
-                                 GROUP BY country_code, pc) xx
-                               WHERE pc is not null
-                               ORDER BY country_code, pc""")
+                cur.execute("""
+                SELECT cc as country_code, pc, ST_X(centroid), ST_Y(centroid)
+                FROM (
+                    SELECT 
+                        COALESCE(plx.country_code, get_country_code(ST_Centroid(pl.geometry))) as cc,
+                        token_normalized_postcode(pl.address->'postcode') as pc,
+                        ST_Centroid(ST_Collect(ST_Centroid(pl.geometry))) as centroid
+                    FROM place AS pl LEFT OUTER JOIN placex AS plx ON pl.osm_id = plx.osm_id AND pl.osm_type = plx.osm_type
+                    WHERE pl.address ? 'postcode' AND pl.geometry IS NOT null
+                    GROUP BY cc, pc
+                ) xx
+                WHERE pc IS NOT null AND cc IS NOT null
+                ORDER BY country_code, pc""")
 
                 collector = None
 
 
                 collector = None
 
@@ -195,3 +197,15 @@ def update_postcodes(dsn, project_dir, tokenizer):
             conn.commit()
 
         analyzer.update_postcodes_from_db()
             conn.commit()
 
         analyzer.update_postcodes_from_db()
+
+def can_compute(dsn):
+    """
+        Check that the place table exists so that
+        postcodes can be computed.
+    """
+    with connect(dsn) as conn:
+        with conn.cursor() as cur:
+            cur.execute("""
+                select exists(select 1 from information_schema.tables where table_name='place')
+            """)
+            return cur.fetchone()[0]