]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Thu, 21 Feb 2019 22:39:48 +0000 (23:39 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Thu, 21 Feb 2019 22:39:48 +0000 (23:39 +0100)
13 files changed:
.travis.yml
README.md
docs/admin/Import-and-Update.md
lib/lib.php
sql/functions.sql
sql/indices.src.sql
test/README.md
test/bdd/environment.py
test/php/Nominatim/LibTest.php
test/php/phpunit.xml
utils/update.php
vagrant/install-on-travis-ci.sh
website/details.php

index b9adc069568f8d37d1c99c9882041ba57346f4d1..fe4e0cbd09b00738d57173ce1a45c271a89dc0e8 100644 (file)
@@ -1,6 +1,6 @@
 ---
 sudo: required
-dist: trusty
+dist: xenial
 language: python
 python:
   - "3.6"
index dd900e3e91f434df9792174473eb9d2306f91538..7e8c776ef94fb3080b4973e909bd8acaa6a932a1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -51,7 +51,7 @@ The source code is available under a GPLv2 license.
 Contributing
 ============
 
-Contributions are welcome. For details see [CONTRIBUTING.md](contribution guide).
+Contributions are welcome. For details see [contribution guide](CONTRIBUTING.md).
 
 Both bug reports and pull requests are welcome.
 
index 1e55e8568495a02dd06f1a16cd28f6929923589f..3d0905975b571093391bac217cd1bc58aede2dcc 100644 (file)
@@ -133,7 +133,7 @@ style     | Import time  |  DB size   |  after drop
 admin     |    5h        |  190 GB    |   20 GB
 street    |   42h        |  400 GB    |  180 GB
 address   |   59h        |  500 GB    |  260 GB
-full      |   80h        |  590 GB    |  320 GB
+full      |   80h        |  575 GB    |  300 GB
 
 You can also customize the styles further. For an description of the
 style format see [the developement section](../develop/Import.md).
@@ -143,7 +143,8 @@ style format see [the developement section](../develop/Import.md).
 **Important:** first try the import with a small extract, for example from
 [Geofabrik](https://download.geofabrik.de).
 
-Download the data to import and load the data with the following command:
+Download the data to import and load the data with the following command
+from the build directory:
 
 ```sh
 ./utils/setup.php --osm-file <data file> --all [--osm2pgsql-cache 28000] 2>&1 | tee setup.log
index 3a6166a60e022d3921ce54db8d48d051b8cbade4..458930fdb7bd85581b1609c79442d5eeb1d7b664 100644 (file)
@@ -228,3 +228,25 @@ function closestHouseNumber($aRow)
 
     return max(min($aRow['endnumber'], $iHn), $aRow['startnumber']);
 }
+
+function getSearchRankLabel($iRank)
+{
+    if (!isset($iRank)) return 'unknown';
+    if ($iRank < 2) return 'continent';
+    if ($iRank < 4) return 'sea';
+    if ($iRank < 8) return 'country';
+    if ($iRank < 12) return 'state';
+    if ($iRank < 16) return 'county';
+    if ($iRank == 16) return 'city';
+    if ($iRank == 17) return 'town / island';
+    if ($iRank == 18) return 'village / hamlet';
+    if ($iRank == 20) return 'suburb';
+    if ($iRank == 21) return 'postcode area';
+    if ($iRank == 22) return 'croft / farm / locality / islet';
+    if ($iRank == 23) return 'postcode area';
+    if ($iRank == 25) return 'postcode point';
+    if ($iRank == 26) return 'street / major landmark';
+    if ($iRank == 27) return 'minory street / path';
+    if ($iRank == 28) return 'house / building';
+    return 'other: ' . $iRank;
+}
index 94a0323157f5f83f9fcc657339c988d9e13db8b6..54e2a8d36d25ab3015cd2cbe4c296359f958676a 100644 (file)
@@ -1311,10 +1311,6 @@ BEGIN
       --DEBUG: RAISE WARNING 'Waterway processed';
   END IF;
 
-  -- Adding ourselves to the list simplifies address calculations later
-  INSERT INTO place_addressline (place_id, address_place_id, fromarea, isaddress, distance, cached_rank_address)
-    VALUES (NEW.place_id, NEW.place_id, true, true, 0, NEW.rank_address); 
-
   -- What level are we searching from
   search_maxrank := NEW.rank_search;
 
@@ -2305,6 +2301,9 @@ create type addressline as (
   distance FLOAT
 );
 
+-- Compute the list of address parts for the given place.
+--
+-- If in_housenumber is greator or equal 0, look for an interpolation.
 CREATE OR REPLACE FUNCTION get_addressdata(in_place_id BIGINT, in_housenumber INTEGER) RETURNS setof addressline 
   AS $$
 DECLARE
@@ -2322,50 +2321,66 @@ DECLARE
   searchclass TEXT;
   searchtype TEXT;
   countryname HSTORE;
-  hadcountry BOOLEAN;
 BEGIN
+  -- The place ein question might not have a direct entry in place_addressline.
+  -- Look for the parent of such places then and save if in for_place_id.
+
   -- first query osmline (interpolation lines)
-  select parent_place_id, country_code, 30, postcode, null, 'place', 'house' from location_property_osmline 
-    WHERE place_id = in_place_id AND in_housenumber>=startnumber AND in_housenumber <= endnumber
-    INTO for_place_id,searchcountrycode, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
-  IF for_place_id IS NOT NULL THEN
-    searchhousenumber = in_housenumber::text;
+  IF in_housenumber >= 0 THEN
+    SELECT parent_place_id, country_code, in_housenumber::text, 30, postcode,
+           null, 'place', 'house'
+      FROM location_property_osmline
+      WHERE place_id = in_place_id AND in_housenumber>=startnumber
+            AND in_housenumber <= endnumber
+      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
 
   --then query tiger data
   -- %NOTIGERDATA% IF 0 THEN
-  IF for_place_id IS NULL THEN
-    select parent_place_id,'us', 30, postcode, null, 'place', 'house' from location_property_tiger 
-      WHERE place_id = in_place_id AND in_housenumber>=startnumber AND in_housenumber <= endnumber
-      INTO for_place_id,searchcountrycode, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
-    IF for_place_id IS NOT NULL THEN
-      searchhousenumber = in_housenumber::text;
-    END IF;
+  IF for_place_id IS NULL AND in_housenumber >= 0 THEN
+    SELECT parent_place_id, 'us', in_housenumber::text, 30, postcode, null,
+           'place', 'house'
+      FROM location_property_tiger
+      WHERE place_id = in_place_id AND in_housenumber >= startnumber
+            AND in_housenumber <= endnumber
+      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
   -- %NOTIGERDATA% END IF;
 
   -- %NOAUXDATA% IF 0 THEN
   IF for_place_id IS NULL THEN
-    select parent_place_id,'us', housenumber, 30, postcode, null, 'place', 'house' from location_property_aux
+    SELECT parent_place_id, 'us', housenumber, 30, postcode, null, 'place', 'house'
+      FROM location_property_aux
       WHERE place_id = in_place_id
-      INTO for_place_id,searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
+      INTO for_place_id,searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
   -- %NOAUXDATA% END IF;
 
   -- postcode table
   IF for_place_id IS NULL THEN
-    select parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
+    SELECT parent_place_id, country_code, rank_address, postcode, 'place', 'postcode'
       FROM location_postcode
       WHERE place_id = in_place_id
-      INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode, searchclass, searchtype;
+      INTO for_place_id, searchcountrycode, searchrankaddress, searchpostcode,
+           searchclass, searchtype;
   END IF;
 
+  -- POI objects in the placex table
   IF for_place_id IS NULL THEN
-    select parent_place_id, country_code, housenumber, rank_search, postcode, name, class, type from placex 
-      WHERE place_id = in_place_id and  rank_search > 27
-      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode, searchhousename, searchclass, searchtype;
+    SELECT parent_place_id, country_code, housenumber, rank_search, postcode,
+           name, class, type
+      FROM placex
+      WHERE place_id = in_place_id and rank_search > 27
+      INTO for_place_id, searchcountrycode, searchhousenumber, searchrankaddress,
+           searchpostcode, searchhousename, searchclass, searchtype;
   END IF;
 
+  -- If for_place_id is still NULL at this point then the object has its own
+  -- entry in place_address line. However, still check if there is not linked
+  -- place we should be using instead.
   IF for_place_id IS NULL THEN
     select coalesce(linked_place_id, place_id),  country_code,
            housenumber, rank_search, postcode, null
@@ -2375,52 +2390,51 @@ BEGIN
 
 --RAISE WARNING '% % % %',searchcountrycode, searchhousenumber, searchrankaddress, searchpostcode;
 
-  found := 1000;
-  hadcountry := false;
-  FOR location IN 
-    select placex.place_id, osm_type, osm_id, name,
-      class, type, admin_level, true as isaddress,
-      CASE WHEN rank_address = 0 THEN 100 WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
-      0 as distance, country_code, postcode
-      from placex
-      where place_id = for_place_id 
+  found := 1000; -- the lowest rank_address included
+
+  -- Return the record for the base entry.
+  FOR location IN
+    SELECT placex.place_id, osm_type, osm_id, name,
+           class, type, admin_level,
+           type not in ('postcode', 'postal_code') as isaddress,
+           CASE WHEN rank_address = 0 THEN 100
+                WHEN rank_address = 11 THEN 5
+                ELSE rank_address END as rank_address,
+           0 as distance, country_code, postcode
+      FROM placex
+      WHERE place_id = for_place_id
   LOOP
 --RAISE WARNING '%',location;
     IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
       searchcountrycode := location.country_code;
     END IF;
-    IF location.type in ('postcode', 'postal_code') THEN
-      location.isaddress := FALSE;
-    ELSEIF location.rank_address = 4 THEN
-      hadcountry := true;
-    END IF;
-    IF location.rank_address < 4 AND NOT hadcountry THEN
-      select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
-      IF countryname IS NOT NULL THEN
-        countrylocation := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
-        RETURN NEXT countrylocation;
-      END IF;
+    IF location.rank_address < 4 THEN
+      -- no country locations for ranks higher than country
+      searchcountrycode := NULL;
     END IF;
-    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, 
-                           location.type, location.admin_level, true, location.isaddress, location.rank_address,
-                           location.distance)::addressline;
+    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
+                           location.name, location.class, location.type,
+                           location.admin_level, true, location.isaddress,
+                           location.rank_address, location.distance)::addressline;
     RETURN NEXT countrylocation;
     found := location.rank_address;
   END LOOP;
 
-  FOR location IN 
-    select placex.place_id, osm_type, osm_id, name,
-      CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
-      CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
-      admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress,
-      CASE WHEN address_place_id = for_place_id AND rank_address = 0 THEN 100 WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
-      distance,country_code,postcode
-      from place_addressline join placex on (address_place_id = placex.place_id) 
-      where place_addressline.place_id = for_place_id 
-      and (cached_rank_address > 0 AND cached_rank_address < searchrankaddress)
-      and address_place_id != for_place_id and linked_place_id is null
-      and (placex.country_code IS NULL OR searchcountrycode IS NULL OR placex.country_code = searchcountrycode)
-      order by rank_address desc,isaddress desc,fromarea desc,distance asc,rank_search desc
+  FOR location IN
+    SELECT placex.place_id, osm_type, osm_id, name,
+           CASE WHEN extratags ? 'place' THEN 'place' ELSE class END as class,
+           CASE WHEN extratags ? 'place' THEN extratags->'place' ELSE type END as type,
+           admin_level, fromarea, isaddress and linked_place_id is NULL as isaddress,
+           CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
+           distance, country_code, postcode
+      FROM place_addressline join placex on (address_place_id = placex.place_id)
+      WHERE place_addressline.place_id = for_place_id
+            AND (cached_rank_address >= 4 AND cached_rank_address < searchrankaddress)
+            AND linked_place_id is null
+            AND (placex.country_code IS NULL OR searchcountrycode IS NULL
+                 OR placex.country_code = searchcountrycode)
+      ORDER BY rank_address desc, isaddress desc, fromarea desc,
+               distance asc, rank_search desc
   LOOP
 --RAISE WARNING '%',location;
     IF searchcountrycode IS NULL AND location.country_code IS NOT NULL THEN
@@ -2429,49 +2443,49 @@ BEGIN
     IF location.type in ('postcode', 'postal_code') THEN
       location.isaddress := FALSE;
     END IF;
-    IF location.rank_address = 4 AND location.isaddress THEN
-      hadcountry := true;
-    END IF;
-    IF location.rank_address < 4 AND NOT hadcountry THEN
-      select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
-      IF countryname IS NOT NULL THEN
-        countrylocation := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
-        RETURN NEXT countrylocation;
-      END IF;
-    END IF;
-    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id, location.name, location.class, 
-                           location.type, location.admin_level, location.fromarea, location.isaddress, location.rank_address, 
+    countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
+                           location.name, location.class, location.type,
+                           location.admin_level, location.fromarea,
+                           location.isaddress, location.rank_address,
                            location.distance)::addressline;
     RETURN NEXT countrylocation;
     found := location.rank_address;
   END LOOP;
 
+  -- If no country was included yet, add the name information from country_name.
   IF found > 4 THEN
-    select name from country_name where country_code = searchcountrycode limit 1 INTO countryname;
+    SELECT name FROM country_name
+      WHERE country_code = searchcountrycode LIMIT 1 INTO countryname;
 --RAISE WARNING '% % %',found,searchcountrycode,countryname;
     IF countryname IS NOT NULL THEN
-      location := ROW(null, null, null, countryname, 'place', 'country', null, true, true, 4, 0)::addressline;
+      location := ROW(null, null, null, countryname, 'place', 'country',
+                      null, true, true, 4, 0)::addressline;
       RETURN NEXT location;
     END IF;
   END IF;
 
+  -- Finally add some artificial rows.
   IF searchcountrycode IS NOT NULL THEN
-    location := ROW(null, null, null, hstore('ref', searchcountrycode), 'place', 'country_code', null, true, false, 4, 0)::addressline;
+    location := ROW(null, null, null, hstore('ref', searchcountrycode),
+                    'place', 'country_code', null, true, false, 4, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchhousename IS NOT NULL THEN
-    location := ROW(in_place_id, null, null, searchhousename, searchclass, searchtype, null, true, true, 29, 0)::addressline;
+    location := ROW(in_place_id, null, null, searchhousename, searchclass,
+                    searchtype, null, true, true, 29, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchhousenumber IS NOT NULL THEN
-    location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber), 'place', 'house_number', null, true, true, 28, 0)::addressline;
+    location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber),
+                    'place', 'house_number', null, true, true, 28, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchpostcode IS NOT NULL THEN
-    location := ROW(null, null, null, hstore('ref', searchpostcode), 'place', 'postcode', null, true, true, 5, 0)::addressline;
+    location := ROW(null, null, null, hstore('ref', searchpostcode), 'place',
+                    'postcode', null, true, true, 5, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
@@ -2481,96 +2495,6 @@ $$
 LANGUAGE plpgsql;
 
 
-CREATE OR REPLACE FUNCTION get_searchrank_label(rank INTEGER) RETURNS TEXT
-  AS $$
-DECLARE
-BEGIN
-  IF rank < 2 THEN
-    RETURN 'Continent';
-  ELSEIF rank < 4 THEN
-    RETURN 'Sea';
-  ELSEIF rank < 8 THEN
-    RETURN 'Country';
-  ELSEIF rank < 12 THEN
-    RETURN 'State';
-  ELSEIF rank < 16 THEN
-    RETURN 'County';
-  ELSEIF rank = 16 THEN
-    RETURN 'City';
-  ELSEIF rank = 17 THEN
-    RETURN 'Town / Island';
-  ELSEIF rank = 18 THEN
-    RETURN 'Village / Hamlet';
-  ELSEIF rank = 20 THEN
-    RETURN 'Suburb';
-  ELSEIF rank = 21 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 22 THEN
-    RETURN 'Croft / Farm / Locality / Islet';
-  ELSEIF rank = 23 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 25 THEN
-    RETURN 'Postcode Point';
-  ELSEIF rank = 26 THEN
-    RETURN 'Street / Major Landmark';
-  ELSEIF rank = 27 THEN
-    RETURN 'Minory Street / Path';
-  ELSEIF rank = 28 THEN
-    RETURN 'House / Building';
-  ELSE
-    RETURN 'Other: '||rank;
-  END IF;
-  
-END;
-$$
-LANGUAGE plpgsql;
-
-CREATE OR REPLACE FUNCTION get_addressrank_label(rank INTEGER) RETURNS TEXT
-  AS $$
-DECLARE
-BEGIN
-  IF rank = 0 THEN
-    RETURN 'None';
-  ELSEIF rank < 2 THEN
-    RETURN 'Continent';
-  ELSEIF rank < 4 THEN
-    RETURN 'Sea';
-  ELSEIF rank = 5 THEN
-    RETURN 'Postcode';
-  ELSEIF rank < 8 THEN
-    RETURN 'Country';
-  ELSEIF rank < 12 THEN
-    RETURN 'State';
-  ELSEIF rank < 16 THEN
-    RETURN 'County';
-  ELSEIF rank = 16 THEN
-    RETURN 'City';
-  ELSEIF rank = 17 THEN
-    RETURN 'Town / Village / Hamlet';
-  ELSEIF rank = 20 THEN
-    RETURN 'Suburb';
-  ELSEIF rank = 21 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 22 THEN
-    RETURN 'Croft / Farm / Locality / Islet';
-  ELSEIF rank = 23 THEN
-    RETURN 'Postcode Area';
-  ELSEIF rank = 25 THEN
-    RETURN 'Postcode Point';
-  ELSEIF rank = 26 THEN
-    RETURN 'Street / Major Landmark';
-  ELSEIF rank = 27 THEN
-    RETURN 'Minory Street / Path';
-  ELSEIF rank = 28 THEN
-    RETURN 'House / Building';
-  ELSE
-    RETURN 'Other: '||rank;
-  END IF;
-  
-END;
-$$
-LANGUAGE plpgsql;
-
 CREATE OR REPLACE FUNCTION aux_create_property(pointgeo GEOMETRY, in_housenumber TEXT, 
   in_street TEXT, in_isin TEXT, in_postcode TEXT, in_countrycode char(2)) RETURNS INTEGER
   AS $$
index dd16affb97531305492bc9ca46bfed9dd58deb8e..b661cf4a6d3fe4aa66de5810afb18ff43d7c2317 100644 (file)
@@ -32,6 +32,7 @@ GRANT SELECT ON table country_osm_grid to "{www-user}";
 CREATE INDEX idx_location_area_country_place_id ON location_area_country USING BTREE (place_id) {ts:address-index};
 
 CREATE INDEX idx_osmline_parent_place_id ON location_property_osmline USING BTREE (parent_place_id) {ts:search-index};
+CREATE INDEX idx_osmline_parent_osm_id ON location_property_osmline USING BTREE (osm_id) {ts:search-index};
 
 DROP INDEX IF EXISTS place_id_idx;
 CREATE UNIQUE INDEX idx_place_osm_unique on place using btree(osm_id,osm_type,class,type) {ts:address-index};
index d90b6f131418695fcc550dea2b3559d2587035bc..cdf350f81d4a5379e41129c0bb1db0e6b7de0c2f 100644 (file)
@@ -66,7 +66,7 @@ To run the functional tests, do
     cd test/bdd
     behave
 
-The tests can be configured with a set of environment variables:
+The tests can be configured with a set of environment variables (`behave -D key=val`):
 
  * `BUILDDIR` - build directory of Nominatim installation to test
  * `TEMPLATE_DB` - name of template database used as a skeleton for
@@ -74,6 +74,7 @@ The tests can be configured with a set of environment variables:
  * `TEST_DB` - name of test database (db tests)
  * `API_TEST_DB` - name of the database containing the API test data (api tests)
  * `DB_HOST` - (optional) hostname of database host
+ * `DB_PORT` - (optional) port of database on host
  * `DB_USER` - (optional) username of database login
  * `DB_PASS` - (optional) password for database login
  * `SERVER_MODULE_PATH` - (optional) path on the Postgres server to Nominatim
index fdc65a5e76db2363ccf6082f012a7b4ff43a2cbb..25b118b41bd5372f5d1c0b3a9f1bde5bd9b0074e 100644 (file)
@@ -15,6 +15,7 @@ userconfig = {
     'REMOVE_TEMPLATE' : False,
     'KEEP_TEST_DB' : False,
     'DB_HOST' : None,
+    'DB_PORT' : None,
     'DB_USER' : None,
     'DB_PASS' : None,
     'TEMPLATE_DB' : 'test_template_nominatim',
@@ -35,6 +36,7 @@ class NominatimEnvironment(object):
         self.build_dir = os.path.abspath(config['BUILDDIR'])
         self.src_dir = os.path.abspath(os.path.join(os.path.split(__file__)[0], "../.."))
         self.db_host = config['DB_HOST']
+        self.db_port = config['DB_PORT']
         self.db_user = config['DB_USER']
         self.db_pass = config['DB_PASS']
         self.template_db = config['TEMPLATE_DB']
@@ -54,6 +56,8 @@ class NominatimEnvironment(object):
         dbargs = {'database': dbname}
         if self.db_host:
             dbargs['host'] = self.db_host
+        if self.db_port:
+            dbargs['port'] = self.db_port
         if self.db_user:
             dbargs['user'] = self.db_user
         if self.db_pass:
@@ -69,10 +73,11 @@ class NominatimEnvironment(object):
 
     def write_nominatim_config(self, dbname):
         f = open(self.local_settings_file, 'w')
-        f.write("<?php\n  @define('CONST_Database_DSN', 'pgsql://%s:%s@%s/%s');\n" %
+        f.write("<?php\n  @define('CONST_Database_DSN', 'pgsql://%s:%s@%s%s/%s');\n" %
                 (self.db_user if self.db_user else '',
                  self.db_pass if self.db_pass else '',
                  self.db_host if self.db_host else '',
+                 (':' + self.db_port) if self.db_port else '',
                  dbname))
         f.write("@define('CONST_Osm2pgsql_Flatnode_File', null);\n")
         f.close()
index dbf8feca712a4ecf7d5d401baaa8f157760ef306..a80ef73b6fd53f65eca9cfc0d062432f3fa7a9cd 100644 (file)
@@ -173,4 +173,12 @@ class LibTest extends \PHPUnit\Framework\TestCase
         // start == end
         $this->closestHouseNumberEvenOddOther(50, 50, 0.5, array('even' => 50, 'odd' => 50, 'other' => 50));
     }
+
+    public function testGetSearchRankLabel()
+    {
+        $this->assertEquals('unknown', getSearchRankLabel(null));
+        $this->assertEquals('continent', getSearchRankLabel(0));
+        $this->assertEquals('continent', getSearchRankLabel(1));
+        $this->assertEquals('other: 30', getSearchRankLabel(30));
+    }
 }
index 1fc95795c1d0b86b3704488e10956f493f0b1d26..bc07177ce8dfa2c84abf093390b4539964551b1d 100644 (file)
@@ -7,7 +7,6 @@
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false"
-    syntaxCheck="true"
     bootstrap="./bootstrap.php"
     beStrictAboutTestsThatDoNotTestAnything="true"
     >
index 7cf96d90330d3e125825c4659802f81b99ff85f2..8e1188349f025a4ec6558f1ccec25b6df9039570 100644 (file)
@@ -306,6 +306,8 @@ if ($aResult['index']) {
     }
 
     runWithEnv($sCmd, $aProcEnv);
+
+    $oDB->query('update import_status set indexed = true');
 }
 
 if ($aResult['update-address-levels']) {
@@ -444,6 +446,11 @@ if ($aResult['import-osmosis'] || $aResult['import-osmosis-all']) {
 
             $sSQL = 'update import_status set indexed = true';
             $oDB->query($sSQL);
+        } else {
+            if ($aResult['import-osmosis-all']) {
+                echo "Error: --no-index cannot be used with continuous imports (--import-osmosis-all).\n";
+                exit(1);
+            }
         }
 
         $fDuration = time() - $fStartTime;
index ef9f03c4bd2b648b0c587f92fa1ea186f674daf7..883a94728b67ad5d192ba5083ee3199f6f34aeeb 100755 (executable)
@@ -1,8 +1,8 @@
 #!/bin/bash
 
 # This script runs in a travis-ci.org virtual machine
-# https://docs.travis-ci.com/user/trusty-ci-environment/
-# Ubuntu 14 (trusty)
+# https://docs.travis-ci.com/user/reference/xenial/
+# Ubuntu 16 (xenial)
 # user 'travis'
 # $TRAVIS_BUILD_DIR is /home/travis/build/openstreetmap/Nominatim/, for others see
 #   https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables
 sudo apt-get update -qq
 sudo apt-get install -y -qq libboost-dev libboost-system-dev \
                             libboost-filesystem-dev libexpat1-dev zlib1g-dev libxml2-dev\
-                            libbz2-dev libpq-dev libgeos-c1 libgeos++-dev libproj-dev \
-                            postgresql-server-dev-9.6 postgresql-9.6-postgis-2.3 postgresql-contrib-9.6 \
-                            apache2 php5 php5-pgsql php5-intl php-pear
+                            libbz2-dev libpq-dev libproj-dev \
+                            postgresql-server-dev-9.6 postgresql-9.6-postgis-2.4 postgresql-contrib-9.6 \
+                            apache2 php php-pgsql php-intl php-pear
 
-sudo apt-get install -y -qq python3-dev python3-pip python3-psycopg2 php5-cgi
+sudo apt-get install -y -qq python3-dev python3-pip python3-psycopg2 php-cgi
 
 pip3 install --quiet behave nose pytidylib psycopg2-binary
 
 # Travis uses phpenv to support multiple PHP versions. We need to make sure
-# these packages get installed to the phpenv-set PHP (below /home/travis/.phpenv/),
-# not the system PHP (/usr/bin/php)
-sudo PHP_PEAR_PHP_BIN=`which php` pear -q install pear/PEAR-1.10.0
-sudo PHP_PEAR_PHP_BIN=`which php` pear -q install DB
-sudo PHP_PEAR_PHP_BIN=`which php` pear -q install PHP_CodeSniffer
-sudo PHP_PEAR_PHP_BIN=`which php` pear list
-# re-populate the shims/ directory, e.g. adds phpcs
-phpenv rehash
-ls -la /home/travis/.phpenv/shims/
+# these packages get installed to the phpenv-set PHP (inside /home/travis/.phpenv/),
+# not the system PHP (/usr/bin/php, /usr/share/php/ etc)
 
 # $PHPENV_VERSION and $TRAVIS_PHP_VERSION are unset.
 export PHPENV_VERSION=$(cat /home/travis/.phpenv/version)
+echo $PHPENV_VERSION
 
-# add lib/php/pear to the PHP include path
+# https://github.com/pear/DB
+composer global require "pear/db=1.9.3"
+# https://github.com/squizlabs/PHP_CodeSniffer
+composer global require "squizlabs/php_codesniffer=*"
+sudo ln -s /home/travis/.config/composer/vendor/bin/phpcs /usr/bin/
+
+
+# make sure PEAR.php and DB.php are in the include path
 tee /tmp/travis.php.ini << EOF
-include_path = .:/home/travis/.phpenv/versions/$PHPENV_VERSION/share/pear:/home/travis/.phpenv/versions/$PHPENV_VERSION/lib/php/pear
+include_path = .:/home/travis/.phpenv/versions/$PHPENV_VERSION/share/pear:/home/travis/.config/composer/vendor/pear/db
 EOF
 phpenv config-add /tmp/travis.php.ini
 
index 474c1d8760a03bf6ebf0a54c93e1b041979ed70d..4a67f70a7753b0105a68d5c7d53c0b08095f71f3 100644 (file)
@@ -106,7 +106,6 @@ $sSQL .= '    ROUND(EXTRACT(epoch FROM indexed_date)) AS indexed_epoch,';
 $sSQL .= '    parent_place_id, ';
 $sSQL .= '    rank_address, ';
 $sSQL .= '    rank_search, ';
-$sSQL .= '    get_searchrank_label(rank_search) AS rank_search_label,'; // only used in HTML output
 $sSQL .= "    get_name_by_language(name,$sLanguagePrefArraySQL) AS localname, ";
 $sSQL .= "    ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') AS isarea, ";
 $sSQL .= '    ST_y(centroid) AS lat, ';
@@ -136,6 +135,7 @@ if (!$aPointDetails) {
 
 $aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber'];
 $aPointDetails['icon'] = Nominatim\ClassTypes\getProperty($aPointDetails, 'icon', false);
+$aPointDetails['rank_search_label'] = getSearchRankLabel($aPointDetails['rank_search']); // only used in HTML format
 
 // Get all alternative names (languages, etc)
 $sSQL = 'SELECT (each(name)).key,(each(name)).value FROM placex ';