# HG changeset patch # User ymh # Date 1476875282 -7200 # Node ID 796725d33b67a9780bb912a5d5d6a16d9ee4bfc8 # Parent 5f79f31ca9a2f2d06f9e537fd0b1011452d33926 Add location filter to documents api end-point diff -r 5f79f31ca9a2 -r 796725d33b67 server/src/app/Console/Commands/IndexDocuments.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'], diff -r 5f79f31ca9a2 -r 796725d33b67 server/src/app/Http/Controllers/Api/DocumentController.php --- 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); diff -r 5f79f31ca9a2 -r 796725d33b67 server/src/app/Libraries/Filters/CorpusFilterManager.php --- 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" ] + ]; + } + } diff -r 5f79f31ca9a2 -r 796725d33b67 server/src/app/Repositories/RdfDocumentRepository.php --- 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'), diff -r 5f79f31ca9a2 -r 796725d33b67 server/src/tests/Libraries/Filters/CorpusFilterManagerTest.php --- 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); + } }