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