server/src/app/Http/Controllers/Api/DateStatsController.php
changeset 375 145561ff51ff
parent 307 07b44a378ad8
child 377 52169c718513
--- a/server/src/app/Http/Controllers/Api/DateStatsController.php	Thu Oct 20 12:56:24 2016 +0530
+++ b/server/src/app/Http/Controllers/Api/DateStatsController.php	Thu Oct 20 11:24:45 2016 +0200
@@ -5,6 +5,7 @@
 // use CorpusParole\Http\Requests;
 use Illuminate\Http\Request;
 use Log;
+use Es;
 
 use CorpusParole\Libraries\Sparql\SparqlClient;
 
@@ -26,101 +27,50 @@
      */
     public function index(Request $request)
     {
-        $query =  preg_replace('/\s+/', ' ', "SELECT (?d as ?date) (COUNT(?d) AS ?count)
-            WHERE {
-                ?_ a <http://www.europeana.eu/schemas/edm/ProvidedCHO>.
-                ?_ <http://purl.org/dc/terms/created> ?d
-            }
-            GROUP BY ?d
-            ORDER BY ?d");
 
-        $res = $this->sparqlClient->query($query);
-
-        $dates = [];
-
-        foreach ($res as $row) {
+        $query = [ "match_all" => []];
 
-            $count = intval($row->count->getValue());
-            $date = $row->date;
-            $dateType = $date->getDatatypeUri();
+        $esQuery = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                "size" => 0,
+                "query" => $query,
+                "aggs" => [
+                    "datestats" => [
+                        "nested"=> [
+                            "path" => "creation_years"
+                        ],
+                        "aggs" => [
+                            "years" => [
+                                "terms"=> [
+                                    "field" => "creation_years.year",
+                                    "size" => 0,
+                                    "order" => [
+                                        "_term" => "asc"
+                                    ]
+                                ],
+                                "aggs" => [
+                                    "year_count" => [
+                                        "sum" => [
+                                            "field" => "creation_years.weight"
+                                        ]
+                                    ]
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
+        $esRes = Es::search($esQuery);
 
-            $processedDates = [];
-            if($dateType === "http://purl.org/dc/terms/Period") {
-                $processedDates = $this->processPeriod($date->getValue(), $count);
-            }
-            elseif($dateType === "http://purl.org/dc/terms/W3CDTF") {
-                $processedDates = $this->processDate($date->getValue(), $count);
-            }
+        $datestats = [];
 
-            $dates = array_reduce(array_keys($processedDates), function($datesArray, $item) use ($processedDates) {
-                if(!isset($datesArray[$item])) {
-                    $datesArray[$item] = 0;
-                }
-                $datesArray[$item] += $processedDates[$item];
-                return $datesArray;
-            }, $dates);
+        foreach($esRes['aggregations']['datestats']['years']['buckets'] as $bucket) {
+            $datestats[(string)($bucket['key'])] = round($bucket['year_count']['value']);
         }
 
-        ksort($dates);
-
-        return response()->json(['datestats' => $dates ]);
+        return response()->json(['datestats' => $datestats ]);
     }
 
-    private function extractYear($dateStr) {
-        if(preg_match("/^\\d{4}$/", $dateStr) === 1) {
-            $dateStr = "$dateStr-1-1";
-        }
-        $date = date_create($dateStr);
-        if($date === false ) {
-            Log::warning("DateStatsController:extractYear bad format for date $dateStr");
-        }
-        return $date?$date->format("Y"):false;
-    }
-
-    private function processPeriod($periodStr, $count) {
-        $start = null;
-        $end = null;
-        foreach(explode(";", $periodStr) as $elem) {
-            $elem = trim($elem);
-            if(strpos($elem, 'start=') === 0) {
-                $start = intval($this->extractYear(trim(substr($elem, 6))));
-                if($start === false) {
-                    return [];
-                }
-            } elseif(strpos($elem, 'end=') === 0) {
-                $end = intval($this->extractYear(trim(substr($elem, 4))));
-                if($end === false) {
-                    return [];
-                }
-            }
-        }
-
-        if(is_null($start) || is_null($end) || $start>$end ) {
-            // TODO: log problem
-            return [];
-        }
-
-        $res = [];
-        $mean = (int)($count/($end+1-$start));
-        $remains = $count%($end+1-$start);
-        for($d=$start; $d<=$end; $d++) {
-            $nb = $mean + ((($remains--)>0)?1:0);
-            if($nb !== 0) {
-                $res[strval($d)] = $nb;
-            }
-        }
-
-        return $res;
-    }
-
-    private function processDate($dateStr, $count) {
-        $date = $this->extractYear($dateStr);
-        if($date === false)  {
-            return [];
-        } else {
-            return [ $this->extractYear($dateStr) => $count ];
-        }
-    }
-
-
 }