server/src/app/Http/Controllers/Api/DateStatsController.php
author ymh <ymh.work@gmail.com>
Fri, 30 Sep 2016 00:43:04 +0200
changeset 307 07b44a378ad8
child 375 145561ff51ff
permissions -rw-r--r--
Add the datestats api
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
307
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
namespace CorpusParole\Http\Controllers\Api;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
// use CorpusParole\Http\Requests;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
use Illuminate\Http\Request;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
use Log;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
use CorpusParole\Libraries\Sparql\SparqlClient;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
use CorpusParole\Http\Controllers\Controller;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
class DateStatsController extends Controller
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
{
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    private $sparqlClient = null;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    public function __construct(SparqlClient $sparqlClient) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
        $this->sparqlClient = $sparqlClient;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    /**
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
     * Display the specified resource.
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
     *
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
     * @return \Illuminate\Http\Response
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
     */
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    public function index(Request $request)
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        $query =  preg_replace('/\s+/', ' ', "SELECT (?d as ?date) (COUNT(?d) AS ?count)
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
            WHERE {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
                ?_ a <http://www.europeana.eu/schemas/edm/ProvidedCHO>.
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
                ?_ <http://purl.org/dc/terms/created> ?d
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
            }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
            GROUP BY ?d
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
            ORDER BY ?d");
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        $res = $this->sparqlClient->query($query);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        $dates = [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        foreach ($res as $row) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            $count = intval($row->count->getValue());
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
            $date = $row->date;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
            $dateType = $date->getDatatypeUri();
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
            $processedDates = [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
            if($dateType === "http://purl.org/dc/terms/Period") {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
                $processedDates = $this->processPeriod($date->getValue(), $count);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
            }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
            elseif($dateType === "http://purl.org/dc/terms/W3CDTF") {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
                $processedDates = $this->processDate($date->getValue(), $count);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
            }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            $dates = array_reduce(array_keys($processedDates), function($datesArray, $item) use ($processedDates) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
                if(!isset($datesArray[$item])) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
                    $datesArray[$item] = 0;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
                }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
                $datesArray[$item] += $processedDates[$item];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                return $datesArray;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            }, $dates);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        ksort($dates);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        return response()->json(['datestats' => $dates ]);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    private function extractYear($dateStr) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        if(preg_match("/^\\d{4}$/", $dateStr) === 1) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            $dateStr = "$dateStr-1-1";
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        $date = date_create($dateStr);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        if($date === false ) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            Log::warning("DateStatsController:extractYear bad format for date $dateStr");
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        return $date?$date->format("Y"):false;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    private function processPeriod($periodStr, $count) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        $start = null;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        $end = null;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        foreach(explode(";", $periodStr) as $elem) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
            $elem = trim($elem);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
            if(strpos($elem, 'start=') === 0) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                $start = intval($this->extractYear(trim(substr($elem, 6))));
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
                if($start === false) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                    return [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
                }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
            } elseif(strpos($elem, 'end=') === 0) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
                $end = intval($this->extractYear(trim(substr($elem, 4))));
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
                if($end === false) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
                    return [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
                }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        if(is_null($start) || is_null($end) || $start>$end ) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            // TODO: log problem
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
            return [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
        $res = [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        $mean = (int)($count/($end+1-$start));
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        $remains = $count%($end+1-$start);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        for($d=$start; $d<=$end; $d++) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
            $nb = $mean + ((($remains--)>0)?1:0);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
            if($nb !== 0) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
                $res[strval($d)] = $nb;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
            }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        return $res;
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    private function processDate($dateStr, $count) {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        $date = $this->extractYear($dateStr);
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        if($date === false)  {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
            return [];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        } else {
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
            return [ $this->extractYear($dateStr) => $count ];
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    }
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
07b44a378ad8 Add the datestats api
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
}