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