server/src/app/Http/Controllers/Api/ThemeController.php
changeset 339 766af1228b05
parent 323 47f0611cc57d
child 377 52169c718513
--- 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 <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-            ?s <http://purl.org/dc/elements/1.1/subject> ?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 ]);