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"; declare namespace xmldb="http://exist-db.org/xquery/xmldb"; import module namespace save="http://www.risten.no/edit/save" at "xquery/saveroutines.xqm"; import module namespace ristenutil="http://www.risten.no/shared/util" at "../xquery/ristenutil.xqm"; (: Create filter expression from query term, field and mode :) declare function local:filter-expr($record as xs:string) as xs:string { let $pos := request:get-parameter("pos", "S"), $newrec := ristenutil:makeTermID($record, $pos) let $t := concat("'", $newrec, "'") return concat("@id &= ", $t) }; (: Assemble the query string for checking existing records: :) declare function local:build-query($record as xs:string, $entrylang as xs:string) as xs:string { let $expr := local:filter-expr($record), $doc := ristenutil:get-doc($entrylang) return concat("for $r in document('", $doc, "')//entry[", $expr, "] return $r") }; (: Check for the existence of the new entry: :) declare function local:check-exists($entry as xs:string, $entrylang as xs:string) as xs:boolean { let $query := local:build-query($entry, $entrylang), $hits := util:eval( $query ), $count := count($hits) return if ( $count = 0 ) then false() else true() }; (: Assemble the termcenter query string :) declare function local:build-termc-query($record as xs:string) as xs:string { let $expr := ristenutil:id-filter($record), $docs := "'/db/ordbase/terms/SD-terms/termcenter.xml'" return concat("for $r in document(", $docs, ")//entry[", $expr, "] return $r") }; (: Main function - retrieves some request attributes, forks further processing to other defined functions depending on the retrieved values :) declare function local:main() as element()+ { let $entrylang := request:get-parameter("lang", ""), $rawentry := request:get-parameter("entry", ""), $pos := request:get-parameter("pos", ""), $entry := ristenutil:cleanEntry( $rawentry ), $class := request:get-parameter("class", "") let $l := session:set-attribute("newreclang", $entrylang), $p := session:set-attribute("newrecpos", $pos), $c := session:set-attribute("class", $class) let $centerid := save:saveNewCenter() cast as xs:string let $exists := local:check-exists($entry, $entrylang) return if( $exists ) then let $savedentry := save:saveExistingEntry($centerid), $query := local:build-termc-query($centerid), $hits := util:eval( $query ) return ( (:

The result: {$savedentry}

, :) ristenutil:display($entrylang, $hits) ) else let $savedentry := save:saveNewEntry($centerid), $query := local:build-termc-query($centerid), $hits := util:eval( $query ) return if (empty($hits)) then (

ERROR! The new record {$centerid} was not found!

,

Contact the webmaster!

) else ( (: DEBUG:

Your search query:

,

The save result: {$saveresult}

,

The article does exist: {$exists}

, ristenutil:displayTermRecord( :) $hits ) };
{ let $start := util:system-time(), $entrylang := request:get-parameter("lang", "") return ( ristenutil:pre-main($entrylang, local:main()),

SearchTime { round-half-to-even( seconds-from-duration( util:system-time()-$start) , 3)}

) }