diff -r 0fce13da58af -r aefaad270b9b server/src/app/Http/Controllers/Api/ThemeController.php --- a/server/src/app/Http/Controllers/Api/ThemeController.php Tue Oct 04 13:53:56 2016 +0200 +++ b/server/src/app/Http/Controllers/Api/ThemeController.php Wed Oct 05 02:31:25 2016 +0200 @@ -10,6 +10,9 @@ use EasyRdf\Resource; use EasyRdf\Literal; +use Es; +use Log; + use CorpusParole\Libraries\Sparql\SparqlClient; use CorpusParole\Services\LexvoResolverInterface; use CorpusParole\Services\BnfResolverInterface; @@ -32,80 +35,65 @@ */ public function index(Request $request) { - $filter = $request->input('filter', 'bnf'); - $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN); + $index = $request->input('index', 0); + $limit = $request->input('limit', 0); + $sort = $request->input('sort', 'count'); - $filterClause = ""; - if($filter === 'bnf') { - $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) ."; - } - elseif($filter === 'uri') { - $filterClause = "FILTER isIRI(?o) ."; - } - elseif($filter === 'all' || $filter === 'none' || $filter === '') { - $filterClause = ""; - } - else { - abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'"); + if($sort == "count" || $sort == "descending") { + $order_field = "_count"; + $order_dir = "desc"; + } elseif($sort == "-count") { + $order_field = "_count"; + $order_dir = "asc"; + } elseif ($sort == "label" || $sort == "alphabetical") { + $order_field = "_term"; + $order_dir = "asc"; + } elseif ($sort == "-label") { + $order_field = "_term"; + $order_dir = "desc"; + } else { + $order_field = "_count"; + $order_dir = "desc"; } - $query = preg_replace('/\s+/', ' ', - "select (?o as ?theme) (COUNT(?s) as ?count) where { - ?s a . - ?s ?o . - $filterClause - } - GROUP BY ?o - ORDER BY DESC(?count)"); + $query = [ + 'index' => env('ELASTICSEARCH_INDEX'), + 'body' => [ + 'size' => 0, + 'aggs' => [ + "subjects" => [ + "nested" => [ "path" => "subject" ], + "aggs" => [ + "subjects" => [ + "terms" => [ + "field" => "subject.label_code", + "size" => $limit * ($index+1), + "order" => [ $order_field => $order_dir ] + ] + ] + ] + ] + ] + ] + ]; - $docs = $this->sparqlClient->query($query); + $esRes = Es::search($query); $themes = []; - $labels = []; - $bnfUris = []; - $lexvoUris = []; + $bucketList = array_slice($esRes['aggregations']['subjects']['subjects']['buckets'], $index*$limit, $limit); - foreach ($docs as $row) { - $key = ""; - $label = null; - if($row->theme instanceof Resource) { - $key = $row->theme->getUri(); - if($resolve && strpos($key, config('corpusparole.bnf_ark_base_url')) === 0) { - array_push($bnfUris, $key); - } - elseif($resolve && strpos($key, config('corpusparole.lexvo_base_url')) === 0) { - array_push($lexvoUris, $key); - } - $label = null; - } - elseif($row->theme instanceof Literal) { - $key = $row->theme->getValue(); - $label = $row->theme->getValue(); - } - - $themes[$key] = [ + foreach($bucketList as $bucket) { + $parts = explode("|", $bucket['key']); + $label = $parts[0]; + $url = config('corpusparole.bnf_ark_base_url').$parts[1]; + $themes[$url] = [ "label" => $label, - "count" => $row->count->getValue() + "count" => $bucket['doc_count'] ]; } - if($resolve) { - if(count($lexvoUris) > 0) { - $labels = $this->lexvoResolver->getNames($lexvoUris); - } - if(count($bnfUris) > 0) { - $labels = array_merge($labels, $this->bnfResolver->getLabels($bnfUris)); - } - foreach ($themes as $themeKey => $themeDef) { - if(array_key_exists($themeKey, $labels)) { - $themeDef['label'] = $labels[$themeKey]; - } - $themes[$themeKey] = $themeDef; - } - } - return response()->json(['themes' => $themes ]); }