]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Mon, 14 Aug 2017 19:57:24 +0000 (21:57 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Mon, 14 Aug 2017 19:57:24 +0000 (21:57 +0200)
21 files changed:
AUTHORS
CMakeLists.txt
CONTRIBUTING.md
ChangeLog
README.md
VAGRANT.md
Vagrantfile
docs/CMakeLists.txt
docs/Import-and-Update.md [moved from docs/Import_and_update.md with 93% similarity]
docs/Install-on-Centos-7.md [moved from docs/install-on-centos-7.md with 97% similarity]
docs/Install-on-Ubuntu-16.md [moved from docs/install-on-ubuntu-16.md with 97% similarity]
docs/Installation.md
osm2pgsql
sql/functions.sql
test/README.md
test/bdd/environment.py
test/bdd/steps/cgi-with-coverage.php [new file with mode: 0644]
test/bdd/steps/queries.py
vagrant/Install-on-Centos-7.sh [moved from vagrant/install-on-centos-7.sh with 96% similarity]
vagrant/Install-on-Ubuntu-16.sh [moved from vagrant/install-on-ubuntu-16.sh with 96% similarity]
vagrant/install-on-travis-ci.sh

diff --git a/AUTHORS b/AUTHORS
index b90e705714e4702a4714845c05fdd55a8551e73c..a94d288eed4f50dc01651f8d0d37fcf202ca00a2 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -2,18 +2,17 @@ Nominatim was written by:
 
   Brian Quinion
   Sarah Hoffmann
+  Marc Tobias Metten
+  markigail
+  IrlJidel
   Frederik Ramm
   Michael Spreng
   Daniele Forsi
   mfn
   Grant Slater
   Andree Klattenhoff
-  IrlJidel
   appelflap
   b3nn0
   Spin0us
   Kurt Roeckx
   Rodolphe QuiĆ©deville
-  Marc Tobias Metten
-
-Reverse geocoding using Tiger data feature made possible with support from Guru Labs
index 2b4df7bd33a701a805c2d3be28ff23892374bd8c..267784c3e3d542d362456931363e660b0dd3e58f 100644 (file)
@@ -18,10 +18,11 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
 
 project(nominatim)
 
-set(NOMINATIM_VERSION_MAJOR 2)
-set(NOMINATIM_VERSION_MINOR 5)
+set(NOMINATIM_VERSION_MAJOR 3)
+set(NOMINATIM_VERSION_MINOR 0)
+set(NOMINATIM_VERSION_PATCH 1)
 
-set(NOMINATIM_VERSION "${NOMINATIM_VERSION_MAJOR}.${NOMINATIM_VERSION_MINOR}")
+set(NOMINATIM_VERSION "${NOMINATIM_VERSION_MAJOR}.${NOMINATIM_VERSION_MINOR}.${NOMINATIM_VERSION_PATCH}")
 
 add_definitions(-DNOMINATIM_VERSION="${NOMINATIM_VERSION}")
 
index 7ebd6b9dc9c9835f888000d2a2c8aaac6a154b54..a00d0ed354aa68ac5ffe4a00d107253f4c62874d 100644 (file)
@@ -30,12 +30,13 @@ Please make sure to add the following information:
 
 Please add the following information to your issue:
 
- * hardware configuration: RAM size, kind of disks
- * Operating system (also mention if you are running on a cloud server)
+ * hardware configuration: RAM size, CPUs, kind and size of disks
+ * Operating system (also mention if you are running on a cloud service)
  * Postgres and Postgis version
  * list of settings you changed in your Postgres configuration
- * Nominatim version (commit id, if you run from the github repo)
- * (if applicable) exact command line of the command that was causing the issues
+ * Nominatim version (release version or,
+   if you run from the git repo, the output of `git rev-parse HEAD`)
+ * (if applicable) exact command line of the command that was causing the issue
 
 
 ## Workflow for Pull Requests
index 87275f2ab3627f343d5243fb1cc07339c369b32c..3adc3021929fc749aff6f31d90df3ff7901c8002 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,39 @@
+3.0.1
+
+ * fix bug in geometry building algorithm in osm2pgsql
+ * fix typos in build instructions
+
+3.0.0
+
+ * move to cmake build system
+ * various fixes to HTML output
+ * reverse endpoint now can return geometries
+ * add support for PHP7
+ * move to on-the-fly computation of interpolations
+ * improve handling of linked places (updating)
+ * improve test framework:
+    * replace lettuce with behave
+    * use smaller database for API tests
+ * drop support for postgres < 9.1, postgis < 2.0 and PHP < 5.4
+ * make external data use optional (useful for imports without US)
+ * detect postgres and postgis versions automatically
+ * clean up query logging and remove unused tables
+ * move installation documentation into this repo
+ * add self-documenting vagrant scripts
+ * remove --create-website, recommend to use website directory in build
+ * add accessor functions for URL parameters and improve erro checking
+ * remove IP blocking and rate-limiting code
+ * enable CI via travis
+ * reformatting for more consistent coding style
+ * make country search term creation part of setup
+ * update country names and country grid
+ * handle roads that cross boundaries better
+ * keep full information on address tags
+ * update to refactored osm2pgsql which use libosmium based types
+ * switch from osmosis to pyosmium for updates
+ * be more strict when matching against special search terms
+ * handle postcode entries with mutliple values correctly
+
 2.5
 
  * reverse geocoding includes looking up housenumbers from Tiger data
index 46c419fab644d62d0b926ac3efe5a981bf774cdd..5059473c6aec84428b6be9e866aa0bd2ae55b409 100644 (file)
--- a/README.md
+++ b/README.md
@@ -33,14 +33,14 @@ Here is a quick summary of the necessary steps.
 
    For more detailed installation instructions see [docs/Installation.md](docs/Installation.md).
    There are also step-by-step instructions for
-     [Ubuntu 16.04](docs/install-on-ubuntu-16.md) and
-     [CentOS 7.2](docs/install-on-centos-7.md).
+     [Ubuntu 16.04](docs/Install-on-Ubuntu-16.md) and
+     [CentOS 7.2](docs/Install-on-Centos-7.md).
 
 2. Get OSM data and import:
 
         ./build/utils/setup.php --osm-file <your planet file> --all
 
-   Details can be found in [docs/Import_and_update.md](docs/Import_and_update.md)
+   Details can be found in [docs/Import_and_update.md](docs/Import-and-Update.md)
 
 3. Point your webserver to the ./build/website directory.
 
@@ -51,7 +51,7 @@ License
 
 The source code is available under a GPLv2 license.
 
-Contact and Bugreports
+Contact and Bug reports
 ======================
 
 For questions you can join the geocoding mailinglist, see
index c24717a1c2970fc349bf69720cef184832687cc2..9ea1ec663448a24d329f8f50fa0ee1139650db87 100644 (file)
@@ -53,7 +53,7 @@ is.
 
     To repeat an import you'd need to delete the database first
 
-        dropdb -if-exists nominatim
+        dropdb --if-exists nominatim
 
 
 
index b9d618e20f8434c07a9c1acb51a683128cf843fc..d369fcd6605118b5afd9ec92003d65e31af8f217 100644 (file)
@@ -17,7 +17,7 @@ Vagrant.configure("2") do |config|
   config.vm.define "ubuntu", primary: true do |sub|
       sub.vm.box = "bento/ubuntu-16.04"
       sub.vm.provision :shell do |s|
-        s.path = "vagrant/install-on-ubuntu-16.sh"
+        s.path = "vagrant/Install-on-Ubuntu-16.sh"
         s.privileged = false
         s.args = [checkout]
       end
@@ -35,7 +35,7 @@ Vagrant.configure("2") do |config|
    config.vm.define "centos" do |sub|
       sub.vm.box = "bento/centos-7.2"
       sub.vm.provision :shell do |s|
-        s.path = "vagrant/install-on-centos-7.sh"
+        s.path = "vagrant/Install-on-Centos-7.sh"
         s.privileged = false
         s.args = [checkout]
       end
index 7da84491ac637986d61a73e13b74f40fd1b8b2ea..1a7dbd1c64d99f846accac108727979d5e9e12c5 100644 (file)
@@ -1,8 +1,8 @@
 # Auto-generated vagrant install documentation
 
 set (INSTALLDOCFILES
-     install-on-centos-7
-     install-on-ubuntu-16
+     Install-on-Centos-7
+     Install-on-Ubuntu-16
     )
 
 foreach (df ${INSTALLDOCFILES})
@@ -18,9 +18,11 @@ ADD_CUSTOM_TARGET( md_install_${df} ALL
         )
 endforeach()
 
+# Copied static documentation
+
 set (GENERALDOCFILES
      Installation.md
-     Import_and_update.md
+     Import-and-Update.md
      Faq.md
     )
 
similarity index 93%
rename from docs/Import_and_update.md
rename to docs/Import-and-Update.md
index 266a5d8b9e5a00dbb499da45cd3aad8e17b42541..3eda0a02a7821af56ad05723ef5c0a8be4377100 100644 (file)
@@ -39,6 +39,10 @@ This data is available as a binary download:
 Combined the 2 files are around 1.5GB and add around 30GB to the install
 size of nominatim. They also increase the install time by an hour or so.
 
+*NOTE:* you'll need to download the Wikipedia rankings before performing
+the initial import of the data if you want the rankings applied to the
+loaded data.
+
 ### UK postcodes
 
 Nominatim can use postcodes from an external source to improve searches that involve a UK postcode. This data can be optionally downloaded: 
@@ -108,7 +112,7 @@ instance by following these steps:
 
   6. Apply the new settings:
 
-        ./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions
+         ./utils/setup.php --create-functions --enable-diff-updates --create-partition-functions
 
 Be warned that the import can take a very long time, especially if you
 import all of the US. The entire US adds about 10GB to your database.
@@ -156,7 +160,7 @@ diffs for Ireland from geofabrik add the following:
 
 To set up the update process now run the following command:
 
-    ./utils/update --init-updates
+    ./utils/update.php --init-updates
 
 It outputs the date where updates will start. Recheck that this date is
 what you expect.
@@ -171,6 +175,8 @@ The following command will keep your database constantly up to date:
 
     ./utils/update.php --import-osmosis-all
 
+(Note that even though the old name "import-osmosis-all" has been kept for compatibility reasons, Osmosis is not required to run this - it uses pyosmium behind the scenes.)
+
 If you have imported multiple country extracts and want to keep them
 up-to-date, have a look at the script in
 [issue #60](https://github.com/openstreetmap/Nominatim/issues/60).
similarity index 97%
rename from docs/install-on-centos-7.md
rename to docs/Install-on-Centos-7.md
index 481bd2d0d7d74c8a9fc7194ba86fa05583e5b66e..35200d6ff739d5e1fa55e3f792145fabab45994f 100644 (file)
@@ -1,6 +1,6 @@
 
 *Note:* these installation instructions are also available in executable
-        form for use with vagrant under vagrant/install-on-centos-7.sh.
+        form for use with vagrant under `vagrant/Install-on-Centos-7.sh`.
 
 Installing the Required Software
 ================================
@@ -178,4 +178,4 @@ EOF
 
 
 Nominatim is now ready to use. Continue with
-[importing a database from OSM data](Import_and_update.md).
+[importing a database from OSM data](Import-and-Update.md).
similarity index 97%
rename from docs/install-on-ubuntu-16.md
rename to docs/Install-on-Ubuntu-16.md
index de8468d42a232acadc063ea0efb83bd163e7a40a..322a476acbd2b823445570f42213b3a9515028d1 100644 (file)
@@ -7,7 +7,7 @@
 
 
 *Note:* these installation instructions are also available in executable
-        form for use with vagrant under vagrant/install-on-ubuntu-16.sh.
+        form for use with vagrant under vagrant/Install-on-Ubuntu-16.sh.
 
 Installing the Required Software
 ================================
@@ -164,4 +164,4 @@ EOF
 
 
 Nominatim is now ready to use. Continue with
-[importing a database from OSM data](Import_and_update.md).
+[importing a database from OSM data](Import-and-Update.md).
index 88f32ada55ea2e9b77051b9d4fff34ee37c7e410..1cdd9d109014b039cbaaf40965ecec74620fb12e 100644 (file)
@@ -5,8 +5,8 @@ This page contains generic installation instructions for Nominatim and its
 prerequisites. There are also step-by-step instructions available for
 the following operating systems:
 
-  * [Ubuntu 16.04](install-on-ubuntu-16.md)
-  * [CentOS 7.2](install-on-centos-7.md)
+  * [Ubuntu 16.04](Install-on-Ubuntu-16.md)
+  * [CentOS 7.2](Install-on-Centos-7.md)
 
 These OS-specific instructions can also be found in executable form
 in the `vagrant/` directory.
@@ -151,4 +151,4 @@ Restart the nginx and php5-fpm services and the website should now be available
 on http://localhost/.
 
 
-Now continue with [importing the database](Import_and_update.md).
+Now continue with [importing the database](Import-and-Update.md).
index c27acf17055ebe22c6363c293385865c624207f8..00fb2505c1548a7403ce01f69e891447124235c3 160000 (submodule)
--- a/osm2pgsql
+++ b/osm2pgsql
@@ -1 +1 @@
-Subproject commit c27acf17055ebe22c6363c293385865c624207f8
+Subproject commit 00fb2505c1548a7403ce01f69e891447124235c3
index d55b0d652f5ad24faf42446b1ec13340016821b7..db382116a8cb9af7e9916231db10d58a7f5b3038 100644 (file)
@@ -409,7 +409,7 @@ DECLARE
 BEGIN
   place_centre := ST_PointOnSurface(place);
 
---DEBUG: RAISE WARNING 'get_country_code, start: %', ST_AsText(place_centre);
+-- RAISE WARNING 'get_country_code, start: %', ST_AsText(place_centre);
 
   -- Try for a OSM polygon
   FOR nearcountry IN select country_code from location_area_country where country_code is not null and not isguess and st_covers(geometry, place_centre) limit 1
@@ -417,7 +417,7 @@ BEGIN
     RETURN nearcountry.country_code;
   END LOOP;
 
---DEBUG: RAISE WARNING 'osm fallback: %', ST_AsText(place_centre);
+-- RAISE WARNING 'osm fallback: %', ST_AsText(place_centre);
 
   -- Try for OSM fallback data
   -- The order is to deal with places like HongKong that are 'states' within another polygon
@@ -426,7 +426,7 @@ BEGIN
     RETURN nearcountry.country_code;
   END LOOP;
 
---DEBUG: RAISE WARNING 'natural earth: %', ST_AsText(place_centre);
+-- RAISE WARNING 'natural earth: %', ST_AsText(place_centre);
 
   -- Natural earth data
   FOR nearcountry IN select country_code from country_naturalearthdata where st_covers(geometry, place_centre) limit 1
@@ -434,7 +434,7 @@ BEGIN
     RETURN nearcountry.country_code;
   END LOOP;
 
---DEBUG: RAISE WARNING 'near osm fallback: %', ST_AsText(place_centre);
+-- RAISE WARNING 'near osm fallback: %', ST_AsText(place_centre);
 
   -- 
   FOR nearcountry IN select country_code from country_osm_grid where st_dwithin(geometry, place_centre, 0.5) order by st_distance(geometry, place_centre) asc, area asc limit 1
@@ -442,7 +442,7 @@ BEGIN
     RETURN nearcountry.country_code;
   END LOOP;
 
---DEBUG: RAISE WARNING 'near natural earth: %', ST_AsText(place_centre);
+-- RAISE WARNING 'near natural earth: %', ST_AsText(place_centre);
 
   -- Natural earth data 
   FOR nearcountry IN select country_code from country_naturalearthdata where st_dwithin(geometry, place_centre, 0.5) limit 1
@@ -1147,7 +1147,7 @@ DECLARE
 BEGIN
   -- deferred delete
   IF OLD.indexed_status = 100 THEN
-    --DEBUG: RAISE WARNING 'placex_update_delete % %',NEW.osm_type,NEW.osm_id;
+    --DEBUG: RAISE WARNING 'placex_update delete % %',NEW.osm_type,NEW.osm_id;
     delete from placex where place_id = OLD.place_id;
     RETURN NULL;
   END IF;
@@ -1156,10 +1156,7 @@ BEGIN
     RETURN NEW;
   END IF;
 
-  --DEBUG: RAISE WARNING 'placex_update % %',NEW.osm_type,NEW.osm_id;
-
---RAISE WARNING '%',NEW.place_id;
---RAISE WARNING '%', NEW;
+  --DEBUG: RAISE WARNING 'placex_update % % (%)',NEW.osm_type,NEW.osm_id,NEW.place_id;
 
   IF NEW.class = 'place' AND NEW.type = 'postcodearea' THEN
     -- Silently do nothing
@@ -1177,9 +1174,11 @@ BEGIN
   -- update not necessary for osmline, cause linked_place_id does not exist
 
   IF NEW.linked_place_id is not null THEN
+    --DEBUG: RAISE WARNING 'place already linked to %', NEW.linked_place_id;
     RETURN NEW;
   END IF;
 
+  --DEBUG: RAISE WARNING 'Copy over address tags';
   IF NEW.address is not NULL THEN
       IF NEW.address ? 'conscriptionnumber' THEN
         i := getorcreate_housenumber_id(make_standard_name(NEW.address->'conscriptionnumber'));
@@ -1207,6 +1206,7 @@ BEGIN
   -- cheaper but less acurate
   place_centroid := ST_PointOnSurface(NEW.geometry);
   NEW.centroid := null;
+  --DEBUG: RAISE WARNING 'Computing preliminary centroid at %',ST_AsText(place_centroid);
 
   -- recalculate country and partition
   IF NEW.rank_search = 4 AND NEW.address is not NULL AND NEW.address ? 'country' THEN
@@ -1227,6 +1227,7 @@ BEGIN
     END IF;
     NEW.partition := get_partition(NEW.country_code);
   END IF;
+  --DEBUG: RAISE WARNING 'Country updated: "%"', NEW.country_code;
 
   -- waterway ways are linked when they are part of a relation and have the same class/type
   IF NEW.osm_type = 'R' and NEW.class = 'waterway' THEN
@@ -1234,7 +1235,7 @@ BEGIN
       LOOP
           FOR i IN 1..array_upper(relation_members, 1) BY 2 LOOP
               IF relation_members[i+1] in ('', 'main_stream', 'side_stream') AND substring(relation_members[i],1,1) = 'w' THEN
-                --DEBUG: RAISE WARNING 'waterway parent %, child %/%', NEW.osm_id, i, relation.members[i];
+                --DEBUG: RAISE WARNING 'waterway parent %, child %/%', NEW.osm_id, i, relation_members[i];
                 FOR linked_node_id IN SELECT place_id FROM placex
                   WHERE osm_type = 'W' and osm_id = substring(relation_members[i],2,200)::bigint
                   and class = NEW.class and type = NEW.type
@@ -1245,6 +1246,7 @@ BEGIN
               END IF;
           END LOOP;
       END LOOP;
+      --DEBUG: RAISE WARNING 'Waterway processed';
   END IF;
 
   -- Adding ourselves to the list simplifies address calculations later
@@ -1266,6 +1268,7 @@ BEGIN
       END IF;
     END IF;
   END IF;
+  --DEBUG: RAISE WARNING 'Local names updated';
 
   -- Initialise the name vector using our name
   name_vector := make_keywords(NEW.name);
@@ -1281,13 +1284,13 @@ BEGIN
     select language||':'||title,importance from wikipedia_article where osm_type = NEW.osm_type and osm_id = NEW.osm_id order by importance desc limit 1 INTO NEW.wikipedia,NEW.importance;
   END IF;
 
---RAISE WARNING 'before low level% %', NEW.place_id, NEW.rank_search;
+--DEBUG: RAISE WARNING 'Importance computed from wikipedia: %', NEW.importance;
 
   -- ---------------------------------------------------------------------------
   -- For low level elements we inherit from our parent road
   IF (NEW.rank_search > 27 OR (NEW.type = 'postcode' AND NEW.rank_search = 25)) THEN
 
---RAISE WARNING 'finding street for %', NEW;
+    --DEBUG: RAISE WARNING 'finding street for % %', NEW.osm_type, NEW.osm_id;
 
     -- We won't get a better centroid, besides these places are too small to care
     NEW.centroid := place_centroid;
@@ -1307,6 +1310,7 @@ BEGIN
         NEW.housenumber := location.address->'housenumber';
         addr_street := location.address->'street';
         addr_place := location.address->'place';
+        --DEBUG: RAISE WARNING 'Found surrounding building % %', location.osm_type, location.osm_id;
       END LOOP;
     END IF;
 
@@ -1328,7 +1332,7 @@ BEGIN
         END LOOP;
       END IF;
     END LOOP;
-
+    --DEBUG: RAISE WARNING 'Checked for street relation (%)', NEW.parent_place_id;
 
     -- Note that addr:street links can only be indexed once the street itself is indexed
     IF NEW.parent_place_id IS NULL AND addr_street IS NOT NULL THEN
@@ -1339,6 +1343,7 @@ BEGIN
         END LOOP;
       END IF;
     END IF;
+    --DEBUG: RAISE WARNING 'Checked for addr:street (%)', NEW.parent_place_id;
 
     IF NEW.parent_place_id IS NULL AND addr_place IS NOT NULL THEN
       address_street_word_ids := get_name_ids(make_standard_name(addr_place));
@@ -1348,6 +1353,7 @@ BEGIN
         END LOOP;
       END IF;
     END IF;
+    --DEBUG: RAISE WARNING 'Checked for addr:place (%)', NEW.parent_place_id;
 
     -- Is this node part of an interpolation?
     IF NEW.parent_place_id IS NULL AND NEW.osm_type = 'N' THEN
@@ -1359,6 +1365,7 @@ BEGIN
          NEW.parent_place_id := location.parent_place_id;
       END LOOP;
     END IF;
+    --DEBUG: RAISE WARNING 'Checked for interpolation (%)', NEW.parent_place_id;
 
     -- Is this node part of a way?
     IF NEW.parent_place_id IS NULL AND NEW.osm_type = 'N' THEN
@@ -1366,12 +1373,14 @@ BEGIN
       FOR location IN select p.place_id, p.osm_id, p.parent_place_id, p.rank_search, p.address from placex p, planet_osm_ways w
          where p.osm_type = 'W' and p.rank_search >= 26 and p.geometry && NEW.geometry and w.id = p.osm_id and NEW.osm_id = any(w.nodes) 
       LOOP
+        --DEBUG: RAISE WARNING 'Node is part of way % ', location.osm_id;
 
         -- Way IS a road then we are on it - that must be our road
         IF location.rank_search < 28 AND NEW.parent_place_id IS NULL THEN
 --RAISE WARNING 'node in way that is a street %',location;
           NEW.parent_place_id := location.place_id;
         END IF;
+        --DEBUG: RAISE WARNING 'Checked if way is street (%)', NEW.parent_place_id;
 
         -- If the way mentions a street or place address, try that for parenting.
         IF NEW.parent_place_id IS NULL AND location.address ? 'street' THEN
@@ -1382,6 +1391,7 @@ BEGIN
             END LOOP;
           END IF;
         END IF;
+        --DEBUG: RAISE WARNING 'Checked for addr:street in way (%)', NEW.parent_place_id;
 
         IF NEW.parent_place_id IS NULL AND location.address ? 'place' THEN
           address_street_word_ids := get_name_ids(make_standard_name(location.address->'place'));
@@ -1391,6 +1401,7 @@ BEGIN
             END LOOP;
           END IF;
         END IF;
+        --DEBUG: RAISE WARNING 'Checked for addr:place in way (%)', NEW.parent_place_id;
 
         -- Is the WAY part of a relation
         IF NEW.parent_place_id IS NULL THEN
@@ -1408,21 +1419,20 @@ BEGIN
               END IF;
             END LOOP;
         END IF;
+        --DEBUG: RAISE WARNING 'Checked for street relation in way (%)', NEW.parent_place_id;
 
       END LOOP;
 
     END IF;
 
---RAISE WARNING 'x4 %',NEW.parent_place_id;
     -- Still nothing, just use the nearest road
     IF NEW.parent_place_id IS NULL THEN
       FOR location IN SELECT place_id FROM getNearestRoadFeature(NEW.partition, place_centroid) LOOP
         NEW.parent_place_id := location.place_id;
       END LOOP;
     END IF;
+    --DEBUG: RAISE WARNING 'Checked for nearest way (%)', NEW.parent_place_id;
 
---return NEW;
---RAISE WARNING 'x6 %',NEW.parent_place_id;
 
     -- If we didn't find any road fallback to standard method
     IF NEW.parent_place_id IS NOT NULL THEN
@@ -1430,9 +1440,11 @@ BEGIN
       -- Get the details of the parent road
       select * from search_name where place_id = NEW.parent_place_id INTO location;
       NEW.country_code := location.country_code;
+      --DEBUG: RAISE WARNING 'Got parent details from search name';
 
       -- Merge the postcode into the parent's address if necessary
       IF NEW.postcode IS NOT NULL THEN
+        --DEBUG: RAISE WARNING 'Merging postcode into parent';
         isin_tokens := '{}'::int[];
         address_street_word_id := getorcreate_word_id(make_standard_name(NEW.postcode));
         IF address_street_word_id is not null
@@ -1451,9 +1463,9 @@ BEGIN
         END IF;
       END IF;
 
---RAISE WARNING '%', NEW.name;
       -- If there is no name it isn't searchable, don't bother to create a search record
       IF NEW.name is NULL THEN
+        --DEBUG: RAISE WARNING 'Not a searchable place % %', NEW.osm_type, NEW.osm_id;
         return NEW;
       END IF;
 
@@ -1467,29 +1479,30 @@ BEGIN
 
       IF NEW.rank_search <= 25 and NEW.rank_address > 0 THEN
         result := add_location(NEW.place_id, NEW.country_code, NEW.partition, name_vector, NEW.rank_search, NEW.rank_address, NEW.geometry);
+        --DEBUG: RAISE WARNING 'Place added to location table';
       END IF;
 
       result := insertSearchName(NEW.partition, NEW.place_id, NEW.country_code, name_vector, nameaddress_vector, NEW.rank_search, NEW.rank_address, NEW.importance, place_centroid, NEW.geometry);
+      --DEBUG: RAISE WARNING 'Place added to search table';
 
       return NEW;
     END IF;
 
   END IF;
 
--- RAISE WARNING '  INDEXING Started:';
--- RAISE WARNING '  INDEXING: %',NEW;
-
   -- ---------------------------------------------------------------------------
   -- Full indexing
+  --DEBUG: RAISE WARNING 'Using full index mode for % %', NEW.osm_type, NEW.osm_id;
 
   IF NEW.osm_type = 'R' AND NEW.rank_search < 26 THEN
 
     -- see if we have any special relation members
     select members from planet_osm_rels where id = NEW.osm_id INTO relation_members;
+    --DEBUG: RAISE WARNING 'Got relation members';
 
--- RAISE WARNING 'get_osm_rel_members, label';
     IF relation_members IS NOT NULL THEN
       FOR relMember IN select get_osm_rel_members(relation_members,ARRAY['label']) as member LOOP
+        --DEBUG: RAISE WARNING 'Found label member %', relMember.member;
 
         FOR linkedPlacex IN select * from placex where osm_type = upper(substring(relMember.member,1,1))::char(1) 
           and osm_id = substring(relMember.member,2,10000)::bigint
@@ -1515,6 +1528,7 @@ BEGIN
           -- keep a note of the node id in case we need it for wikipedia in a bit
           linked_node_id := linkedPlacex.osm_id;
           select language||':'||title,importance from get_wikipedia_match(linkedPlacex.extratags, NEW.country_code) INTO linked_wikipedia,linked_importance;
+          --DEBUG: RAISE WARNING 'Linked label member';
         END LOOP;
 
       END LOOP;
@@ -1522,6 +1536,7 @@ BEGIN
       IF NEW.centroid IS NULL THEN
 
         FOR relMember IN select get_osm_rel_members(relation_members,ARRAY['admin_center','admin_centre']) as member LOOP
+          --DEBUG: RAISE WARNING 'Found admin_center member %', relMember.member;
 
           FOR linkedPlacex IN select * from placex where osm_type = upper(substring(relMember.member,1,1))::char(1) 
             and osm_id = substring(relMember.member,2,10000)::bigint
@@ -1552,6 +1567,7 @@ BEGIN
               -- keep a note of the node id in case we need it for wikipedia in a bit
               linked_node_id := linkedPlacex.osm_id;
               select language||':'||title,importance from get_wikipedia_match(linkedPlacex.extratags, NEW.country_code) INTO linked_wikipedia,linked_importance;
+              --DEBUG: RAISE WARNING 'Linked admin_center';
             END IF;
 
           END LOOP;
@@ -1569,6 +1585,7 @@ BEGIN
     -- not found one yet? how about doing a name search
     IF NEW.centroid IS NULL AND (NEW.name->'name') is not null and make_standard_name(NEW.name->'name') != '' THEN
 
+      --DEBUG: RAISE WARNING 'Looking for nodes with matching names';
       FOR linkedPlacex IN select placex.* from placex WHERE
         make_standard_name(name->'name') = make_standard_name(NEW.name->'name')
         AND placex.rank_address = NEW.rank_address
@@ -1576,7 +1593,7 @@ BEGIN
         AND placex.osm_type = 'N'::char(1) AND placex.rank_search < 26
         AND st_covers(NEW.geometry, placex.geometry)
       LOOP
-
+        --DEBUG: RAISE WARNING 'Found matching place node %', linkedPlacex.osm_id;
         -- If we don't already have one use this as the centre point of the geometry
         IF NEW.centroid IS NULL THEN
           NEW.centroid := coalesce(linkedPlacex.centroid,st_centroid(linkedPlacex.geometry));
@@ -1595,6 +1612,7 @@ BEGIN
         -- keep a note of the node id in case we need it for wikipedia in a bit
         linked_node_id := linkedPlacex.osm_id;
         select language||':'||title,importance from get_wikipedia_match(linkedPlacex.extratags, NEW.country_code) INTO linked_wikipedia,linked_importance;
+        --DEBUG: RAISE WARNING 'Linked named place';
       END LOOP;
     END IF;
 
@@ -1613,6 +1631,7 @@ BEGIN
           END IF;
         END IF;
       END IF;
+      --DEBUG: RAISE WARNING 'Names updated from linked places';
     END IF;
 
     -- Use the maximum importance if a one could be computed from the linked object.
@@ -1623,6 +1642,7 @@ BEGIN
 
     -- Still null? how about looking it up by the node id
     IF NEW.importance IS NULL THEN
+      --DEBUG: RAISE WARNING 'Looking up importance by linked node id';
       select language||':'||title,importance from wikipedia_article where osm_type = 'N'::char(1) and osm_id = linked_node_id order by importance desc limit 1 INTO NEW.wikipedia,NEW.importance;
     END IF;
 
@@ -1631,6 +1651,7 @@ BEGIN
   -- make sure all names are in the word table
   IF NEW.admin_level = 2 AND NEW.class = 'boundary' AND NEW.type = 'administrative' AND NEW.country_code IS NOT NULL THEN
     perform create_country(NEW.name, lower(NEW.country_code));
+    --DEBUG: RAISE WARNING 'Country names updated';
   END IF;
 
   NEW.parent_place_id = 0;
@@ -1638,6 +1659,7 @@ BEGIN
 
 
   -- convert isin to array of tokenids
+  --DEBUG: RAISE WARNING 'Starting address search';
   isin_tokens := '{}'::int[];
   IF NEW.address IS NOT NULL THEN
     isin := avals(NEW.address);
@@ -1657,6 +1679,7 @@ BEGIN
       END LOOP;
     END IF;
   END IF;
+  --DEBUG: RAISE WARNING '"address:* tokens collected';
   IF NEW.postcode IS NOT NULL THEN
     isin := regexp_split_to_array(NEW.postcode, E'[;,]');
     IF array_upper(isin, 1) IS NOT NULL THEN
@@ -1675,6 +1698,7 @@ BEGIN
       END LOOP;
     END IF;
   END IF;
+  --DEBUG: RAISE WARNING 'postcode tokens collected';
 
   -- %NOTIGERDATA% IF 0 THEN
   -- for the USA we have an additional address table.  Merge in zip codes from there too
@@ -1689,6 +1713,7 @@ BEGIN
       nameaddress_vector := array_merge(nameaddress_vector, ARRAY[address_street_word_id]);
     END LOOP;
   END IF;
+  --DEBUG: RAISE WARNING 'Tiger postcodes collected';
   -- %NOTIGERDATA% END IF;
 
 -- RAISE WARNING 'ISIN: %', isin_tokens;
@@ -1699,7 +1724,7 @@ BEGIN
   location_parent := NULL;
   -- added ourself as address already
   address_havelevel[NEW.rank_address] := true;
-  -- RAISE WARNING '  getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
+  --DEBUG: RAISE WARNING '  getNearFeatures(%,''%'',%,''%'')',NEW.partition, place_centroid, search_maxrank, isin_tokens;
   FOR location IN
     SELECT * from getNearFeatures(NEW.partition,
                                   CASE WHEN NEW.rank_search >= 26
@@ -1708,9 +1733,6 @@ BEGIN
                                        ELSE place_centroid END,
                                   search_maxrank, isin_tokens)
   LOOP
-
---RAISE WARNING '  AREA: %',location;
-
     IF location.rank_address != location_rank_search THEN
       location_rank_search := location.rank_address;
       IF location.isguess THEN
@@ -1761,11 +1783,12 @@ BEGIN
 
       END IF;
 
---RAISE WARNING '  Terms: (%) %',location, nameaddress_vector;
+    --DEBUG: RAISE WARNING '  Terms: (%) %',location, nameaddress_vector;
 
     END IF;
 
   END LOOP;
+  --DEBUG: RAISE WARNING 'address computed';
 
   -- try using the isin value to find parent places
   IF array_upper(isin_tokens, 1) IS NOT NULL THEN
@@ -1794,6 +1817,7 @@ BEGIN
 
     END LOOP;
   END IF;
+  --DEBUG: RAISE WARNING 'isin tokens processed';
 
   -- for long ways we should add search terms for the entire length
   IF st_length(NEW.geometry) > 0.05 THEN
@@ -1820,19 +1844,23 @@ BEGIN
     END LOOP;
 
   END IF;
+  --DEBUG: RAISE WARNING 'search terms for long ways added';
 
   -- if we have a name add this to the name search table
   IF NEW.name IS NOT NULL THEN
 
     IF NEW.rank_search <= 25 and NEW.rank_address > 0 THEN
       result := add_location(NEW.place_id, NEW.country_code, NEW.partition, name_vector, NEW.rank_search, NEW.rank_address, NEW.geometry);
+      --DEBUG: RAISE WARNING 'added to location (full)';
     END IF;
 
     IF NEW.rank_search between 26 and 27 and NEW.class = 'highway' THEN
       result := insertLocationRoad(NEW.partition, NEW.place_id, NEW.country_code, NEW.geometry);
+      --DEBUG: RAISE WARNING 'insert into road location table (full)';
     END IF;
 
     result := insertSearchName(NEW.partition, NEW.place_id, NEW.country_code, name_vector, nameaddress_vector, NEW.rank_search, NEW.rank_address, NEW.importance, place_centroid, NEW.geometry);
+    --DEBUG: RAISE WARNING 'added to serach name (full)';
 
   END IF;
 
@@ -1840,7 +1868,9 @@ BEGIN
   IF NEW.centroid IS NULL THEN
     NEW.centroid := place_centroid;
   END IF;
-  
+
+  --DEBUG: RAISE WARNING 'place update % % finsihed.', NEW.osm_type, NEW.osm_id;
+
   RETURN NEW;
 END;
 $$
index f6112620018513f6ef49e1db7833eb8ca0ccccef..f6c1ac2a9edeb816f20865ea4b5558ce4b7d1556 100644 (file)
@@ -120,6 +120,21 @@ Before importing make sure to add the following to your local settings:
     @define('CONST_Database_DSN', 'pgsql://@/test_api_nominatim');
     @define('CONST_Wikipedia_Data_Path', CONST_BasePath.'/test/testdb');
 
+#### Code Coverage
+
+The API tests also support code coverage tests. You need to install
+PHP_CodeCoverage. On Debian/Ubuntu run:
+
+    apt-get install php-codecoverage
+
+The run the API tests as follows:
+
+    behave api -DPHPCOV=<coverage output dir>
+
+To generate reports, you can use the phpcov tool:
+
+    phpcov merge --html=<report output dir> <coverage output dir>
+
 ### Indexing Tests (`test/bdd/db`)
 
 These tests check the import and update of the Nominatim database. They do not
index aca7929d250de6fa6fd69a2c3c4b565bc2062fba..6f50817a96d97a930380ce5c5f3bf91770ec4ac8 100644 (file)
@@ -17,7 +17,8 @@ userconfig = {
     'TEMPLATE_DB' : 'test_template_nominatim',
     'TEST_DB' : 'test_nominatim',
     'API_TEST_DB' : 'test_api_nominatim',
-    'TEST_SETTINGS_FILE' : '/tmp/nominatim_settings.php'
+    'TEST_SETTINGS_FILE' : '/tmp/nominatim_settings.php',
+    'PHPCOV' : False, # set to output directory to enable code coverage
 }
 
 use_step_matcher("re")
@@ -28,16 +29,25 @@ class NominatimEnvironment(object):
 
     def __init__(self, config):
         self.build_dir = os.path.abspath(config['BUILDDIR'])
+        self.src_dir = os.path.abspath(os.path.join(os.path.split(__file__)[0], "../.."))
         self.template_db = config['TEMPLATE_DB']
         self.test_db = config['TEST_DB']
         self.api_test_db = config['API_TEST_DB']
         self.local_settings_file = config['TEST_SETTINGS_FILE']
         self.reuse_template = not config['REMOVE_TEMPLATE']
         self.keep_scenario_db = config['KEEP_TEST_DB']
+        self.code_coverage_path = config['PHPCOV']
+        self.code_coverage_id = 1
         os.environ['NOMINATIM_SETTINGS'] = self.local_settings_file
 
         self.template_db_done = False
 
+    def next_code_coverage_file(self):
+        fn = os.path.join(self.code_coverage_path, "%06d.cov" % self.code_coverage_id)
+        self.code_coverage_id += 1
+
+        return fn
+
     def write_nominatim_config(self, dbname):
         f = open(self.local_settings_file, 'w')
         f.write("<?php\n  @define('CONST_Database_DSN', 'pgsql://@/%s');\n" % dbname)
diff --git a/test/bdd/steps/cgi-with-coverage.php b/test/bdd/steps/cgi-with-coverage.php
new file mode 100644 (file)
index 0000000..17104d4
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+require_once 'SebastianBergmann/CodeCoverage/autoload.php';
+$covfilter = new SebastianBergmann\CodeCoverage\Filter();
+$covfilter->addDirectoryToWhitelist($_SERVER['COV_PHP_DIR']);
+$coverage = new SebastianBergmann\CodeCoverage\CodeCoverage(null, $covfilter);
+$coverage->start($_SERVER['COV_TEST_NAME']);
+
+include $_SERVER['COV_SCRIPT_FILENAME'];
+
+
+$coverage->stop();
+$writer = new \SebastianBergmann\CodeCoverage\Report\PHP;
+$writer->process($coverage, $_SERVER['PHP_CODE_COVERAGE_FILE']);
index 55285d6a6bac83c52fc6559c4e227dae5323b2bb..443342b0d1b86f79d634f42c1daaf01972f8c281 100644 (file)
@@ -282,7 +282,18 @@ def send_api_query(endpoint, params, fmt, context):
     if hasattr(context, 'http_headers'):
         env.update(context.http_headers)
 
-    cmd = ['/usr/bin/php-cgi', env['SCRIPT_FILENAME']]
+    cmd = ['/usr/bin/php-cgi', '-f']
+    if context.nominatim.code_coverage_path:
+        env['COV_SCRIPT_FILENAME'] = env['SCRIPT_FILENAME']
+        env['COV_PHP_DIR'] = os.path.join(context.nominatim.src_dir, "lib")
+        env['COV_TEST_NAME'] = '%s:%s' % (context.scenario.filename, context.scenario.line)
+        env['SCRIPT_FILENAME'] = \
+                os.path.join(os.path.split(__file__)[0], 'cgi-with-coverage.php')
+        cmd.append(env['SCRIPT_FILENAME'])
+        env['PHP_CODE_COVERAGE_FILE'] = context.nominatim.next_code_coverage_file()
+    else:
+        cmd.append(env['SCRIPT_FILENAME'])
+
     for k,v in params.items():
         cmd.append("%s=%s" % (k, v))
 
similarity index 96%
rename from vagrant/install-on-centos-7.sh
rename to vagrant/Install-on-Centos-7.sh
index 8b283ef63f1b7af7b953f54a91828f6459bb5ea5..36d3ea4a45fe0959ee68b879a91db1baf68185c0 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/bash
 #
 # *Note:* these installation instructions are also available in executable
-#         form for use with vagrant under vagrant/install-on-centos-7.sh.
+#         form for use with vagrant under `vagrant/Install-on-Centos-7.sh`.
 #
 # Installing the Required Software
 # ================================
@@ -145,10 +145,10 @@ if [ "x$1" == "xyes" ]; then  #DOCS:
 
     cd $USERHOME
     git clone --recursive git://github.com/openstreetmap/Nominatim.git
-#DOCS:    cd Nominatim
+    cd Nominatim
 
 else                               #DOCS:
-    cd $USERHOME                   #DOCS:
+    cd $USERHOME/Nominatim         #DOCS:
 fi                                 #DOCS:
 
 # When installing the latest source from github, you also need to
@@ -161,6 +161,7 @@ fi                                 #DOCS:
 # The code must be built in a separate directory. Create this directory,
 # then configure and build Nominatim in there:
 
+    cd $USERHOME                   #DOCS:
     mkdir build
     cd build
     cmake $USERHOME/Nominatim
@@ -179,4 +180,4 @@ EOF
 
 
 # Nominatim is now ready to use. Continue with
-# [importing a database from OSM data](Import_and_update.md).
+# [importing a database from OSM data](Import-and-Update.md).
similarity index 96%
rename from vagrant/install-on-ubuntu-16.sh
rename to vagrant/Install-on-Ubuntu-16.sh
index 11f80a3e4b4ec8949f25ee0586499cc7e0fd6a1b..28e38be9513f6da976721c12279e45ee77a08ae8 100755 (executable)
@@ -8,7 +8,7 @@ export DEBIAN_FRONTEND=noninteractive #DOCS:
 
 #
 # *Note:* these installation instructions are also available in executable
-#         form for use with vagrant under vagrant/install-on-ubuntu-16.sh.
+#         form for use with vagrant under vagrant/Install-on-Ubuntu-16.sh.
 #
 # Installing the Required Software
 # ================================
@@ -132,10 +132,10 @@ if [ "x$1" == "xyes" ]; then  #DOCS:
 
     cd $USERHOME
     git clone --recursive git://github.com/openstreetmap/Nominatim.git
-#DOCS:    cd Nominatim
+    cd Nominatim
 
 else                               #DOCS:
-    cd $USERHOME                   #DOCS:
+    cd $USERHOME/Nominatim         #DOCS:
 fi                                 #DOCS:
 
 # When installing the latest source from github, you also need to
@@ -148,6 +148,7 @@ fi                                 #DOCS:
 # The code must be built in a separate directory. Create this directory,
 # then configure and build Nominatim in there:
 
+    cd $USERHOME                   #DOCS:
     mkdir build
     cd build
     cmake $USERHOME/Nominatim
@@ -165,4 +166,4 @@ EOF
 
 
 # Nominatim is now ready to use. Continue with
-# [importing a database from OSM data](Import_and_update.md).
+# [importing a database from OSM data](Import-and-Update.md).
index ec0a92dabd4b6ab128c8a9e1c0e29f68e10247cb..983571856e07c8469034a246dc15167cb260f7b5 100755 (executable)
@@ -45,7 +45,7 @@ EOFAPACHECONF
 sudo a2enconf nominatim
 sudo service apache2 restart
 
-wget -O data/country_osm_grid.sql.gz http://www.nominatim.org/data/country_grid.sql.gz
+wget -O $TRAVIS_BUILD_DIR/data/country_osm_grid.sql.gz http://www.nominatim.org/data/country_grid.sql.gz
 
 mkdir build
 cd build