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