--- a/server/src/app/Http/Controllers/Api/ThemeController.php Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Http/Controllers/Api/ThemeController.php Sun Oct 16 23:19:57 2016 +0530
@@ -10,6 +10,9 @@
use EasyRdf\Resource;
use EasyRdf\Literal;
+use Es;
+use Log;
+
use CorpusParole\Libraries\Sparql\SparqlClient;
use CorpusParole\Services\LexvoResolverInterface;
use CorpusParole\Services\BnfResolverInterface;
@@ -33,77 +36,93 @@
public function index(Request $request)
{
$filter = $request->input('filter', 'bnf');
- $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN);
-
- $filterClause = "";
+ $index = $request->input('index', 0);
+ $limit = $request->input('limit', config('corpusparole.theme_default_limit'));
+ $sort = $request->input('sort', 'count');
if($filter === 'bnf') {
- $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .";
+ $include = ".*\\|bnf\\|.*";
+ }
+ elseif($filter === 'lexvo') {
+ $include = ".*\\|lxv\\|.*";
}
- elseif($filter === 'uri') {
- $filterClause = "FILTER isIRI(?o) .";
+ elseif($filter === 'olac') {
+ $include = ".*\\|olac\\|.*";
}
- elseif($filter === 'all' || $filter === 'none' || $filter === '') {
- $filterClause = "";
+ elseif($filter === 'txt') {
+ $include = ".*\\|txt\\|.*";
+ }
+ elseif($filter === 'all') {
+ $include = false;
}
else {
- abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'");
+ 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";
}
- $query = preg_replace('/\s+/', ' ',
- "select (?o as ?theme) (COUNT(?s) as ?count) where {
- ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
- ?s <http://purl.org/dc/elements/1.1/subject> ?o .
- $filterClause
- }
- GROUP BY ?o
- ORDER BY DESC(?count)");
+ $query = [
+ 'index' => env('ELASTICSEARCH_INDEX'),
+ 'body' => [
+ 'size' => 0,
+ 'aggs' => [
+ "subjects" => [
+ "nested" => [ "path" => "subject" ],
+ "aggs" => [
+ "subjects" => [
+ "terms" => [
+ "field" => "subject.label_code",
+ "size" => $limit * ($index+1),
+ "order" => [ $order_field => $order_dir ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ];
- $docs = $this->sparqlClient->query($query);
+ if($include) {
+ $query['body']['aggs']['subjects']['aggs']['subjects']['terms']['include'] = $include;
+ }
+
+ $esRes = Es::search($query);
$themes = [];
- $labels = [];
- $bnfUris = [];
- $lexvoUris = [];
-
- foreach ($docs as $row) {
- $key = "";
- $label = null;
- if($row->theme instanceof Resource) {
- $key = $row->theme->getUri();
- if($resolve && strpos($key, config('corpusparole.bnf_ark_base_url')) === 0) {
- array_push($bnfUris, $key);
- }
- elseif($resolve && strpos($key, config('corpusparole.lexvo_base_url')) === 0) {
- array_push($lexvoUris, $key);
- }
- $label = null;
- }
- elseif($row->theme instanceof Literal) {
- $key = $row->theme->getValue();
- $label = $row->theme->getValue();
- }
-
- $themes[$key] = [
- "label" => $label,
- "count" => $row->count->getValue()
- ];
+ $bucketList = $esRes['aggregations']['subjects']['subjects']['buckets'];
+ if($limit > 0) {
+ $bucketList = array_slice($bucketList, $index*$limit, $limit);
}
- if($resolve) {
- if(count($lexvoUris) > 0) {
- $labels = $this->lexvoResolver->getNames($lexvoUris);
- }
- if(count($bnfUris) > 0) {
- $labels = array_merge($labels, $this->bnfResolver->getLabels($bnfUris));
+ 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];
}
- foreach ($themes as $themeKey => $themeDef) {
- if(array_key_exists($themeKey, $labels)) {
- $themeDef['label'] = $labels[$themeKey];
- }
- $themes[$themeKey] = $themeDef;
+ else {
+ $url = $parts[2];
}
+ $themes[$url] = [
+ "label" => $label,
+ "count" => $bucket['doc_count']
+ ];
}
return response()->json(['themes' => $themes ]);