Implement flexible fake backend

Change-Id: Icff0d3b8e1a82c7e459dfac6417f59502f0eb099
diff --git a/t/fixtures/query_backend.pl b/t/fixtures/fake_backend.pl
similarity index 80%
rename from t/fixtures/query_backend.pl
rename to t/fixtures/fake_backend.pl
index a1d3908..73b4561 100644
--- a/t/fixtures/query_backend.pl
+++ b/t/fixtures/fake_backend.pl
@@ -6,11 +6,13 @@
 use strict;
 use warnings;
 use Mojo::JWT;
-use Mojo::File;
+use Mojo::File qw/path/;
+use Mojo::Util qw/slugify/;
 
 # This is an API fake server with fixtures
 
 my $secret = 's3cr3t';
+my $fixture_path = path(Mojo::File->new(__FILE__)->dirname);
 
 helper jwt_encode => sub {
   shift;
@@ -29,9 +31,27 @@
 };
 
 
+# Load fixture responses
+helper 'load_response' => sub {
+  my $c = shift;
+  my $q_name = shift;
+  my $file = $fixture_path->child("response_$q_name.json");
+  unless (-f $file) {
+    return {
+      status => 500,
+      json => {
+        errors => [[0, 'Unable to load query response from ' . $file]]
+      }
+    }
+  };
+  my $response = $file->slurp;
+  return decode_json($response);
+};
+
+
 # Base page
 get '/' => sub {
-  shift->render(text => 'Query fake server available');
+  shift->render(text => 'Fake server available');
 };
 
 # Search fixtures
@@ -54,54 +74,28 @@
       });
   };
 
-  if ($v->param('q')) {
-
-    my $q = $v->param('q');
-
-    # Response q=server_fail
-    if ($q eq 'server_fail') {
-      return $c->render(
-        status => 500,
-        inline => 'Oooops'
-      );
-    }
-
-    # Response q=[orth=das
-    if ($q eq '[orth=das') {
-      return $c->render(
-        status => 400,
-        json => {
-          "\@context" => "http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
-          "errors" => [
-            [302,"Parantheses/brackets unbalanced.",0],
-            [302,"Could not parse query >>> [orth=das <<<."]
-          ]
-        }
-      );
-    }
+  if (!$v->param('q')) {
+    return $c->render(%{$c->load_response('no_query')});
   };
 
-  my $response = decode_json(
-    Mojo::File->new(__FILE__)->parent->child('response_baum.jsonld')
-    );
-
+  # Get response based on query parameter
+  my $response = $c->load_response(slugify($v->param('q')));
 
   # Check authentification
   if (my $auth = $c->req->headers->header('Authorization')) {
     if (my $jwt = $c->jwt_decode($auth)) {
-      $response->{meta}->{authorized} = $jwt->{username} if $jwt->{username};
+      $response->{json}->{meta}->{authorized} = $jwt->{username} if $jwt->{username};
     };
   };
 
+  # Set page parameter
   if ($v->param('page')) {
-    $response->{meta}->{startIndex} = $v->param("startIndex");
+    $response->{json}->{meta}->{startIndex} = $v->param("startIndex");
   };
 
 
   # Simple search fixture
-  return $c->render(
-    json => $response
-  );
+  return $c->render(%$response);
 };
 
 
