From: Sarah Hoffmann Date: Thu, 21 Feb 2019 22:39:48 +0000 (+0100) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: deploy~295 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/65c89194fccef562c544c05dbcef0d9e6ad16a0d?hp=abd294912abf844d054d5786dd80b7f1a2170a4d Merge remote-tracking branch 'upstream/master' --- diff --git a/.travis.yml b/.travis.yml index b9adc069..fe4e0cbd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ --- sudo: required -dist: trusty +dist: xenial language: python python: - "3.6" diff --git a/README.md b/README.md index dd900e3e..7e8c776e 100644 --- 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. diff --git a/docs/admin/Import-and-Update.md b/docs/admin/Import-and-Update.md index 1e55e856..3d090597 100644 --- a/docs/admin/Import-and-Update.md +++ b/docs/admin/Import-and-Update.md @@ -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 --all [--osm2pgsql-cache 28000] 2>&1 | tee setup.log diff --git a/lib/lib.php b/lib/lib.php index 3a6166a6..458930fd 100644 --- a/lib/lib.php +++ b/lib/lib.php @@ -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; +} diff --git a/sql/functions.sql b/sql/functions.sql index 94a03231..54e2a8d3 100644 --- a/sql/functions.sql +++ b/sql/functions.sql @@ -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 $$ diff --git a/sql/indices.src.sql b/sql/indices.src.sql index dd16affb..b661cf4a 100644 --- a/sql/indices.src.sql +++ b/sql/indices.src.sql @@ -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}; diff --git a/test/README.md b/test/README.md index d90b6f13..cdf350f8 100644 --- a/test/README.md +++ b/test/README.md @@ -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 diff --git a/test/bdd/environment.py b/test/bdd/environment.py index fdc65a5e..25b118b4 100644 --- a/test/bdd/environment.py +++ b/test/bdd/environment.py @@ -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("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)); + } } diff --git a/test/php/phpunit.xml b/test/php/phpunit.xml index 1fc95795..bc07177c 100644 --- a/test/php/phpunit.xml +++ b/test/php/phpunit.xml @@ -7,7 +7,6 @@ convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" - syntaxCheck="true" bootstrap="./bootstrap.php" beStrictAboutTestsThatDoNotTestAnything="true" > diff --git a/utils/update.php b/utils/update.php index 7cf96d90..8e118834 100644 --- a/utils/update.php +++ b/utils/update.php @@ -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; diff --git a/vagrant/install-on-travis-ci.sh b/vagrant/install-on-travis-ci.sh index ef9f03c4..883a9472 100755 --- a/vagrant/install-on-travis-ci.sh +++ b/vagrant/install-on-travis-ci.sh @@ -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 @@ -14,31 +14,32 @@ 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 diff --git a/website/details.php b/website/details.php index 474c1d87..4a67f70a 100644 --- a/website/details.php +++ b/website/details.php @@ -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 ';