In pure generic XQuery there is one output;
So if you want 7 outputs you need to either produce a "sequence" of 7 items or 
a single document encapsulating them.

To produce a sequence you don't actually need to collect the values just let 
them evaluate

let  $doc = doc("huge.xml")
 return ( filter1($doc) , filter2($doc) .... )

TO produce a wrapped element is similar


let  $doc = doc("huge.xml")
 return <allofthem><filter1>{ filter1($doc) }</fillter1><filter2>{ 
filter2($doc)  } </filter2> ..... </allofthem>


----------------------------------------
David A. Lee
[email protected]
http://www.xmlsh.org


-----Original Message-----
From: Ihe Onwuka [mailto:[email protected]] 
Sent: Monday, January 13, 2014 7:52 PM
To: David Lee
Cc: [email protected]
Subject: Re: [xquery-talk] Multiple output via a stream of filters

I only read the ginormous  XML once... I apply the 7 filters to each node read 
and it gets allocated to one of the 7 output buckets (hows that for a 
semantically neutral term).

On Tue, Jan 14, 2014 at 3:50 AM, Ihe Onwuka <[email protected]> wrote:
> Input .... ginormous xml document containing data relating to a credit 
> card application that I only want to read once.
>
> Filters. - under 25's, college educated, single mother, bankrupts, 6 
> figure income, repeat applicants, self-employed.
>
> 1 input - 7 outputs
>
> All applicants that meet the criteria of a given filter are copied to 
> the output corresponding to that filter.
>
> We could camouflage the 7 outputs into one by wrapping an element 
> around the whole 7.
>
> On Tue, Jan 14, 2014 at 3:42 AM, David Lee <[email protected]> wrote:
>> A Single XQuery invocation has only one "output stream" ... but when your 
>> working in a database often you don't need any, you want to put the data 
>> back into the database.
>> Functions don't have "streams" really either although the word is overloaded.
>> One way it to produce a "sequence" of results which you then do something 
>> with, either output in the main output or store into the database (as 
>> separate documents).
>>
>> Also I believe eXist has functions for writing to files so your question my 
>> have more relevance on the exists mailing list.
>>
>> But if what I think you mean by "stream" is a long result ... and 
>> your dealing with GB+ data you need to be very careful, True "streaming" is 
>> very hard to achieve in XQuery.  Functions don't "stream" they return values.
>> XPath doesn't "stream" ... there is no real "streams" in XQuery ... so if 
>> your not careful you end up with having to hold the entire result set in 
>> memory.
>> But if your output is to the 'main' output (is this an HTTP call ?) you 
>> might be able to stream to it .. all depends on the vendor implementation.
>>
>> I suspect what your really after is to write multiple results to either 
>> documents or files.
>> XQuery doesn't support this generically but XML Databases like eXist do so 
>> you might want to ask there.
>>
>> Or I may have completely misunderstood your question.
>>
>>
>>
>> ----------------------------------------
>> David A. Lee
>> [email protected]
>> http://www.xmlsh.org
>>
>> -----Original Message-----
>> From: Ihe Onwuka [mailto:[email protected]]
>> Sent: Monday, January 13, 2014 4:56 PM
>> To: David Lee
>> Cc: [email protected]
>> Subject: Re: [xquery-talk] Multiple output via a stream of filters
>>
>> If it helps think of an entity that entails a bazillion fields like a credit 
>> card application and you have multiple ways you wish to classify it. So you 
>> have a filter for each classification scheme and the application "filters" 
>> through to the output stream of whichever predicates return true.
>>
>>
>>
>> On Tue, Jan 14, 2014 at 12:38 AM, David Lee <[email protected]> wrote:
>>> Could you define what you mean by "output" ?
>>>
>>> ----------------------------------------
>>> David A. Lee
>>> [email protected]
>>> http://www.xmlsh.org
>>>
>>>
>>> -----Original Message-----
>>> From: Ihe Onwuka [mailto:[email protected]]
>>> Sent: Monday, January 13, 2014 4:19 PM
>>> To: David Lee
>>> Cc: [email protected]
>>> Subject: Re: [xquery-talk] Multiple output via a stream of filters
>>>
>>> On Mon, Jan 13, 2014 at 11:54 PM, David Lee <[email protected]> wrote:
>>>> If your running in exist then pure XQuery is probably as good or better 
>>>> then anything else.
>>>> Could you expand on your problem ?
>>>>
>>>
>>> I have a collection. Suppose I have 10 different outputs I want and the 
>>> decision as to which output a node is routed to (not necessarily mutual 
>>> exclusive though) can be encapsulated in a predicate (hence amenable to a 
>>> filter HOF).
>>>
>>> I only want to iterate over the collection once but I wish to apply the 10 
>>> predicates to each node in the sequence so as to determine which of the 10 
>>> outputs (again not necessarily mutually exclusive) the node will feature in.
>>>
>>> The algorithm is straightforward using structural recursion (or tail 
>>> recursion if tail call elimination is an issue). Asking whether there is an 
>>> idiomatic XQuery solution that is different  from this.

_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk

Reply via email to