--- 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);
+ }
}