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 ristenutil="http://www.risten.no/shared/util" at "../xquery/ristenutil.xqm";
(: Save an existing entry, with new sense for the new term record :)
declare function local:saveExistingEntry($centerid as xs:string) as element()
{
let $lang := request:get-parameter("lang", ""),
$rawentry := request:get-parameter("entry", ""),
$pos := request:get-parameter("pos", ""),
$entry := ristenutil:cleanEntry( $rawentry ),
(: The class codes are coming directly if adding to an exising record: :)
$topT := request:get-parameter("top", ""),
$midT := request:get-parameter("mid", ""),
$botmT := request:get-parameter("botm", ""),
(: The class codes are coming indirectly through this one if it is a new record: :)
$class := request:get-parameter("class", ""),
$top := if ($topT = "") then (: If the request param is empty, then it is a new rec :)
substring($class, 1, 1)
else $topT,
$mid := if ($midT = "") then
if (contains($class, '-') ) then
substring-before($class, "-")
else $class
else $midT,
$botm := if ($botmT = "") then
if (contains($class, '-') ) then
substring-after($class, "-")
else ""
else $botmT,
$langid := ristenutil:makeTermID($entry, $pos)
let $user := session:get-attribute("user" ),
$pass := session:get-attribute("password"),
$coll := "/db/ordbase/terms/SD-terms",
$doc := ristenutil:get-doc($lang),
$db := concat('xmldb:exist://',$coll)
let $date := ristenutil:dateTime()
(: $collection should refer to the collection, not the
document in the collecion! :)
let $collection := xmldb:collection( $db, $user, $pass)
(: The document reference needs to include the collection
path even though it is given in the $collection argument in
the xmldb:update command (below). :)
let $langupdate :=
{$date}
(: execute the XUpdate: :)
let $dummy := xmldb:update($collection, $langupdate)
return
Database: {$db}
ID: {$centerid}
LangID: {$langid}
Oppslag: {$entry}
XUpdate: {$langupdate}
Lagra!
};
(: Save an edited entry, the grammar part common to all senses: :)
declare function local:saveNewEntry($centerid as xs:string) as element()
{
let $lang := request:get-parameter("lang", ""),
$rawentry := request:get-parameter("entry", ""),
$pos := request:get-parameter("pos", ""),
$entry := ristenutil:cleanEntry( $rawentry ),
(: The class codes are coming directly if adding to an exising record: :)
$topT := request:get-parameter("top", ""),
$midT := request:get-parameter("mid", ""),
$botmT := request:get-parameter("botm", ""),
(: The class codes are coming indirectly through this one if it is a new record: :)
$class := request:get-parameter("class", ""),
$top := if ($topT = "") then (: If the request param is empty, then it is a new rec :)
substring($class, 1, 1)
else $topT,
$mid := if ($midT = "") then
if (contains($class, '-') ) then
substring-before($class, "-")
else $class
else $midT,
$botm := if ($botmT = "") then
if (contains($class, '-') ) then
substring-after($class, "-")
else ""
else $botmT,
$langid := ristenutil:makeTermID($entry, $pos)
let $user := session:get-attribute("user" ),
$pass := session:get-attribute("password"),
$coll := "/db/ordbase/terms/SD-terms",
$doc := ristenutil:get-doc($lang),
$cntrdoc := "/db/ordbase/terms/SD-terms/termcenter.xml",
$db := concat('xmldb:exist://',$coll)
let $date := ristenutil:dateTime()
(: $collection should refer to the collection, not the
document in the collecion! :)
let $collection := xmldb:collection( $db, $user, $pass)
(: The document reference needs to include the collection
path even though it is given in the $collection argument in
the xmldb:update command (below). :)
let $langupdate :=
{$langid}
{$entry}
{$date}
let $dummy := xmldb:update($collection, $langupdate)
return
Database: {$db}
ID: {$centerid}
Oppslag: {$entry}
XUpdate: {$langupdate}
Result: {$dummy}
Lagra!
};
(: Create a new Term Record entry: :)
declare function local:saveNewCenter() as xs:integer
{
let $centerid := ristenutil:newID(),
$lang := request:get-parameter("lang", ""),
$rawentry := request:get-parameter("entry", ""),
$pos := request:get-parameter("pos", ""),
$entry := ristenutil:cleanEntry( $rawentry ),
$class := request:get-parameter("class", ""),
$top := substring( $class, 1, 1),
$mid := if (contains($class, '-') ) then
substring-before($class, "-")
else $class,
$botm := if (contains($class, '-') ) then
substring-after($class, "-")
else "",
$langid := ristenutil:makeTermID($entry, $pos)
let $user := session:get-attribute("user"),
$collID := session:get-attribute("collection"),
$doc := ristenutil:get-doc-path($collID, "termcenter.xml"),
$docref := document($doc)
let $date := ristenutil:dateTime(),
$comment := concat("Created this record, added entry for ", $lang),
$xiref := concat("terms-", $lang, ".xml",
"#xpointer(//entry[@id='",
$langid,
"'])" )
let $newnode :=
return
if (0 > $centerid) then $centerid
else util:exclusive-lock($docref,
local:save-new-center-record($centerid, $newnode, $doc, $date) )
};
declare function local:save-new-center-record($centerid as xs:integer,
$newnode as element(),
$doc as xs:string,
$date as xs:string) as xs:integer
{
let $result :=
if ( document($doc)//entry[@id = $centerid] ) then
-2
else
(
(# exist:batch-transaction #) {
update insert $newnode into document($doc)/termCenter,
update value document($doc)/termCenter/@last-update with $date }
)
return if ( $result = -2 ) then $result else $centerid
};
(: 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 :)
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()
};
(: 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 := local:saveNewCenter()
let $exists := local:check-exists($entry, $entrylang)
return
if ($centerid < 0) then
if ($centerid = -2) then
IDAlreadyInUseError
else
ERROR! The new record failed to get added!
else if( $exists ) then
let $savedentry := local:saveExistingEntry($centerid),
$query := local:build-query($entry, $entrylang),
$hits := util:eval( $query )
return (
(: The result: {$savedentry}
, :)
ristenutil:display($entrylang, $hits)
)
else
let $savedentry := local:saveNewEntry($centerid),
$query := local:build-query($entry, $entrylang),
$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:
{$query}
,
The save result: {$saveresult}
,
The article does exist: {$exists}
, :)
ristenutil:display($entrylang, $hits)
)
};
{ let $start := util:system-time()
return
(
local:main(),
SearchTime
{ round-half-to-even( seconds-from-duration(
util:system-time()-$start) , 3)}
)
}