From: Sarah Hoffmann Date: Fri, 20 Jul 2018 20:28:54 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: deploy~314 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/f6cf89fdde89f3ae26cb5146c6b2124cf9022f77?hp=e929399d4dd23fa1571dd77cf489ef51d716f5cc Merge remote-tracking branch 'upstream/master' --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f06d842..347f4d48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ link_directories(${PostgreSQL_LIBRARY_DIRS}) find_program(PYOSMIUM pyosmium-get-changes) if (NOT EXISTS "${PYOSMIUM}") - set(PYOSMIUM_PATH "/nonexistent") + set(PYOSMIUM_PATH "") message(WARNING "pyosmium-get-changes not found (required for updates)") else() set(PYOSMIUM_PATH "${PYOSMIUM}") diff --git a/lib/TokenList.php b/lib/TokenList.php index 96b756f8..67d94edd 100644 --- a/lib/TokenList.php +++ b/lib/TokenList.php @@ -32,6 +32,17 @@ class TokenList // List of list of tokens indexed by their word_token. private $aTokens = array(); + + /** + * Return total number of tokens. + * + * @return Integer + */ + public function count() + { + return count($this->aTokens); + } + /** * Check if there are tokens for the given token word. * @@ -114,7 +125,7 @@ class TokenList $iId, $aWord['class'], $aWord['type'], - $aWord['operator'] ? Operator::NONE : Operator::NEAR + $aWord['operator'] ? Operator::NEAR : Operator::NONE ); } } elseif ($aWord['country_code']) { diff --git a/test/php/Nominatim/TokenListTest.php b/test/php/Nominatim/TokenListTest.php new file mode 100644 index 00000000..38f13e18 --- /dev/null +++ b/test/php/Nominatim/TokenListTest.php @@ -0,0 +1,116 @@ +oNormalizer = $this->getMock(\MockNormalizer::class, array('transliterate')); + $this->oNormalizer->method('transliterate') + ->will($this->returnCallback(function ($text) { + return strtolower($text); + })); + } + + private function wordResult($aFields) + { + $aRow = array( + 'word_id' => null, + 'word_token' => null, + 'word' => null, + 'class' => null, + 'type' => null, + 'country_code' => null, + 'count' => 0 + ); + return array_merge($aRow, $aFields); + } + + public function testList() + { + $TL = new TokenList; + + $this->assertEquals(0, $TL->count()); + + $TL->addToken('word1', 'token1'); + $TL->addToken('word1', 'token2'); + + $this->assertEquals(1, $TL->count()); + + $this->assertTrue($TL->contains('word1')); + $this->assertEquals(array('token1', 'token2'), $TL->get('word1')); + + $this->assertFalse($TL->contains('unknownword')); + $this->assertEquals(array(), $TL->get('unknownword')); + } + + public function testAddress() + { + $this->expectOutputRegex('/

/'); + + $oDbStub = $this->getMock(\DB::class, array('getAll')); + $oDbStub->method('getAll') + ->will($this->returnCallback(function ($sql) { + $aResults = array(); + if (preg_match('/1051/', $sql)) { + $aResults[] = $this->wordResult(array( + 'word_id' => 999, + 'word_token' => '1051', + 'class' => 'place', + 'type' => 'house' + )); + } + if (preg_match('/64286/', $sql)) { + $aResults[] = $this->wordResult(array( + 'word_id' => 999, + 'word_token' => '64286', + 'word' => '64286', + 'class' => 'place', + 'type' => 'postcode' + )); + } + if (preg_match('/darmstadt/', $sql)) { + $aResults[] = $this->wordResult(array( + 'word_id' => 999, + 'word_token' => 'darmstadt', + 'count' => 533 + )); + } + if (preg_match('/alemagne/', $sql)) { + $aResults[] = $this->wordResult(array( + 'word_id' => 999, + 'word_token' => 'alemagne', + 'country_code' => 'de', + )); + } + if (preg_match('/mexico/', $sql)) { + $aResults[] = $this->wordResult(array( + 'word_id' => 999, + 'word_token' => 'mexico', + 'country_code' => 'mx', + )); + } + return $aResults; + })); + + $aCountryCodes = array('de', 'fr'); + $sNormQuery = '1051 hauptstr 64286 darmstadt alemagne mexico'; + $aTokens = explode(' ', $sNormQuery); + + $TL = new TokenList; + $TL->addTokensFromDB($oDbStub, $aTokens, $aCountryCodes, $sNormQuery, $this->oNormalizer); + $this->assertEquals(4, $TL->count()); + + $this->assertEquals(array(new Token\HouseNumber(999, '1051')), $TL->get('1051')); + $this->assertEquals(array(new Token\Country(999, 'de')), $TL->get('alemagne')); + $this->assertEquals(array(new Token\Postcode(999, '64286')), $TL->get('64286')); + $this->assertEquals(array(new Token\Word(999, true, 533)), $TL->get('darmstadt')); + } +} diff --git a/utils/update.php b/utils/update.php index 62c07fac..db920826 100755 --- a/utils/update.php +++ b/utils/update.php @@ -69,6 +69,22 @@ if ($aResult['init-updates']) { echo "Does the URL point to a directory containing OSM update data?\n\n"; fail('replication URL not reachable.'); } + // sanity check for pyosmium-get-changes + if (!CONST_Pyosmium_Binary) { + echo "\nCONST_Pyosmium_Binary not configured.\n"; + echo "You need to install pyosmium and set up the path to pyosmium-get-changes\n"; + echo "in your local settings file.\n\n"; + fail('CONST_Pyosmium_Binary not configured'); + } + $aOutput = 0; + $sCmd = CONST_Pyosmium_Binary.' --help'; + exec($sCmd, $aOutput, $iRet); + if ($iRet != 0) { + echo "Cannot execute pyosmium-get-changes.\n"; + echo "Make sure you have pyosmium installed correctly\n"; + echo "and have set up CONST_Pyosmium_Binary to point to pyosmium-get-changes.\n"; + fail('pyosmium-get-changes not found or not usable'); + } $sSetup = CONST_InstallPath.'/utils/setup.php'; $iRet = -1; passthru($sSetup.' --create-functions --enable-diff-updates', $iRet);