- From: Michael Dyck <jmdyck@ibiblio.org>
- Date: Sat, 10 Dec 2005 14:49:36 -0800
- To: www-ql@w3.org
"L.G. Meredith" wrote: > > each element of the outermost collection is a pair of collections such > that > > 1. the total set of elements of the pair unions to the original > collection, e.g. > <coll><ei0/>...<eim0/></coll> U <coll><ej0/>...<ejn0/></coll> > = <coll><e0/>...<en/></coll> (ignoring order) > 2. the pairs are disjoint, e.g. > <coll><ei0/>...<eim0/></coll> /\ <coll><ej0/>...<ejn0/></coll> = > <coll/> (the empty collection) > 3. the first part of the pair satisfies the predicate p1 and the > second satisfies p2; e.g. > <coll><ei0/>...<eim0/></coll> satisfies p1; and > <coll><ej0/>...<ejn0/></coll> satisfies p2. So, just to clarify: -- If some ei in the input collection satisfies neither p1 nor p2, the result will be an empty collection. -- If k elements in the input collection satisfy both p1 and p2, the result will have 2^k pairs (since each of those elements can appear in either part of each pair, and you want all distinct combinations). If so, here's some pseudocode: function decompose( input-set ): element coll { foo( input-set, (), () ) } function foo( remaining-input, p1s_so_far, p2s_so_far ): if remaining-input is empty: element coll { element coll {p1s_so_far}, element coll {p2s_so_far} } else let h := head(remaining-input), t := tail(remaining-input) return if p1(h): foo( t, p1s_so_far + h, p2s_so_far ) else: () , if p2(h): foo( t, p1s_so_far, p2s_so_far + h ) else: () It should be fairly straightforward to translate that to proper XQuery. -Michael
Received on Saturday, 10 December 2005 22:49:57 UTC