Add filter for discourse types on documents list api end point
authorymh <ymh.work@gmail.com>
Wed, 19 Oct 2016 21:38:23 +0200
changeset 372 796ebdbf6a25
parent 371 0365fd9977a4
child 374 c622fa18eb32
Add filter for discourse types on documents list api end point
server/src/app/Http/Controllers/Api/DocumentController.php
server/src/app/Libraries/Filters/CorpusFilterManager.php
server/src/app/Repositories/RdfDocumentRepository.php
--- a/server/src/app/Http/Controllers/Api/DocumentController.php	Wed Oct 19 18:05:51 2016 +0200
+++ b/server/src/app/Http/Controllers/Api/DocumentController.php	Wed Oct 19 21:38:23 2016 +0200
@@ -36,15 +36,22 @@
         if(!empty($languages)) {
             $filters['language'] = $languages;
         }
+
         $location = CorpusFilterManager::prepareLocation($request->input('location', ''));
         if(!empty($location)) {
             $filters['location'] = $location;
         }
+
         $themes = CorpusFilterManager::prepareTheme($request->input('theme', []));
         if(!empty($themes)) {
             $filters['themes'] = $themes;
         }
 
+        $discourses = CorpusFilterManager::prepareDiscourse($request->input('discourse', []));
+        if(!empty($discourses)) {
+            $filters['discourses'] = $discourses;
+        }
+
         $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 18:05:51 2016 +0200
+++ b/server/src/app/Libraries/Filters/CorpusFilterManager.php	Wed Oct 19 21:38:23 2016 +0200
@@ -130,10 +130,39 @@
             ];
         }
         return [
-            'query' => [
-                'bool' => [
+            'bool' => [
                     'must' => $nestedQueries
-                ]
+            ]
+        ];
+    }
+
+    public static function prepareDiscourse($entities) {
+        if(empty($entities)) {
+            return [];
+        }
+        if(is_string($entities)) {
+            $entities = [$entities,];
+        }
+
+        return array_reduce($entities, function($res, $e) {
+            if(preg_match(config('corpusparole.bnf_ark_url_regexp'), $e)) {
+                array_push($res, $e);
+            } elseif(Utils::startsWith($e, config('corpusparole.bnf_ark_id_base'))) {
+                array_push($res, config('corpusparole.bnf_ark_base_url').$e);
+            }
+            return $res;
+        }, []);
+
+    }
+
+    public static function getDiscourseFilterPart($discourses) {
+        $subDiscQueries=array_map(function($d) {
+            return [ 'term' => ['discourse_types' => "$d" ]];
+        }, $discourses);
+
+        return [
+            'bool' => [
+                'must' => $subDiscQueries
             ]
         ];
     }
--- a/server/src/app/Repositories/RdfDocumentRepository.php	Wed Oct 19 18:05:51 2016 +0200
+++ b/server/src/app/Repositories/RdfDocumentRepository.php	Wed Oct 19 21:38:23 2016 +0200
@@ -168,6 +168,15 @@
             }
             $qFilterParts[] = CorpusFilterManager::getThemeFilterPart($themes);
         }
+        if(array_key_exists('discourses', $filters) && !empty($filters['discourses'])) {
+            $discourses = $filters['discourses'];
+            if(is_string($discourses)) {
+                $discourses = [$discourses,]; // we know it is not empty
+            }
+            $qFilterParts[] = CorpusFilterManager::getDiscourseFilterPart($discourses);
+        }
+
+        Log::debug("queries : ".print_r($qFilterParts, true));
 
         $query = [
             'index' => config('corpusparole.elasticsearch_index'),