Add location filter to documents api end-point
authorymh <ymh.work@gmail.com>
Wed, 19 Oct 2016 13:08:02 +0200
changeset 369 796725d33b67
parent 368 5f79f31ca9a2
child 370 d7c5b43d309a
Add location filter to documents api end-point
server/src/app/Console/Commands/IndexDocuments.php
server/src/app/Http/Controllers/Api/DocumentController.php
server/src/app/Libraries/Filters/CorpusFilterManager.php
server/src/app/Repositories/RdfDocumentRepository.php
server/src/tests/Libraries/Filters/CorpusFilterManagerTest.php
--- a/server/src/app/Console/Commands/IndexDocuments.php	Wed Oct 19 00:31:18 2016 +0200
+++ b/server/src/app/Console/Commands/IndexDocuments.php	Wed Oct 19 13:08:02 2016 +0200
@@ -104,7 +104,7 @@
                             ]
                         ],
                         'date' => [ 'type' => 'date', 'index' => 'not_analyzed'],
-                        'geonames_hyerarchy' => [ 'type' => 'string', 'index' => 'not_analyzed'],
+                        'geonames_hierarchy' => [ 'type' => 'string', 'index' => 'not_analyzed'],
                         'location' => [ 'type' => 'geo_point'],
                         'creation_date' => ['type' => 'date', 'index' => 'not_analyzed'],
                         'language' => ['type' => 'string', 'index' => 'not_analyzed'],
--- a/server/src/app/Http/Controllers/Api/DocumentController.php	Wed Oct 19 00:31:18 2016 +0200
+++ b/server/src/app/Http/Controllers/Api/DocumentController.php	Wed Oct 19 13:08:02 2016 +0200
@@ -31,10 +31,16 @@
         $perPage = intval($request->input('perpage', config('corpusparole.documents_per_page')));
 
         $filters = [];
-        $languages = $request->input('language', []);
+
+        $languages = CorpusFilterManager::prepareLanguages($request->input('language', []));
         if(!empty($languages)) {
-            $filters['language'] = CorpusFilterManager::prepareLanguages($languages);
+            $filters['language'] = $languages;
         }
+        $location = CorpusFilterManager::prepareLocation($request->input('location', ''));
+        if(!empty($location)) {
+            $filters['location'] = $location;
+        }
+
         $sort = $request->input('sort', null);
 
         $paginator = $this->documentRepository->paginate($filters, $perPage, config('corpusparole.pagination_page_param'), null, $sort);
