xquery version "1.0";
declare namespace session="http://exist-db.org/xquery/session";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace i18n="http://apache.org/cocoon/i18n/2.1";
import module namespace ristenutil="http://www.risten.no/shared/util" at "../xquery/ristenutil.xqm";
import module namespace buildquery="http://www.risten.no/shared/xqueryfactory" at "../xquery/xqueryfactory.xqm";
declare option exist:serialize "expand-xincludes=no";
declare function local:filter-expr($entry as xs:string, $lang as xs:string)
as xs:string
{
let $infl := request:get-parameter("infl", "")
let $expr := if ($infl = "all") then
concat ("//entry[matches(@id, '", $entry ,"')]" )
else if ($entry = "*" or string-length($entry) = 0) then
concat ("//entry[infl/@lexc &= '", $infl, "']")
else
concat ("//entry[infl/@lexc &= '", $infl, "'][matches(@id, '", $entry ,"')]")
return $expr
};
declare function local:build-query($entry as xs:string, $lang as xs:string)
as xs:string
{
let $expr := local:filter-expr($entry, $lang),
$coll := ristenutil:get-collection()
return
if ($lang = "all") then
concat("for $r in doc('", $coll, "/termcenter.xml')",
$expr, "return $r")
else
let $doc := concat($coll, "/terms-", $lang, ".xml")
return
concat("for $r in doc('", $doc, "')",
$expr, "return $r")
};
(: Present an overview of query results :)
declare function local:displayHitlist($hits as node()+)
as element()
{
let $count := count($hits),
$maxp := request:get-parameter("howmany", "10"),
$max := if ($maxp eq "all") then $count else $maxp cast as xs:int,
$start := request:get-parameter("start", "1") cast as xs:int,
$end := if ($start + $max - 1 < $count) then $start + $max - 1 else $count,
$lang := string-join(request:get-parameter("showlang","all"), ' '),
$collID:= session:get-attribute("collection"),
$hyph := request:get-parameter("showhyph", "no")
return
Your query has timed out, or was too unspecific. Please hit the «Find» button again, or enter a new search query.
else if ($term = "*" and $infl = "all") thenSorry, you cannot search for the whole db. Please enter a slightly more specific search - adding one character is enough.
else let $doc := ristenutil:get-doc($collID,$lang), $query := local:build-query($term, $lang), $hits := util:eval( $query ), $s := session:set-attribute("results", $hits), $t := session:set-attribute("query", $query) return if (empty($hits)) then (
Document: «{$doc}»
Query: «{$query}»
Document: «{$doc}»
Request: «{$request}»
Query: «{$query}»