Jan Rittinger wrote:
On
03/18/2008 02:43 PM, Keulen, M. van (Maurice) wrote with possible
deletions:
Hi,
I know that the XQUF prohibits it, but for writing robust functions, it
is often necessary to mix query and update/docmgmt functionality. Some
examples:
Hi Maurice,
I don't think what you suggest is necessary. If you want to query with
side effects -- which is certainly not what XQuery was initially
introduced for -- and you want to simulate XQueryP then you can
*always* use updating queries and return your results in a special
result document.
What you mean is to do the updates and instead of returning the query
result, store it in the database as well ... and then use a second
query to retrieve the result? That only works if I am sure that the
first query is completed before the second one starts. Furthermore, an
update and a docmgmt operation also do not mix, so you need three
queries:
- (docmgmt) one to make sure that there is a document in the
database for the result (if not, it adds it)
- (update) one to do the updates and insert the result in the
result document
- (query) one to get the result document
A lot of overhead if you ask me.
Furthermore, I access the database by sending SOAP-messages to the
XRPC-interface ... in other words: asynchronous communication. So,
waiting for a query to complete is hard ... and you cannot send
different queries in one SOAP-message (only multiple calls for the same
query, but with other parameters).
Jennie: my SOAP-messages do not come from MonetDB/XQuery, but from
outside (i.e., some scripting language).
* Expression that queries/updates document, but if the document
does
not exist, adds an empty version of it:
let $name := "foo.xml"
let $emptydoc := <root/>
let $doc := if (empty(pf:documents()[.=$name])) then
(put($emptydoc,$name),$emptydoc) else doc("foo.xml")
return $doc//bar
Here you expect, that the document management stuff is done just in
time and thus with side effects! Your query fails if the document
management stuff is done after the query part.
No, not true. If "foo.xml" is not in the database yet, I want to add
it, but simply continue with $emptydoc. The query does not depend on
the document to be added immediately.
* Expression that adds to a log-file:
let $log := doc("log.xml")
let $expr := ...some expression...
return (do insert <entry>...{$expr}...<entry> as last
into $log,$expr)
You can also return a ``nested'' sequence and query the result to split
up your query result and the log files. In my eyes you once more try to
``cheat'' to have more than a single result stream.
What do you mean by "nested" sequence? Due to the typing rules, an
expression is either an updating expression (without query result) or
not (with query result). This implies I cannot within one query do an
update and return a result. This is exactly the thing I want to
do. I do not want two result streams, I just want a query to have one
query result but with side-effects to the database.
Maurice.
--
----------------------------------------------------------------------
Dr.Ir. M. van Keulen - Assistant Professor, Data Management Technology
Univ. of Twente, Dept of EEMCS, POBox 217, 7500 AE Enschede, Netherlands
Email: m.vankeulen@utwente.nl, Phone: +31 534893688, Fax: +31 534892927
Room: ZI 3039, WWW: http://www.cs.utwente.nl/~keulen