]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 20 Jul 2018 20:28:54 +0000 (22:28 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Fri, 20 Jul 2018 20:28:54 +0000 (22:28 +0200)
CMakeLists.txt
lib/TokenList.php
test/php/Nominatim/TokenListTest.php [new file with mode: 0644]
utils/update.php

index 3f06d842b44a67fd15130f67e906e53e27dec8ec..347f4d488b5a9c506985aab71a1be9feebfe02b2 100644 (file)
@@ -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}")
index 96b756f8b11c4b23c901ab45182f81e1f548fe25..67d94edd7ded9efa1c598b67d3d90eadc3972aba 100644 (file)
@@ -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 (file)
index 0000000..38f13e1
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+
+namespace Nominatim;
+
+@define('CONST_BasePath', '../../');
+
+require_once '../../lib/db.php';
+require_once '../../lib/cmd.php';
+require_once '../../lib/TokenList.php';
+
+class TokenTest extends \PHPUnit_Framework_TestCase
+{
+    protected function setUp()
+    {
+        $this->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('/<p><tt>/');
+
+        $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'));
+    }
+}
index 62c07fac2a3760ee154eebba598d322531627e50..db920826bb0427cabc1e07c27a268e8d0dc859a1 100755 (executable)
@@ -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);