--- a/server/src/app/Libraries/Filters/CorpusFilterManager.php	Wed Oct 19 00:31:18 2016 +0200
+++ b/server/src/app/Libraries/Filters/CorpusFilterManager.php	Wed Oct 19 13:08:02 2016 +0200
@@ -9,7 +9,7 @@
     public static function getLanguageNode($nodeId) {
         $node = null;
         $currentNodes = [config('corpusparole.languages_treemap'),];
-        while(is_null($node) || !empty($currentNodes)) {
+        while(is_null($node) && !empty($currentNodes)) {
             $currentNode = array_pop($currentNodes);
             foreach($currentNode['children'] as $n) {
                 if($n['id'] === $nodeId) {
@@ -40,6 +40,9 @@
 
     public static function prepareLanguages($languages) {
 
+        if(is_null($languages)) {
+            return [];
+        }
         $resLanguage = [];
         if(is_string($languages)) {
             $languages = [ $languages, ];
@@ -71,4 +74,31 @@
         ];
     }
 
+    public static function prepareLocation($location) {
+        if(empty($location)) {
+            return null;
+        }
+        if(is_array($location)) {
+            $location = $location[0]; //from test above we know ther is at least one element
+        }
+        if(preg_match(config('corpusparole.geonames_url_regexp'), $location, $m)) {
+            $location = $m[1];
+        }
+        // for the moment we do not make this check. Incorrect loaction format will return an empty result
+        /*if(!preg_match('/\d+/', $location)) {
+            return null;
+        }*/
+
+        return $location;
+    }
+
+    /**
+     * Search in geonames_hierarchy (values are bae geonames ids)
+     */
+    public static function getLocationFilterPart($location) {
+        return [
+            'term' => [ 'geonames_hierarchy' => "$location" ]
+        ];
+    }
+
 }
--- a/server/src/app/Repositories/RdfDocumentRepository.php	Wed Oct 19 00:31:18 2016 +0200
+++ b/server/src/app/Repositories/RdfDocumentRepository.php	Wed Oct 19 13:08:02 2016 +0200
@@ -154,6 +154,14 @@
             }
             $qFilterParts[] = CorpusFilterManager::getLanguagesFilterPart($languages);
         }
+        if(array_key_exists('location', $filters) && !empty($filters['location'])) {
+            $location = $filters['location'];
+            if(is_array($location)) {
+                $location = $location[0]; // we know it is not empty
+            }
+            $location = $filters['location'];
+            $qFilterParts[] = CorpusFilterManager::getLocationFilterPart($location);
+        }
 
         $query = [
             'index' => config('corpusparole.elasticsearch_index'),
--- a/server/src/tests/Libraries/Filters/CorpusFilterManagerTest.php	Wed Oct 19 00:31:18 2016 +0200
+++ b/server/src/tests/Libraries/Filters/CorpusFilterManagerTest.php	Wed Oct 19 13:08:02 2016 +0200
@@ -17,6 +17,18 @@
     }
 
     /**
+     * test prepare languages unknown
+     *
+     * @return void
+     */
+    public function testPrepareLanguagesUnkown()
+    {
+        $languagesInput = ['foobar'];
+        $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
+        $this->assertEquals($languagesOutput, ['http://lexvo.org/id/iso639-3/foobar']);
+    }
+
+    /**
      * test prepare languages addPrefix
      *
      * @return void
@@ -59,7 +71,7 @@
      */
     public function testPrepareLanguagesRecusionComplex()
     {
-        $languagesInput = ['fra', 'http://lexvo.org/id/iso639-3/gsw', 'corpus-oil', 'corpus-regional'];
+        $languagesInput = ['fra', 'http://lexvo.org/id/iso639-3/gsw', 'corpus-oil', 'corpus-regionals'];
         $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
         sort($languagesOutput);
         $languagesExpected = ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/pcd',
@@ -69,5 +81,65 @@
         $this->assertEquals($languagesOutput, $languagesExpected);
     }
 
+    /**
+     * test prepare location no operation
+     *
+     * @return void
+     */
+    public function testPrepareLocationNoOp()
+    {
+        $locationInput = '3030293';
+        $locationOutput = CorpusFilterManager::prepareLocation($locationInput);
+        $this->assertEquals('3030293', $locationOutput);
+    }
+
+    /**
+     * test prepare location array
+     *
+     * @return void
+     */
+    public function testPrepareLocationArray()
+    {
+        $locationInput = ['3030293', 'foobar'];
+        $locationOutput = CorpusFilterManager::prepareLocation($locationInput);
+        $this->assertEquals('3030293', $locationOutput);
+    }
+
+
+    /**
+     * test prepare location unknown
+     *
+     * @return void
+     */
+    public function testPrepareLocationUnknown()
+    {
+        $locationInput = 'foobar';
+        $locationOutput = CorpusFilterManager::prepareLocation($locationInput);
+        $this->assertEquals('foobar', $locationOutput);
+    }
+
+    /**
+     * test prepare location geonames
+     *
+     * @return void
+     */
+    public function testPrepareLocationGeonames()
+    {
+        $locationInput = 'http://sws.geonames.org/3030293';
+        $locationOutput = CorpusFilterManager::prepareLocation($locationInput);
+        $this->assertEquals('3030293', $locationOutput);
+    }
+
+    /**
+     * test prepare location geonames array
+     *
+     * @return void
+     */
+    public function testPrepareLocationGeonamesArray()
+    {
+        $locationInput = ['http://sws.geonames.org/3030293', 'http://www.geonames.org/3017382'];
+        $locationOutput = CorpusFilterManager::prepareLocation($locationInput);
+        $this->assertEquals('3030293', $locationOutput);
+    }
 
 }