server/src/app/Http/Controllers/Api/ThemeController.php
changeset 158 366509ae2f37
child 321 aefaad270b9b
equal deleted inserted replaced
157:1f9853178fcd 158:366509ae2f37
       
     1 <?php
       
     2 
       
     3 namespace CorpusParole\Http\Controllers\Api;
       
     4 
       
     5 // use Illuminate\Http\Request;
       
     6 // use CorpusParole\Http\Requests;
       
     7 use CorpusParole\Http\Controllers\Controller;
       
     8 
       
     9 use Illuminate\Http\Request;
       
    10 use EasyRdf\Resource;
       
    11 use EasyRdf\Literal;
       
    12 
       
    13 use CorpusParole\Libraries\Sparql\SparqlClient;
       
    14 use CorpusParole\Services\LexvoResolverInterface;
       
    15 use CorpusParole\Services\BnfResolverInterface;
       
    16 
       
    17 
       
    18 class ThemeController extends Controller
       
    19 {
       
    20     private $sparqlClient = null;
       
    21 
       
    22     public function __construct(SparqlClient $sparqlClient, LexvoResolverInterface $lexvoResolver, BnfResolverInterface $bnfResolver) {
       
    23         $this->sparqlClient = $sparqlClient;
       
    24         $this->lexvoResolver = $lexvoResolver;
       
    25         $this->bnfResolver = $bnfResolver;
       
    26     }
       
    27 
       
    28     /**
       
    29      * Display the specified resource.
       
    30      *
       
    31      * @return \Illuminate\Http\Response
       
    32      */
       
    33     public function index(Request $request)
       
    34     {
       
    35         $filter = $request->input('filter', 'bnf');
       
    36         $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN);
       
    37 
       
    38         $filterClause = "";
       
    39 
       
    40         if($filter === 'bnf') {
       
    41             $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .";
       
    42         }
       
    43         elseif($filter === 'uri') {
       
    44             $filterClause = "FILTER isIRI(?o) .";
       
    45         }
       
    46         elseif($filter === 'all' || $filter === 'none' || $filter === '') {
       
    47             $filterClause = "";
       
    48         }
       
    49         else {
       
    50             abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'");
       
    51         }
       
    52 
       
    53         $query =  preg_replace('/\s+/', ' ',
       
    54          "select (?o as ?theme) (COUNT(?s) as ?count) where {
       
    55             ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
       
    56             ?s <http://purl.org/dc/elements/1.1/subject> ?o .
       
    57             $filterClause
       
    58           }
       
    59           GROUP BY ?o
       
    60           ORDER BY DESC(?count)");
       
    61 
       
    62         $docs = $this->sparqlClient->query($query);
       
    63 
       
    64         $themes = [];
       
    65         $labels = [];
       
    66 
       
    67         $bnfUris = [];
       
    68         $lexvoUris = [];
       
    69 
       
    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         }
       
    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         }
       
   108 
       
   109         return response()->json(['themes' => $themes ]);
       
   110 
       
   111     }
       
   112 
       
   113 }