server/src/app/Http/Controllers/Api/DateStatsController.php
author ymh <ymh.work@gmail.com>
Tue, 15 Nov 2016 17:42:57 +0100
changeset 424 feb0d3e0fef9
parent 407 2dba812c7ef2
child 425 f99435a7006e
permissions -rw-r--r--
add dynamic date range calculation for dates, and add color gradient component, add color gradient for language and chrono

<?php

namespace CorpusParole\Http\Controllers\Api;

use Illuminate\Http\Request;
use Log;
use Es;

use CorpusParole\Http\Controllers\Controller;
use CorpusParole\Libraries\Filters\CorpusFilterManager;


class DateStatsController extends Controller
{
    private function getStatQuery($query) {
        return [
            'index' => config('elasticsearch.index'),
            'body' => [
                "size" => 0,
                "query" => $query,
                "aggs" => [
                    "datestats" => [
                        "nested"=> [
                            "path" => "creation_years"
                        ],
                        "aggs" => [
                            "years" => [
                                "terms"=> [
                                    "field" => "creation_years.year",
                                    "size" => 2147483647,
                                    "order" => [
                                        "_term" => "asc"
                                    ]
                                ],
                                "aggs" => [
                                    "year_count" => [
                                        "sum" => [
                                            "field" => "creation_years.weight"
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ];
    }

    private function getMinMaxQuery($query) {
        return [
            'index' => config('elasticsearch.index'),
            'body' => [
                "size" => 0,
                "query" => $query,
                "aggs" => [
                    "datestats" => [
                        "nested"=> [
                            "path" => "creation_years"
                        ],
                        "aggs" => [
                            "minyear" => [
                                "min" => [ "field"=> "creation_years.year" ]
                            ],
                            "maxyear" => [
                                "max" => [ "field"=> "creation_years.year" ]
                            ]
                        ]
                    ]
                ]
            ]
        ];
    }

    private function getDocQuery(Request $request) {
        $filterManager = new CorpusFilterManager();
        $filters = $filterManager->prepareFilters($request);
        unset($filters['dates']);
        $qFilterParts = $filterManager->buildESFilters($filters);

        return $filterManager->buildQuery($qFilterParts);
    }

    /**
     * Display the min max date stats
     */
    public function minmax(Request $request) {
        $query = $this->getDocQuery($request);

        $esQuery = $this->getMinMaxQuery($query);
        $esRes = Es::search($esQuery);

        $datestats = [];

        $max = intval($esRes['aggregations']['datestats']['maxyear']['value']);
        $min = intval($esRes['aggregations']['datestats']['maxyear']['value']);

        return response()->json(['dateminmax' => [ $min, $max ] ]);
    }

    /**
     * Display the dates stats
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {

        $query = $this->getDocQuery($request);

        $esQuery = $this->getStatQuery($query);
        $esRes = Es::search($esQuery);

        $datestats = [];

        foreach($esRes['aggregations']['datestats']['years']['buckets'] as $bucket) {
            $c = round($bucket['year_count']['value']);
            if($c > 0) {
                $datestats[(string)($bucket['key'])] = $c;
            }
        }

        return response()->json(['datestats' => $datestats ]);
    }

}