server/src/app/Http/Controllers/Api/ThemeController.php
changeset 339 766af1228b05
parent 323 47f0611cc57d
child 377 52169c718513
equal deleted inserted replaced
338:4a3899b6a7ed 339:766af1228b05
     7 use CorpusParole\Http\Controllers\Controller;
     7 use CorpusParole\Http\Controllers\Controller;
     8 
     8 
     9 use Illuminate\Http\Request;
     9 use Illuminate\Http\Request;
    10 use EasyRdf\Resource;
    10 use EasyRdf\Resource;
    11 use EasyRdf\Literal;
    11 use EasyRdf\Literal;
       
    12 
       
    13 use Es;
       
    14 use Log;
    12 
    15 
    13 use CorpusParole\Libraries\Sparql\SparqlClient;
    16 use CorpusParole\Libraries\Sparql\SparqlClient;
    14 use CorpusParole\Services\LexvoResolverInterface;
    17 use CorpusParole\Services\LexvoResolverInterface;
    15 use CorpusParole\Services\BnfResolverInterface;
    18 use CorpusParole\Services\BnfResolverInterface;
    16 
    19 
    31      * @return \Illuminate\Http\Response
    34      * @return \Illuminate\Http\Response
    32      */
    35      */
    33     public function index(Request $request)
    36     public function index(Request $request)
    34     {
    37     {
    35         $filter = $request->input('filter', 'bnf');
    38         $filter = $request->input('filter', 'bnf');
    36         $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN);
    39         $index = $request->input('index', 0);
    37 
    40         $limit = $request->input('limit', config('corpusparole.theme_default_limit'));
    38         $filterClause = "";
    41         $sort = $request->input('sort', 'count');
    39 
    42 
    40         if($filter === 'bnf') {
    43         if($filter === 'bnf') {
    41             $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .";
    44             $include = ".*\\|bnf\\|.*";
    42         }
    45         }
    43         elseif($filter === 'uri') {
    46         elseif($filter === 'lexvo') {
    44             $filterClause = "FILTER isIRI(?o) .";
    47             $include = ".*\\|lxv\\|.*";
    45         }
    48         }
    46         elseif($filter === 'all' || $filter === 'none' || $filter === '') {
    49         elseif($filter === 'olac') {
    47             $filterClause = "";
    50             $include = ".*\\|olac\\|.*";
       
    51         }
       
    52         elseif($filter === 'txt') {
       
    53             $include = ".*\\|txt\\|.*";
       
    54         }
       
    55         elseif($filter === 'all') {
       
    56             $include = false;
    48         }
    57         }
    49         else {
    58         else {
    50             abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'");
    59             abort(401,"Value for filter parameter must be in 'bnf', 'lexvo', 'olac', 'txt', 'all'");
    51         }
    60         }
    52 
    61 
    53         $query =  preg_replace('/\s+/', ' ',
    62         if($sort == "count" || $sort == "descending") {
    54          "select (?o as ?theme) (COUNT(?s) as ?count) where {
    63             $order_field = "_count";
    55             ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
    64             $order_dir = "desc";
    56             ?s <http://purl.org/dc/elements/1.1/subject> ?o .
    65         } elseif($sort == "-count") {
    57             $filterClause
    66             $order_field = "_count";
    58           }
    67             $order_dir = "asc";
    59           GROUP BY ?o
    68         } elseif ($sort == "label" || $sort == "alphabetical") {
    60           ORDER BY DESC(?count)");
    69             $order_field = "_term";
       
    70             $order_dir = "asc";
       
    71         } elseif ($sort == "-label") {
       
    72             $order_field = "_term";
       
    73             $order_dir = "desc";
       
    74         } else {
       
    75             $order_field = "_count";
       
    76             $order_dir = "desc";
       
    77         }
    61 
    78 
    62         $docs = $this->sparqlClient->query($query);
    79         $query = [
       
    80             'index' => env('ELASTICSEARCH_INDEX'),
       
    81             'body' => [
       
    82                 'size' => 0,
       
    83                 'aggs' => [
       
    84                     "subjects" => [
       
    85                         "nested" => [ "path" => "subject" ],
       
    86                         "aggs" => [
       
    87                             "subjects" => [
       
    88                                 "terms" => [
       
    89                                     "field" => "subject.label_code",
       
    90                                     "size" => $limit * ($index+1),
       
    91                                     "order" => [ $order_field => $order_dir ]
       
    92                                 ]
       
    93                             ]
       
    94                         ]
       
    95                     ]
       
    96                 ]
       
    97             ]
       
    98         ];
       
    99 
       
   100         if($include) {
       
   101             $query['body']['aggs']['subjects']['aggs']['subjects']['terms']['include'] = $include;
       
   102         }
       
   103 
       
   104         $esRes = Es::search($query);
    63 
   105 
    64         $themes = [];
   106         $themes = [];
    65         $labels = [];
       
    66 
   107 
    67         $bnfUris = [];
   108         $bucketList = $esRes['aggregations']['subjects']['subjects']['buckets'];
    68         $lexvoUris = [];
   109         if($limit > 0) {
    69 
   110             $bucketList = array_slice($bucketList, $index*$limit, $limit);
    70         foreach ($docs as $row) {
       
    71             $key = "";
       
    72             $label = null;
       
    73             if($row->theme instanceof Resource) {
       
    74                 $key = $row->theme->getUri();
       
    75                 if($resolve && strpos($key, config('corpusparole.bnf_ark_base_url')) === 0) {
       
    76                     array_push($bnfUris, $key);
       
    77                 }
       
    78                 elseif($resolve && strpos($key, config('corpusparole.lexvo_base_url')) === 0) {
       
    79                     array_push($lexvoUris, $key);
       
    80                 }
       
    81                 $label = null;
       
    82             }
       
    83             elseif($row->theme instanceof Literal) {
       
    84                 $key = $row->theme->getValue();
       
    85                 $label = $row->theme->getValue();
       
    86             }
       
    87 
       
    88             $themes[$key] = [
       
    89                 "label" => $label,
       
    90                 "count" => $row->count->getValue()
       
    91             ];
       
    92         }
   111         }
    93 
   112 
    94         if($resolve) {
   113         foreach($bucketList as $bucket) {
    95             if(count($lexvoUris) > 0) {
   114             $parts = explode("|", $bucket['key']);
    96                 $labels = $this->lexvoResolver->getNames($lexvoUris);
   115             $label = $parts[0];
       
   116             if($parts[1] === 'bnf' || $parts[1] === 'lxv') {
       
   117                 $url = ['bnf' => config('corpusparole.bnf_ark_base_url'), 'lxv' => config('corpusparole.lexvo_base_url')][$parts[1]].$parts[2];
    97             }
   118             }
    98             if(count($bnfUris) > 0) {
   119             else {
    99                 $labels = array_merge($labels, $this->bnfResolver->getLabels($bnfUris));
   120                 $url = $parts[2];
   100             }
   121             }
   101             foreach ($themes as $themeKey => $themeDef) {
   122             $themes[$url] = [
   102                 if(array_key_exists($themeKey, $labels)) {
   123                 "label" => $label,
   103                     $themeDef['label'] = $labels[$themeKey];
   124                 "count" => $bucket['doc_count']
   104                 }
   125             ];
   105                 $themes[$themeKey] = $themeDef;
       
   106             }
       
   107         }
   126         }
   108 
   127 
   109         return response()->json(['themes' => $themes ]);
   128         return response()->json(['themes' => $themes ]);
   110 
   129 
   111     }
   130     }