Mercurial > hg > mpdl-group
diff software/eXist/webapp/mpdl/interface/doc-query.xql @ 7:5589d865af7a
Erstellung XQL/XSL Applikation
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 08 Feb 2011 15:16:46 +0100 |
parents | |
children | d6f528ad5d96 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/eXist/webapp/mpdl/interface/doc-query.xql Tue Feb 08 15:16:46 2011 +0100 @@ -0,0 +1,150 @@ +xquery version "1.0"; + +import module namespace mpdl-time = "http://www.mpiwg-berlin.mpg.de/ns/mpdl/util/time" at "../util/time.xql"; +import module namespace functx = "http://www.functx.com" at "../util/functx.xql"; +import module namespace mpdl-lucene = "http://www.mpiwg-berlin.mpg.de/ns/mpdl/lucene/search" at "../lucene/search.xql"; +import module namespace mpdl-text = "http://www.mpiwg-berlin.mpg.de/ns/mpdl/text" at "../text/all.xql"; + +declare namespace request = "http://exist-db.org/xquery/request"; +declare namespace transform = "http://exist-db.org/xquery/transform"; +declare namespace util = "http://exist-db.org/xquery/util"; + +declare namespace dcterms="http://purl.org/dc/terms"; +declare namespace echo="http://www.mpiwg-berlin.mpg.de/ns/echo/1.0/"; + +let $mpdlDocUri := request:get-parameter("document", "") +let $mode := request:get-parameter("mode", "image") +let $queryType := request:get-parameter("queryType", "") +let $query := request:get-parameter("query", "") +let $reqQueryResultPageSize := request:get-parameter("queryResultPageSize", "") +let $queryResultPageSize := + if ($reqQueryResultPageSize = '' or $reqQueryResultPageSize = '0') + then 100 + else number($reqQueryResultPageSize) +let $reqQueryResultPN := request:get-parameter("queryResultPN", "") +let $queryResultPN := + if ($reqQueryResultPN = '' or $reqQueryResultPN = '0') + then 1 + else number($reqQueryResultPN) + +let $presentationPath := "/db/mpdl/presentation" +(: e.g. mpdlCollectioName is derived from mpdlDocUri: /archimedes/la/yourDoc.xml :) +let $documentName := substring-before(substring-after(substring-after(substring-after($mpdlDocUri, "/"), "/"), "/"), ".") +let $language := substring-before(substring-after(substring-after($mpdlDocUri, "/"), "/"), "/") +let $docbase := substring-before(substring-after($mpdlDocUri, "/"), "/") +let $fullDocumentUri := + if ($queryType = 'fulltext' or $queryType = 'ftIndex') + then concat('/db/mpdl/documents/standard', $mpdlDocUri) + else if ($queryType = 'fulltextMorph' or $queryType = 'fulltextMorphLemma' or $queryType = 'ftIndexMorph') + then concat('/db/mpdl/documents/morph', $mpdlDocUri) + else concat('/db/mpdl/documents/morph', $mpdlDocUri) +let $currentTimeBegin := util:system-time() +let $documentAvailable := doc-available($fullDocumentUri) +let $document := doc($fullDocumentUri) +let $metadata := + if ($docbase = 'archimedes') + then $document/archimedes/info + else if ($docbase = 'echo') + then $document/echo:echo/echo:metadata + else '' + +(: xQuery inline execution does not work in module so it has to be done here :) +let $xQueryPageSize := 100 +let $xQueryResultEval := + if ($queryType = 'xpath' or $queryType = 'xquery' and $query != "") + then util:eval-inline($document, $query) + else () +let $xQueryFrom := ($queryResultPN * $xQueryPageSize) - $xQueryPageSize + 1 +let $xQueryTo := $queryResultPN * $xQueryPageSize +let $xQueryResultEntries := + for $entry at $pos in $xQueryResultEval + where $pos >= $xQueryFrom and $pos <= $xQueryTo + return $entry +let $xQuerySize := count($xQueryResultEval) +let $xQueryPages := + if ($xQuerySize = 0) + then 0 + else $xQuerySize idiv $xQueryPageSize + 1 +let $xQueryResult := + <result> + <size>{$xQuerySize}</size> + <page-size>{$xQueryPageSize}</page-size> + <pages>{$xQueryPages}</pages> + <pn>{$queryResultPN}</pn> + <hits>{$xQueryResultEntries}</hits> + </result> + +let $queryResult := + if (($queryType = 'fulltext' or $queryType = 'fulltextMorph' or $queryType = 'fulltextMorphLemma') and $query != "") + then mpdl-lucene:search($docbase, $language, $document, $queryType, $query, $queryResultPN, $queryResultPageSize) + else if (($queryType = 'ftIndex' or $queryType = 'ftIndexMorph') and $query != "") + then mpdl-text:indexTerms($docbase, $language, $document, $query, $queryResultPN, $queryResultPageSize) + else if ($queryType = 'xpath' or $queryType = 'xquery' and $query != "") + then $xQueryResult + else if ($queryType = 'toc' or $queryType = 'figures') + then mpdl-text:get-toc($docbase, $queryType, $document, $queryResultPN, $queryResultPageSize) + else if ($query = "") + then + <result> + <size>0</size> + <page-size>0</page-size> + <pages>0</pages> + <pn>0</pn> + <hits/> + </result> + else () + +let $countHits := count($queryResult/result/hits/hit) +let $firstHit := $queryResult/result/hits/hit[1] + +(: 10 or more is an error :) +let $errorCode := + if (not($documentAvailable)) + then 10 + else 0 + +let $currentTimeEnd := util:system-time() +let $neededTime := mpdl-time:duration-as-ms($currentTimeEnd - $currentTimeBegin) + +let $xmlResult := + if ($errorCode < 10) + then + <result> + <document-description> + <uri>{$mpdlDocUri}</uri> + <collection-name>{$docbase}</collection-name> + <document-name>{$documentName}</document-name> + <language>{$language}</language> + </document-description> + <page> + <mode>{$mode}</mode> + </page> + <query> + <type>{$queryType}</type> + <expression>{$query}</expression> + {$queryResult} + </query> + <performance>{$neededTime}</performance> + </result> + else if ($errorCode = 10) + then <error><number>{$errorCode}</number><description>Fulltext document: {$mpdlDocUri} is not available yet</description></error> + else <error><number>{$errorCode}</number><description>undefined error: {$errorCode}</description></error> + +let $declare := + if ($mode = "text" or $mode = "textPollux" or $mode = "image" or $mode = "xml") + then util:declare-option("exist:serialize", "method=html media-type=text/html omit-xml-declaration=no indent=yes encoding=utf-8") + else if ($mode = "pureXml") + then util:declare-option("exist:serialize", "method=xml media-type=text/xml omit-xml-declaration=no indent=yes encoding=utf-8") + else util:declare-option("exist:serialize", "method=xml media-type=text/xml omit-xml-declaration=no indent=yes encoding=utf-8") +let $xslFilePath := + if($mode = "text" or $mode = "textPollux" or $mode = "image" or $mode = "xml") + then concat($presentationPath, "/queryHtml.xsl") + else concat($presentationPath, "/pageXml.xsl") +let $xslDoc := doc($xslFilePath) +let $result := + if($errorCode < 10) + then transform:transform($xmlResult, $xslDoc, ()) + else + <div>{$xmlResult}</div> (: error xml result :) + +return $result \ No newline at end of file