[Monetdb-developers] [XQ] Mixing update/docmgmt/query

Keulen, M. van (Maurice) m.vankeulen at utwente.nl
Tue Mar 18 15:38:47 CET 2008

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
    * (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.


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 at utwente.nl, Phone: +31 534893688, Fax: +31 534892927
Room: ZI 3039, WWW: http://www.cs.utwente.nl/~keulen

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.monetdb.org/pipermail/developers-list/attachments/20080318/c8e2b63f/attachment.html>

More information about the developers-list mailing list