From: Sarah Hoffmann Date: Wed, 3 Jul 2019 21:18:35 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: deploy~280 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/8ac36e2e18a8b2260251ea3f1e869dafb2ebe2eb?hp=b522ea6dc77f39132d6ab4b288fb18c25d2104c0 Merge remote-tracking branch 'upstream/master' --- diff --git a/lib/Phrase.php b/lib/Phrase.php index 2e90537e..e2643e87 100644 --- a/lib/Phrase.php +++ b/lib/Phrase.php @@ -9,8 +9,8 @@ namespace Nominatim; */ class Phrase { - public const MAX_WORDSET_LEN = 20; - public const MAX_WORDSETS = 100; + const MAX_WORDSET_LEN = 20; + const MAX_WORDSETS = 100; // Complete phrase as a string. private $sPhrase; diff --git a/lib/log.php b/lib/log.php index ae4253c0..25ed75cb 100644 --- a/lib/log.php +++ b/lib/log.php @@ -36,7 +36,7 @@ function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array()) $sUserAgent = $_SERVER['HTTP_USER_AGENT']; else $sUserAgent = ''; $sSQL = 'insert into new_query_log (type,starttime,query,ipaddress,useragent,language,format,searchterm)'; - $sSQL .= ' values ('. + $sSQL .= ' values ('; $sSQL .= join(',', $oDB->getDBQuotedList(array( $sType, $hLog[0], @@ -48,7 +48,7 @@ function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array()) $hLog[3] ))); $sSQL .= ')'; - $oDB->query($sSQL); + $oDB->exec($sSQL); } return $hLog; @@ -67,7 +67,7 @@ function logEnd(&$oDB, $hLog, $iNumResults) $sSQL .= ' where starttime = '.$oDB->getDBQuoted($hLog[0]); $sSQL .= ' and ipaddress = '.$oDB->getDBQuoted($hLog[1]); $sSQL .= ' and query = '.$oDB->getDBQuoted($hLog[2]); - $oDB->query($sSQL); + $oDB->exec($sSQL); } if (CONST_Log_File) { diff --git a/sql/functions.sql b/sql/functions.sql index 97f78d24..c97d11da 100644 --- a/sql/functions.sql +++ b/sql/functions.sql @@ -768,6 +768,28 @@ END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION osmline_reinsert(node_id BIGINT, geom GEOMETRY) + RETURNS BOOLEAN + AS $$ +DECLARE + existingline RECORD; +BEGIN + SELECT w.id FROM planet_osm_ways w, location_property_osmline p + WHERE p.linegeo && geom and p.osm_id = w.id and p.indexed_status = 0 + and node_id = any(w.nodes) INTO existingline; + + IF existingline.id is not NULL THEN + DELETE FROM location_property_osmline WHERE osm_id = existingline.id; + INSERT INTO location_property_osmline (osm_id, address, linegeo) + SELECT osm_id, address, geometry FROM place + WHERE osm_type = 'W' and osm_id = existingline.id; + END IF; + + RETURN true; +END; +$$ +LANGUAGE plpgsql; + CREATE OR REPLACE FUNCTION osmline_insert() RETURNS TRIGGER AS $$ @@ -908,7 +930,10 @@ BEGIN RETURN NEW; -- %DIFFUPDATES% The following is not needed until doing diff updates, and slows the main index process down - IF NEW.rank_address > 0 THEN + IF NEW.osm_type = 'N' and NEW.rank_search > 28 THEN + -- might be part of an interpolation + result := osmline_reinsert(NEW.osm_id, NEW.geometry); + ELSEIF NEW.rank_address > 0 THEN IF (ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') AND ST_IsValid(NEW.geometry)) THEN -- Performance: We just can't handle re-indexing for country level changes IF st_area(NEW.geometry) < 1 THEN @@ -1230,6 +1255,8 @@ BEGIN END IF; --DEBUG: RAISE WARNING 'Copy over address tags'; + -- housenumber is a computed field, so start with an empty value + NEW.housenumber := NULL; IF NEW.address is not NULL THEN IF NEW.address ? 'conscriptionnumber' THEN i := getorcreate_housenumber_id(make_standard_name(NEW.address->'conscriptionnumber')); @@ -2198,12 +2225,13 @@ BEGIN indexed_status = 2, geometry = NEW.geometry where place_id = existingplacex.place_id; - -- if a node(=>house), which is part of a interpolation line, changes (e.g. the street attribute) => mark this line for reparenting -- (already here, because interpolation lines are reindexed before nodes, so in the second call it would be too late) - IF NEW.osm_type='N' and NEW.class='place' and NEW.type='house' THEN - -- Is this node part of an interpolation line? search for it in location_property_osmline and mark the interpolation line for reparenting - update location_property_osmline p set indexed_status = 2 from planet_osm_ways w where p.linegeo && NEW.geometry and p.osm_id = w.id and NEW.osm_id = any(w.nodes); + IF NEW.osm_type='N' + and (coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore) + or existing.geometry::text != NEW.geometry::text) + THEN + result:= osmline_reinsert(NEW.osm_id, NEW.geometry); END IF; -- linked places should get potential new naming and addresses diff --git a/test/bdd/db/update/interpolation.feature b/test/bdd/db/update/interpolation.feature index f7f7dddb..27ac552e 100644 --- a/test/bdd/db/update/interpolation.feature +++ b/test/bdd/db/update/interpolation.feature @@ -275,7 +275,6 @@ Feature: Update of address interpolations | parent_place_id | start | end | | W2 | 2 | 6 | - @Fail Scenario: housenumber added in middle of interpolation Given the grid | 1 | | | | | 2 | @@ -334,7 +333,6 @@ Feature: Update of address interpolations | parent_place_id | start | end | geometry | | W1 | 2 | 10 | 3,4,5 | - @Fail Scenario: Change the start housenumber Given the grid | 1 | | 2 | diff --git a/test/php/Nominatim/PhraseTest.php b/test/php/Nominatim/PhraseTest.php index c23d6483..ab031bb0 100644 --- a/test/php/Nominatim/PhraseTest.php +++ b/test/php/Nominatim/PhraseTest.php @@ -113,9 +113,9 @@ class PhraseTest extends \PHPUnit\Framework\TestCase $oPhrase = new Phrase(join(' ', array_fill(0, 18, 'a')), ''); $oPhrase->computeWordSets(new TokensFullSet()); - $this->assertEquals(Phrase::MAX_WORDSETS, count($oPhrase->getWordSets())); + $this->assertEquals(100, count($oPhrase->getWordSets())); $oPhrase->invertWordSets(); - $this->assertEquals(Phrase::MAX_WORDSETS, count($oPhrase->getWordSets())); + $this->assertEquals(100, count($oPhrase->getWordSets())); }