xquery version "1.0"; declare option exist:serialize "expand-xincludes=no"; 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"; (: Map query field parameter to xpath selection :) declare function local:query-field($field as xs:string) as xs:string { if ($field = "head") then "./@id" else if ($field = "def") then "senses/sense/def" else "." }; (: Create filter expression from query term, field and mode, and add a classification filter if specified :) declare function local:filter-expr($term as xs:string, $field as xs:string, $mode as xs:string) as xs:string { let $f := local:query-field($field), $t := concat("'", $term, "'"), $t2 := replace($term,"\?",".?"), $t3 := replace($t2,"\*",".*"), $t4 := replace($t3,"\(","\("), $t5 := replace($t4,"\)","\)"), $ttrad := concat("'^", $t5, "$'") let $termsearch := if ($mode = "trad") then concat("matches(", $f, ", ", $ttrad, ")") else if ($mode = "near") then concat("near(", $f, ", ", $t, ")") else if ($mode = "exact") then concat($f, " = ", $t) else concat($f, " &= ", $t) return $termsearch }; (: Assemble the query string :) declare function local:build-query($srchcoll as xs:string, $srchlang as xs:string+, $class as xs:string, $term as xs:string, $orderby as xs:string) as xs:string { let $field := request:get-parameter("field", "any"), $mode := request:get-parameter("mode", "all"), $expr := local:filter-expr($term, $field, $mode), $collID := tokenize($srchcoll, '/')[last()] return if ($srchlang = "all") then let $doc := concat($srchcoll, "/termcenter.xml"), $query := concat("for $r in document('", $doc, "')//entry[", $expr, "] order by $r/@id", " collation '?lang=sme-SE' return ", "let $doc := util:document-name($r) return ", "", "{$r}") return $query else let $docs := ristenutil:langs-to-docs($collID, $srchlang), $docstring := string-join($docs, ','), $query := concat("for $r in document(", $docstring, ")//entry[", $expr, "]/senses/sense order by $r/../../@id", " collation '?lang=sme-SE' return ", "let $doc := util:document-name($r) return ", "", "{$r/../..}") return $query }; (: Present an overview of query results :) declare function local:displayHitlist($hits as node()+, $srchcoll as xs:string) as element() { let $count := count($hits), $max := request:get-parameter("howmany", "10") 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 return { for $p in $start to $end return let $current := item-at($hits, $p) return $current } }; (: Main function - retrieves some request and session attributes, forks further processing to other defined functions depending on the retrieved values :) declare function local:main() as element()+ { let $term := request:get-parameter("term", ""), (: default value must be "" :) $srchlang := request:get-parameter("showlang","all"), $srchcoll := request:get-parameter("srchcoll",""), (: the ID :) $class := request:get-parameter("class", ""), (: default value must be "" :) $sort-key := "head" let $session-results := concat($srchcoll, "-results"), $session-query := concat($srchcoll, "-query") let $previous := session:get-attribute($session-results), $queryOld := session:get-attribute($session-query) (: DEBUG ONLY: :) let $coll := request:get-parameter("coll","all"), $params := request:get-parameter-names(), $session := session:get-attribute-names() return if(string-length($term) = 0 and string-length($class) = 0) then if (exists($previous)) then ( (: DEBUG output:

Your document path: {$srchcoll}
Your $lang string: {$srchlang}
Your $class string: {$class}
Your session attributes: {$session}
Your query filter/old query:
{$queryOld}

,

UrSrchTrm: «{$term}»

, :) local:displayHitlist($previous, $srchcoll) ) else

ErrorTimeOut

else let $query := local:build-query($srchcoll, $srchlang, $class, $term, $sort-key) let $hits := util:eval( $query ), $s := session:set-attribute($session-results, $hits), $u := session:set-attribute($session-query, $query) return if (empty($hits)) then ( NoHit «{$term}»! (: DEBUG only - output some extra info ,

Your document path: {$srchcoll}
Your $lang string: {$srchlang}
Your $class string: {$class}
Your session attributes: {$session}
Your query filter/old query:
{$queryOld}
Your complete search query:
{$query}

:) ) else ( (: DEBUG only - output some extra info

Your document path: {$srchcoll}
Your $lang string: {$srchlang}
Your $class string: {$class}
Your session attributes: {$session}
Your query filter/old query:
{$queryOld}
Your complete search query:
{$query}

,

UrSrchTrm: «{$term}»

, :) local:displayHitlist($hits, $srchcoll) ) }; let $collelements := tokenize(request:get-parameter("srchcoll",""),'/'), $coll := $collelements[last()], $type := $collelements[last()-1] return