server/src/app/Http/Controllers/Api/ThemeController.php
changeset 321 aefaad270b9b
parent 158 366509ae2f37
child 322 084aae09edf4
--- 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 <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);
+        $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 ]);
 
     }