server/src/app/Http/Controllers/Api/ThemeController.php
changeset 321 aefaad270b9b
parent 158 366509ae2f37
child 322 084aae09edf4
equal deleted inserted replaced
320:0fce13da58af 321:aefaad270b9b
     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 
    30      *
    33      *
    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         $index = $request->input('index', 0);
    36         $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN);
    39         $limit = $request->input('limit', 0);
       
    40         $sort = $request->input('sort', 'count');
    37 
    41 
    38         $filterClause = "";
       
    39 
    42 
    40         if($filter === 'bnf') {
    43         if($sort == "count" || $sort == "descending") {
    41             $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .";
    44             $order_field = "_count";
    42         }
    45             $order_dir = "desc";
    43         elseif($filter === 'uri') {
    46         } elseif($sort == "-count") {
    44             $filterClause = "FILTER isIRI(?o) .";
    47             $order_field = "_count";
    45         }
    48             $order_dir = "asc";
    46         elseif($filter === 'all' || $filter === 'none' || $filter === '') {
    49         } elseif ($sort == "label" || $sort == "alphabetical") {
    47             $filterClause = "";
    50             $order_field = "_term";
    48         }
    51             $order_dir = "asc";
    49         else {
    52         } elseif ($sort == "-label") {
    50             abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'");
    53             $order_field = "_term";
       
    54             $order_dir = "desc";
       
    55         } else {
       
    56             $order_field = "_count";
       
    57             $order_dir = "desc";
    51         }
    58         }
    52 
    59 
    53         $query =  preg_replace('/\s+/', ' ',
    60         $query = [
    54          "select (?o as ?theme) (COUNT(?s) as ?count) where {
    61             'index' => env('ELASTICSEARCH_INDEX'),
    55             ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
    62             'body' => [
    56             ?s <http://purl.org/dc/elements/1.1/subject> ?o .
    63                 'size' => 0,
    57             $filterClause
    64                 'aggs' => [
    58           }
    65                     "subjects" => [
    59           GROUP BY ?o
    66                         "nested" => [ "path" => "subject" ],
    60           ORDER BY DESC(?count)");
    67                         "aggs" => [
       
    68                             "subjects" => [
       
    69                                 "terms" => [
       
    70                                     "field" => "subject.label_code",
       
    71                                     "size" => $limit * ($index+1),
       
    72                                     "order" => [ $order_field => $order_dir ]
       
    73                                 ]
       
    74                             ]
       
    75                         ]
       
    76                     ]
       
    77                 ]
       
    78             ]
       
    79         ];
    61 
    80 
    62         $docs = $this->sparqlClient->query($query);
    81         $esRes = Es::search($query);
    63 
    82 
    64         $themes = [];
    83         $themes = [];
    65         $labels = [];
       
    66 
    84 
    67         $bnfUris = [];
    85         $bucketList = array_slice($esRes['aggregations']['subjects']['subjects']['buckets'], $index*$limit, $limit);
    68         $lexvoUris = [];
       
    69 
    86 
    70         foreach ($docs as $row) {
    87         foreach($bucketList as $bucket) {
    71             $key = "";
    88             $parts = explode("|", $bucket['key']);
    72             $label = null;
    89             $label = $parts[0];
    73             if($row->theme instanceof Resource) {
    90             $url = config('corpusparole.bnf_ark_base_url').$parts[1];
    74                 $key = $row->theme->getUri();
    91             $themes[$url] = [
    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,
    92                 "label" => $label,
    90                 "count" => $row->count->getValue()
    93                 "count" => $bucket['doc_count']
    91             ];
    94             ];
    92         }
       
    93 
       
    94         if($resolve) {
       
    95             if(count($lexvoUris) > 0) {
       
    96                 $labels = $this->lexvoResolver->getNames($lexvoUris);
       
    97             }
       
    98             if(count($bnfUris) > 0) {
       
    99                 $labels = array_merge($labels, $this->bnfResolver->getLabels($bnfUris));
       
   100             }
       
   101             foreach ($themes as $themeKey => $themeDef) {
       
   102                 if(array_key_exists($themeKey, $labels)) {
       
   103                     $themeDef['label'] = $labels[$themeKey];
       
   104                 }
       
   105                 $themes[$themeKey] = $themeDef;
       
   106             }
       
   107         }
    95         }
   108 
    96 
   109         return response()->json(['themes' => $themes ]);
    97         return response()->json(['themes' => $themes ]);
   110 
    98 
   111     }
    99     }