Hi Tony, Though the deep-equal is a good and very general solution, it is quite brute force. The processor is unable to utilize indexes that way, which is difficult enough already for your problem. If it is possible to replace the deep-equal with a more straight forward string comparison, than that might speed things up a bit. I also things there must be ways to get the indexes to do most of the hard work for you, but I am running short on inspiration at the moment..
Kind regards, Geert > drs. G.P.H. (Geert) Josten Consultant Daidalos BV Hoekeindsehof 1-4 2665 JZ Bleiswijk T +31 (0)10 850 1200 F +31 (0)10 850 1199 mailto:[email protected] http://www.daidalos.nl/ KvK 27164984 P Please consider the environment before printing this mail. De informatie - verzonden in of met dit e-mailbericht - is afkomstig van Daidalos BV en is uitsluitend bestemd voor de geadresseerde. Indien u dit bericht onbedoeld hebt ontvangen, verzoeken wij u het te verwijderen. Aan dit bericht kunnen geen rechten worden ontleend. > From: [email protected] > [mailto:[email protected]] On Behalf Of > Tony Mariella > Sent: donderdag 18 februari 2010 18:04 > To: [email protected] > Subject: RE: [MarkLogic Dev General] Distinct Nodes/Value Functions > > I'm also having issues with Time Limit Exceeded for deep-equal. > > > > > > ________________________________ > > From: [email protected] > To: [email protected] > Date: Thu, 18 Feb 2010 08:55:08 -0800 > Subject: Re: [MarkLogic Dev General] Distinct Nodes/Value Functions > > > Would JSON be a useful alternative? JSON conversion is built > in as xdmp:to-json. > > wunder > > On Feb 18, 2010, at 8:48 AM, Tony Mariella wrote: > > > > Can you think of a way to return the data as a CSV output ? > > -Tony > > > > Date: Wed, 17 Feb 2010 12:54:25 -0500 > > To: [email protected] > > From: [email protected] > > Subject: RE: [MarkLogic Dev General] Distinct > Nodes/Value Functions > > > > At 2010-02-17 11:49 -0500, Tony Mariella wrote: > > >The Tall Rd items are different than the Short Rd items. > > >I'm trying to de-dupe the items with the caveat that > if the testVal > > >tag is set, > > >then collapse all identical items containing a blank > testVal tag. > > > > But you didn't say that the first time. :{)} > > > > ><results> > > > <item> > > > <addr>24 Short Rd</addr> > > > <city>Baltimore</city> > > > <state>MD</state> > > > <testVal>TEST1</testVal> > > > </item> > > > <item> > > > <addr>55 Tall Rd</addr> > > > <city>Orlando</city> > > > <state>FL</state> > > > <testVal/> > > > </item> > > ></results> > > > > Spelling out your requirement in words, backing it up > with the > > example really helps. > > > > I hope the answer below helps. > > > > . . . . . . . . . . . Ken > > > > > > T:\ftemp>call xquery tony2.xq > > <?xml version="1.0" encoding="UTF-8"?> > > <results> > > <item> > > <addr>24 Short Rd</addr> > > <city>Baltimore</city> > > <state>MD</state> > > <testVal>TEST1</testVal> > > </item> > > <item> > > <addr>55 Tall Rd</addr> > > <city>Orlando</city> > > <state>FL</state> > > <testVal/> > > </item> > > </results> > > T:\ftemp>type tony2.xml > > <results> > > <item> > > <addr>24 Short Rd</addr> > > <city>Baltimore</city> > > <state>MD</state> > > <testVal/> > > </item> > > <item> > > <addr>24 Short Rd</addr> > > <city>Baltimore</city> > > <state>MD</state> > > <testVal/> > > </item> > > <item> > > <addr>24 Short Rd</addr> > > <city>Baltimore</city> > > <state>MD</state> > > <testVal>TEST1</testVal> > > </item> > > <item> > > <addr>55 Tall Rd</addr> > > <city>Orlando</city> > > <state>FL</state> > > <testVal/> > > </item> > > <item> > > <addr>55 Tall Rd</addr> > > <city>Orlando</city> > > <state>FL</state> > > <testVal/> > > </item> > > <item> > > <addr>55 Tall Rd</addr> > > <city>Orlando</city> > > <state>FL</state> > > <testVal/> > > </item> > > </results> > > > > T:\ftemp>type tony2.xq > > declare function local:distinct-items ($items as > node()*) as node()* > > { > > (:walk through the information finding unique members:) > > let $unique := for $i at $ipos in $items > > let $before_i := subsequence( $items, 1, $ipos - 1 ) > > where every $bi in $before_i > > satisfies not( deep-equal($bi, $i) ) > > return $i > > (:rearrange the information to isolate the non-testVal info:) > > let $interim := for $u in $unique > > return <interim> > > <compare>{$u/node() except $u/testVal}</compare> > > {$u} > > </interim> > > (:walk through the rearranged information de-duping > those without a > > value for testVal and for those with testVal removing > all the same > > without it:) > > for $each in $interim return > > if ( string( $each/item/testVal ) ) > > then $each/item (:because this has testVal:) > > else if ( some $i in $interim except $each > > satisfies deep-equal( $i/compare, $each/compare ) ) > > then () (:because the other must have testVal:) > > else $each/item (:because none have testVal:) > > }; > > > > <results> > > { local:distinct-items( doc('tony2.xml')/results/item ) } > > </results> > > T:\ftemp>rem Done! > > > > > > > > > > -- > > XSLT/XQuery/XPath training after http://XMLPrague.cz > <http://xmlprague.cz/> 2010-03-15/19 > > XSLT/XQuery/XPath training: San Carlos, California > 2010-04-26/30 > > Vote for your XML training: > http://www.CraneSoftwrights.com/q/i/ > > Crane Softwrights Ltd. http://www.CraneSoftwrights.com/q/ > > Training tools: Comprehensive interactive XSLT/XPath > 1.0/2.0 video > > Video lesson: > http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18 > > Video overview: > http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18 > > G. Ken Holman mailto:[email protected] > > Male Cancer Awareness Nov'07 > http://www.CraneSoftwrights.com/q/bc > > Legal business disclaimers: > http://www.CraneSoftwrights.com/legal > > > > _______________________________________________ > > General mailing list > > [email protected] > > http://xqzone.com/mailman/listinfo/general > _______________________________________________ > General mailing list > [email protected] > http://xqzone.com/mailman/listinfo/general > > > > _______________________________________________ General mailing list [email protected] http://xqzone.com/mailman/listinfo/general
