# HG changeset patch # User ymh # Date 1476905903 -7200 # Node ID 796ebdbf6a258b8f8f3d7cf04ad5bbae595bee2f # Parent 0365fd9977a41e8a23c2525fcdc9671d8936a7f4 Add filter for discourse types on documents list api end point diff -r 0365fd9977a4 -r 796ebdbf6a25 server/src/app/Http/Controllers/Api/DocumentController.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); diff -r 0365fd9977a4 -r 796ebdbf6a25 server/src/app/Libraries/Filters/CorpusFilterManager.php --- 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 ] ]; } diff -r 0365fd9977a4 -r 796ebdbf6a25 server/src/app/Repositories/RdfDocumentRepository.php --- 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'),