diff -r 3fccf43160a7 -r 07b44a378ad8 server/src/app/Http/Controllers/Api/DateStatsController.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/src/app/Http/Controllers/Api/DateStatsController.php Fri Sep 30 00:43:04 2016 +0200 @@ -0,0 +1,126 @@ +sparqlClient = $sparqlClient; + } + + /** + * Display the specified resource. + * + * @return \Illuminate\Http\Response + */ + public function index(Request $request) + { + $query = preg_replace('/\s+/', ' ', "SELECT (?d as ?date) (COUNT(?d) AS ?count) + WHERE { + ?_ a . + ?_ ?d + } + GROUP BY ?d + ORDER BY ?d"); + + $res = $this->sparqlClient->query($query); + + $dates = []; + + foreach ($res as $row) { + + $count = intval($row->count->getValue()); + $date = $row->date; + $dateType = $date->getDatatypeUri(); + + $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); + } + + $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); + } + + ksort($dates); + + return response()->json(['datestats' => $dates ]); + } + + 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 ]; + } + } + + +}