diff --git a/t/fixtures/response_baum.json b/t/fixtures/response_baum.json
new file mode 100644
index 0000000..3ad2ae3
--- /dev/null
+++ b/t/fixtures/response_baum.json
@@ -0,0 +1,76 @@
+{
+  "status" : 200,
+  "json" : {
+    "@context" : "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
+    "meta" :  {
+      "count" : 25,
+      "startIndex" : 0,
+      "authorized" : null,
+      "timeout" : 120000,
+      "context" : {
+        "left" : ["token",40],
+        "right" : ["token",40]
+      },
+      "fields" : ["pubDate","subTitle","author","pubPlace","title","textSigle","UID","ID","layerInfos","corpusSigle","docSigle","corpusID","textClass"],
+      "version" : "0.55.7",
+      "benchmark" : "0.120577834 s",
+      "totalResults" : 51,
+      "serialQuery" : "tokens:s:Baum",
+      "itemsPerPage" : 25
+    },
+    "query" : {
+      "@type" : "koral:token",
+      "wrap" : {
+        "@type" : "koral:term",
+        "layer" : "orth",
+        "key" : "Baum",
+        "match" : "match:eq",
+        "foundry" : "opennlp",
+        "rewrites" : [
+          {
+            "@type" : "koral:rewrite",
+            "src" : "Kustvakt",
+            "operation" : "operation:injection",
+            "scope" : "foundry"
+          }
+        ]
+      }
+    },
+    "matches" : [
+      {
+        "field" : "tokens",
+        "pubPlace" : "München",
+        "textSigle" : "GOE/AGI/00000",
+        "docSigle" : "GOE/AGI",
+        "corpusSigle" : "GOE",
+        "title" : "Italienische Reise",
+        "subTitle" : "Auch ich in Arkadien!",
+        "author" : "Goethe, Johann Wolfgang von",
+        "layerInfos" : "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
+        "startMore" : true,
+        "endMore" : true,
+        "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>sie etwas bedeuten zu wollen und machte mit der Oberlippe eine fatale Miene. ich sprach sehr viel mit ihr durch, sie war überall zu Hause und merkte gut auf die Gegenstände. so fragte sie mich einmal, was das für ein </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen Baum unterscheiden könne<span class=\"more\"></span></span>",
+        "matchID" : "match-GOE/AGI/00000-p2030-2031",
+        "UID" : 0,
+        "pubDate" : "1982"
+      },
+      {
+        "field" : "tokens",
+        "pubPlace" : "München",
+        "textSigle" : "GOE/AGI/00000",
+        "docSigle" : "GOE/AGI",
+        "corpusSigle" : "GOE",
+        "title" : "Italienische Reise",
+        "subTitle" : "Auch ich in Arkadien!",
+        "author" : "Goethe, Johann Wolfgang von",
+        "layerInfos" : "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
+        "startMore" : true,
+        "endMore" : true,
+        "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>für ein Baum sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> unterscheiden könne. sie gehe, sagte sie, nach Bozen auf die Messe, wo ich doch wahrscheinlich auch hinzöge. wenn sie mich dort anträfe, müsse ich ihr einen Jahrmarkt kaufen, welches ich ihr denn auch versprach. dort wollte sie auch ihre neue<span class=\"more\"></span></span>",
+        "matchID" : "match-GOE/AGI/00000-p2068-2069",
+        "UID" : 0,
+        "pubDate" : "1982"
+      }
+    ]
+  }
+}
diff --git a/t/fixtures/response_baum.jsonld b/t/fixtures/response_baum.jsonld
deleted file mode 100644
index e401fd1..0000000
--- a/t/fixtures/response_baum.jsonld
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "@context" : "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
-  "meta" :  {
-    "count" : 25,
-    "startIndex" : 0,
-    "authorized" : undef,
-    "timeout" : 120000,
-    "context" : {
-      "left" : ["token",40],
-      "right" : ["token",40]
-    },
-    "fields" : ["pubDate","subTitle","author","pubPlace","title","textSigle","UID","ID","layerInfos","corpusSigle","docSigle","corpusID","textClass"],
-    "version" : "0.55.7",
-    "benchmark" : "0.120577834 s",
-    "totalResults" : 51,
-    "serialQuery" : "tokens:s:Baum",
-    "itemsPerPage" : 25
-    },
-  "query" : {
-    "@type" : "koral:token",
-    "wrap" : {
-      "@type" : "koral:term",
-      "layer" : "orth",
-      "key" : "Baum",
-      "match" : "match:eq",
-      "foundry" : "opennlp",
-      "rewrites" : [
-        {
-          "@type" : "koral:rewrite",
-          "src" : "Kustvakt",
-          "operation" : "operation:injection",
-          "scope" : "foundry"
-        }
-      ]
-      }
-  },
-  "matches" : [
-    {
-      "field" : "tokens",
-        "pubPlace" : "München",
-      "textSigle" : "GOE/AGI/00000",
-      "docSigle" : "GOE/AGI",
-      "corpusSigle" : "GOE",
-      "title" : "Italienische Reise",
-      "subTitle" : "Auch ich in Arkadien!",
-      "author" : "Goethe, Johann Wolfgang von",
-      "layerInfos" : "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
-      "startMore" : true,
-      "endMore" : true,
-      "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>sie etwas bedeuten zu wollen und machte mit der Oberlippe eine fatale Miene. ich sprach sehr viel mit ihr durch, sie war überall zu Hause und merkte gut auf die Gegenstände. so fragte sie mich einmal, was das für ein </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen Baum unterscheiden könne<span class=\"more\"></span></span>",
-      "matchID" : "match-GOE/AGI/00000-p2030-2031",
-      "UID" : 0,
-      "pubDate" : "1982"
-    },
-    {
-      "field" : "tokens",
-      "pubPlace" : "München",
-      "textSigle" : "GOE/AGI/00000",
-      "docSigle" : "GOE/AGI",
-      "corpusSigle" : "GOE",
-      "title" : "Italienische Reise",
-      "subTitle" : "Auch ich in Arkadien!",
-      "author" : "Goethe, Johann Wolfgang von",
-      "layerInfos" : "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
-      "startMore" : true,
-      "endMore" : true,
-      "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>für ein Baum sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> unterscheiden könne. sie gehe, sagte sie, nach Bozen auf die Messe, wo ich doch wahrscheinlich auch hinzöge. wenn sie mich dort anträfe, müsse ich ihr einen Jahrmarkt kaufen, welches ich ihr denn auch versprach. dort wollte sie auch ihre neue<span class=\"more\"></span></span>",
-      "matchID" : "match-GOE/AGI/00000-p2068-2069",
-      "UID" : 0,
-      "pubDate" : "1982"
-    }
-  ]
-}
diff --git a/t/fixtures/response_no_query.json b/t/fixtures/response_no_query.json
new file mode 100644
index 0000000..5f75741
--- /dev/null
+++ b/t/fixtures/response_no_query.json
@@ -0,0 +1,9 @@
+{
+  "status" : 400,
+  "@context" : "http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
+  "errors":[
+    [
+      301,"You did not specify a query!"
+    ]
+  ]
+}
diff --git a/t/fixtures/response_orthdas.json b/t/fixtures/response_orthdas.json
new file mode 100644
index 0000000..b578412
--- /dev/null
+++ b/t/fixtures/response_orthdas.json
@@ -0,0 +1,11 @@
+{
+  "comment" : "q=[orth=das",
+  "status" : 400,
+  "json" : {
+    "@context" : "http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
+    "errors" : [
+      [302,"Parantheses/brackets unbalanced.",0],
+      [302,"Could not parse query >>> [orth=das <<<."]
+    ]
+  }
+}
diff --git a/t/fixtures/response_server_fail.json b/t/fixtures/response_server_fail.json
new file mode 100644
index 0000000..51be2cb
--- /dev/null
+++ b/t/fixtures/response_server_fail.json
@@ -0,0 +1,4 @@
+{
+  "status" : 500,
+  "inline" : "Oooops"
+}
diff --git a/t/fixtures/test_backend.pl b/t/fixtures/test_backend.pl
deleted file mode 100644
index ce8af5f..0000000
--- a/t/fixtures/test_backend.pl
+++ /dev/null
@@ -1,347 +0,0 @@
-#!/usr/bin/env perl
-use Mojolicious::Lite;
-use Mojo::ByteStream 'b';
-use Mojo::Date;
-use Mojo::JSON qw/true false encode_json/;
-use strict;
-use warnings;
-use Mojo::JWT;
-
-# This is an API fake server with fixtures
-
-# TODO: Test the fake server
-
-my $secret = 's3cr3t';
-
-helper jwt_encode => sub {
-  shift;
-  return Mojo::JWT->new(
-    secret => $secret,
-    token_type => 'api_token',
-    expires => time + (3 * 34 * 60 * 60),
-    claims => { @_ }
-  );
-};
-
-helper jwt_decode => sub {
-  my ($c, $auth) = @_;
-  $auth =~ s/\s*api_token\s+//;
-  return Mojo::JWT->new(secret => $secret)->decode($auth);
-};
-
-
-# Base page
-get '/' => sub {
-  shift->render(text => 'Fake server available');
-};
-
-
-# Search fixtures
-get '/search' => sub {
-  my $c = shift;
-  my $v = $c->validation;
-  $v->optional('q');
-  $v->optional('page');
-  $v->optional('ql');
-  $v->optional('count');
-  $v->optional('context');
-
-  # Check for Baum
-  my $response = {
-    "\@context" => "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld",
-    "meta" => {
-      "count" => 25,
-      "startIndex" => 0,
-      "authorized" => undef,
-      "timeout" => 120000,
-      "context" => {
-        "left" => ["token",40],
-        "right" => ["token",40]
-      },
-      "fields" => ["pubDate","subTitle","author","pubPlace","title","textSigle","UID","ID","layerInfos","corpusSigle","docSigle","corpusID","textClass"],
-      "version" => "0.55.7",
-      "benchmark" => "0.120577834 s",
-      "totalResults" => 51,
-      "serialQuery" => "tokens:s:Baum",
-      "itemsPerPage" => 25
-    },
-    "query" => {
-      "\@type" => "koral:token",
-      "wrap" => {
-        "\@type" => "koral:term",
-        "layer" => "orth",
-        "key" => "Baum",
-        "match" => "match:eq",
-        "foundry" => "opennlp",
-        "rewrites" => [
-          {
-              "\@type" => "koral:rewrite",
-              "src" => "Kustvakt",
-              "operation" => "operation:injection",
-              "scope" => "foundry"
-            }
-        ]
-      }
-    },
-    "matches" => [
-      {
-        "field" => "tokens",
-        "pubPlace" => "München",
-        "textSigle" => "GOE/AGI/00000",
-        "docSigle" => "GOE/AGI",
-        "corpusSigle" => "GOE",
-        "title" => "Italienische Reise",
-        "subTitle" => "Auch ich in Arkadien!",
-        "author" => "Goethe, Johann Wolfgang von",
-        "layerInfos" => "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
-        "startMore" => true,
-        "endMore" => true,
-        "snippet" => "<span class=\"context-left\"><span class=\"more\"></span>sie etwas bedeuten zu wollen und machte mit der Oberlippe eine fatale Miene. ich sprach sehr viel mit ihr durch, sie war überall zu Hause und merkte gut auf die Gegenstände. so fragte sie mich einmal, was das für ein </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen Baum unterscheiden könne<span class=\"more\"></span></span>",
-        "matchID" => "match-GOE/AGI/00000-p2030-2031",
-        "UID" => 0,
-        "pubDate" => "1982"
-      },
-      {
-        "field" => "tokens",
-        "pubPlace" => "München",
-        "textSigle" => "GOE/AGI/00000",
-        "docSigle" => "GOE/AGI",
-        "corpusSigle" => "GOE",
-        "title" => "Italienische Reise",
-        "subTitle" => "Auch ich in Arkadien!",
-        "author" => "Goethe, Johann Wolfgang von",
-        "layerInfos" => "base/s=spans corenlp/c=spans corenlp/p=tokens corenlp/s=spans dereko/s=spans malt/d=rels mdp/d=rels opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans",
-        "startMore" => true,
-        "endMore" => true,
-        "snippet" => "<span class=\"context-left\"><span class=\"more\"></span>für ein Baum sei. es war ein schöner großer Ahorn, der erste, der mir auf der ganzen Reise zu Gesichte kam. den hatte sie doch gleich bemerkt und freute sich, da mehrere nach und nach erschienen, daß sie auch diesen </span><span class=\"match\"><mark>Baum</mark></span><span class=\"context-right\"> unterscheiden könne. sie gehe, sagte sie, nach Bozen auf die Messe, wo ich doch wahrscheinlich auch hinzöge. wenn sie mich dort anträfe, müsse ich ihr einen Jahrmarkt kaufen, welches ich ihr denn auch versprach. dort wollte sie auch ihre neue<span class=\"more\"></span></span>",
-        "matchID" => "match-GOE/AGI/00000-p2068-2069",
-        "UID" => 0,
-        "pubDate" => "1982"
-      }
-    ]
-  };
-
-  # Error responses:
-  if ($v->param('ql') && $v->param('ql') eq 'cosmas3') {
-    return $c->render(json => {
-      errors => [[101,"No entity found for id","test_h"]]
-    });
-  };
-
-  if ($v->param('q')) {
-    if ($v->param('q') eq 'server_fail') {
-      return $c->render(
-        status => 500,
-        inline => 'Oooops'
-      );
-    }
-    elsif ($v->param('q') eq '[orth=das') {
-      return $c->render(
-        status => 400,
-        json => {
-          "meta" => {
-            "count" => 13
-          },
-          "collection" => {
-            '@type' => "koral:docGroup",
-            "operation" => "operation:and",
-            "operands" => [
-              {
-                '@type' => "koral:doc",
-                "match" => "match:eq",
-                "type" => "type:regex",
-                "value" => "CC-BY.*",
-                "key" => "availability"
-              },
-              {
-                "operands" => [
-                  {
-                    '@type' => "koral:doc",
-                    "match" => "match:eq",
-                    "value" => "WPD",
-                    "key" => "corpusSigle"
-                  },
-                  {
-                    '@type' => "koral:doc",
-                    "match" => "match:eq",
-                    "value" => "GOE",
-                    "key" => "corpusSigle"
-                  }
-                ],
-                '@type' => "koral:docGroup",
-                "operation" => "operation:or"
-              }
-            ],
-            "rewrites" => [
-              {
-                '@type' => "koral:rewrite",
-                "src" => "Kustvakt",
-                "operation" => "operation:insertion",
-                "scope" => "availability(FREE)"
-              }
-            ]
-          },
-          '@context' => "http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
-          "errors" => [
-            [302,"Parantheses/brackets unbalanced.",0],
-            [302,"Could not parse query >>> [orth=der <<<."]
-          ]
-        }
-      );
-    }
-  };
-
-  if (my $auth = $c->req->headers->header('Authorization')) {
-    if (my $jwt = $c->jwt_decode($auth)) {
-      $response->{meta}->{authorized} = $jwt->{username} if $jwt->{username};
-    };
-  };
-
-  if ($v->param('page')) {
-    $response->{meta}->{startIndex} = $v->param("startIndex");
-  };
-
-
-  # Simple search fixture
-  return $c->render(
-    json => $response
-  );
-};
-
-
-
-############
-# Auth API #
-############
-
-# Request API token
-get '/auth/logout' => sub {
-  my $c = shift;
-
-  if (my $auth = $c->req->headers->header('Authorization')) {
-    if (my $jwt = $c->jwt_decode($auth)) {
-      my $user = $jwt->{username} if $jwt->{username};
-
-      $c->app->log->debug('Server-Logout: ' . $user);
-      return $c->render(json => { msg => [[0, 'Fine!']]});
-    };
-  };
-
-  return $c->render(status => 400, json => { error => [[0, 'No!']]});
-};
-
-
-# Request API token
-get '/auth/apiToken' => sub {
-  my $c = shift;
-
-  # Get auth header
-  my $auth = $c->req->headers->authorization;
-
-  # Authorization missing or not basic
-  if (!$auth || $auth !~ s/\s*Basic\s+//gi) {
-    return $c->render(
-      json => {
-        error => [[2, 'x']]
-      }
-    );
-  };
-
-  # Decode header
-  my ($username, $pwd) = @{b($auth)->b64_decode->split(':')->to_array};
-
-  # the password is 'pass'
-  if ($pwd) {
-
-    # the password is 'pass'
-    if ($pwd eq 'pass') {
-
-      # Render info with token
-      my $jwt = $c->jwt_encode(username => $username);
-
-      # Render in the Kustvakt fashion:
-      return $c->render(
-        format => 'html',
-        text => encode_json({
-          %{$jwt->claims},
-          expires    => $jwt->expires,
-          token      => $jwt->encode,
-          token_type => 'api_token'
-        })
-      );
-    };
-
-    return $c->render(
-      json => {
-        error => [[2004, undef]]
-      }
-    );
-  };
-
-  return $c->render(
-    json => {
-      error => [[2004, undef]]
-    }
-  );
-};
-
-app->start;
-
-
-__END__
-
-
-  # Temporary:
-  my $collection_query = {
-    '@type' => "koral:docGroup",
-    "operation" => "operation:or",
-    "operands" => [
-      {
-	'@type' => "koral:docGroup",
-	"operation" => "operation:and",
-	"operands" => [
-	  {
-	    '@type' => "koral:doc",
-	    "key" => "title",
-	    "match" => "match:eq",
-	    "value" => "Der Birnbaum",
-	    "type" => "type:string"
-	  },
-	  {
-	    '@type' => "koral:doc",
-	    "key" => "pubPlace",
-	    "match" => "match:eq",
-	    "value" => "Mannheim",
-	    "type" => "type:string"
-	  },
-	  {
-	    '@type' => "koral:docGroup",
-	    "operation" => "operation:or",
-	    "operands" => [
-	      {
-		'@type' => "koral:doc",
-		"key" => "subTitle",
-		"match" => "match:eq",
-		"value" => "Aufzucht oder Pflege",
-		"type" => "type:string"
-	      },
-	      {
-		'@type' => "koral:doc",
-		"key" => "subTitle",
-		"match" => "match:eq",
-		"value" => "Gedichte",
-		"type" => "type:string"
-	      }
-	    ]
-	  }
-	]
-      },
-      {
-	'@type' => "koral:doc",
-	"key" => "pubDate",
-	"match" => "match:geq",
-	"value" => "2015-03-05",
-	"type" => "type:date"
-      }
-    ]
-  };