diff -r 4a3899b6a7ed -r 766af1228b05 server/src/app/Http/Controllers/Api/ThemeController.php --- a/server/src/app/Http/Controllers/Api/ThemeController.php Sun Oct 16 22:23:31 2016 +0530 +++ b/server/src/app/Http/Controllers/Api/ThemeController.php Sun Oct 16 23:19:57 2016 +0530 @@ -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; @@ -33,77 +36,93 @@ public function index(Request $request) { $filter = $request->input('filter', 'bnf'); - $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN); - - $filterClause = ""; + $index = $request->input('index', 0); + $limit = $request->input('limit', config('corpusparole.theme_default_limit')); + $sort = $request->input('sort', 'count'); if($filter === 'bnf') { - $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) ."; + $include = ".*\\|bnf\\|.*"; + } + elseif($filter === 'lexvo') { + $include = ".*\\|lxv\\|.*"; } - elseif($filter === 'uri') { - $filterClause = "FILTER isIRI(?o) ."; + elseif($filter === 'olac') { + $include = ".*\\|olac\\|.*"; } - elseif($filter === 'all' || $filter === 'none' || $filter === '') { - $filterClause = ""; + elseif($filter === 'txt') { + $include = ".*\\|txt\\|.*"; + } + elseif($filter === 'all') { + $include = false; } else { - abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'"); + abort(401,"Value for filter parameter must be in 'bnf', 'lexvo', 'olac', 'txt', 'all'"); + } + + 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); + if($include) { + $query['body']['aggs']['subjects']['aggs']['subjects']['terms']['include'] = $include; + } + + $esRes = Es::search($query); $themes = []; - $labels = []; - $bnfUris = []; - $lexvoUris = []; - - 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] = [ - "label" => $label, - "count" => $row->count->getValue() - ]; + $bucketList = $esRes['aggregations']['subjects']['subjects']['buckets']; + if($limit > 0) { + $bucketList = array_slice($bucketList, $index*$limit, $limit); } - if($resolve) { - if(count($lexvoUris) > 0) { - $labels = $this->lexvoResolver->getNames($lexvoUris); - } - if(count($bnfUris) > 0) { - $labels = array_merge($labels, $this->bnfResolver->getLabels($bnfUris)); + foreach($bucketList as $bucket) { + $parts = explode("|", $bucket['key']); + $label = $parts[0]; + if($parts[1] === 'bnf' || $parts[1] === 'lxv') { + $url = ['bnf' => config('corpusparole.bnf_ark_base_url'), 'lxv' => config('corpusparole.lexvo_base_url')][$parts[1]].$parts[2]; } - foreach ($themes as $themeKey => $themeDef) { - if(array_key_exists($themeKey, $labels)) { - $themeDef['label'] = $labels[$themeKey]; - } - $themes[$themeKey] = $themeDef; + else { + $url = $parts[2]; } + $themes[$url] = [ + "label" => $label, + "count" => $bucket['doc_count'] + ]; } return response()->json(['themes' => $themes ]);