server/src/app/Http/Controllers/Api/ThemeController.php
author ymh <ymh.work@gmail.com>
Tue, 20 Mar 2018 15:02:40 +0100
changeset 573 25f3d28f51b2
parent 474 245b4df137d3
permissions -rw-r--r--
Added tag 0.0.25 for changeset 190ae1dee68d

<?php

namespace CorpusParole\Http\Controllers\Api;

use CorpusParole\Http\Controllers\Controller;

use Illuminate\Http\Request;
use EasyRdf\Resource;
use EasyRdf\Literal;

use Es;
use Log;

use CorpusParole\Services\LexvoResolverInterface;
use CorpusParole\Services\BnfResolverInterface;
use CorpusParole\Libraries\Filters\CorpusFilterManager;


class ThemeController extends Controller
{
    public function __construct(LexvoResolverInterface $lexvoResolver, BnfResolverInterface $bnfResolver) {
        $this->lexvoResolver = $lexvoResolver;
        $this->bnfResolver = $bnfResolver;
    }

    /**
     * Display the specified resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $filter = $request->input('filter', 'bnf');
        $index = $request->input('index', 0);
        $limit = $request->input('limit', config('corpusparole.theme_default_limit'));
        $sort = $request->input('sort', 'count');

        if($filter === 'bnf') {
            $include = ".*\\|bnf\\|.*";
        }
        elseif($filter === 'lexvo') {
            $include = ".*\\|lxv\\|.*";
        }
        elseif($filter === 'olac') {
            $include = ".*\\|olac\\|.*";
        }
        elseif($filter === 'txt') {
            $include = ".*\\|txt\\|.*";
        }
        elseif($filter === 'all') {
            $include = false;
        }
        else {
            abort(401,"Value for filter parameter must be in 'bnf', 'lexvo', 'olac', 'txt', 'all'");
        }

        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";
        }

        $filterManager = new CorpusFilterManager();
        $filters = $filterManager->prepareFilters($request);
        //unset($filters['themes']);
        $qFilterParts = $filterManager->buildESFilters($filters);
        $query = $filterManager->buildQuery($qFilterParts);

        $termSize = $limit * ($index+1);
        $esQuery = [
            'index' => config('elasticsearch.index'),
            'body' => [
                'size' => 0,
                'query' => $query,
                'aggs' => [
                    "subjects" => [
                        "nested" => [ "path" => "subject" ],
                        "aggs" => [
                            "subjects" => [
                                "terms" => [
                                    "field" => "subject.label_code",
                                    "size" => ($termSize==0)?2147483647:$termSize,
                                    "order" => [ $order_field => $order_dir ]
                                ]
                            ],
                            "subjects_count" => [
                                "cardinality" => [
                                    "field" => "subject.label_code"
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ];

        if($include) {
            $esQuery['body']['aggs']['subjects']['aggs']['subjects']['terms']['include'] = $include;
        }

        $esRes = Es::search($esQuery);

        $themes = [];

        $bucketList = $esRes['aggregations']['subjects']['subjects']['buckets'];
        if($limit > 0) {
            $bucketList = array_slice($bucketList, $index*$limit, $limit);
        }

        foreach($bucketList as $bucket) {
            $parts = explode("|", $bucket['key']);
            $label = $parts[0];
            if($parts[1] === 'bnf' || $parts[1] === 'lxv') {
                $url = ['bnf' => config('corpusparole.bnf_ark_base_url'), 'lxv' => config('corpusparole.lexvo_base_url')][$parts[1]].$parts[2];
            }
            else {
                $url = $parts[2];
            }
            $themes[$url] = [
                "label" => $label,
                "count" => $bucket['doc_count']
            ];
        }

        return response()->json(['themes' => $themes, 'meta' => [ 'total' => $esRes['aggregations']['subjects']['subjects_count']['value']] ]);

    }

}