|
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 } |