Puzzling XQuery result

Saturday, 9 April 2011 · 8 messages
CG
Christian Grünin reply to Meredith Gregory, 9 Apr 2011, 05:449 Apr 2011 03:56 #
Dear Meredith,
Quoted text · Meredith Gregory · 2 lines
> for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = > <contentChannel><String>email</String></contentChannel> return $rcrd
In your query, the XML snippets <contentChannel>... is "atomized" (i.e., converted to a string), before it is compared to the atomized result of the first argument. If you want to the equality of your XML fragment, you might want to try the deep-equals() function. A query could look sth like this:
  let $xml := <contentChannel><String>email</String></contentChannel>
  for $rcrd in collection( 'Squibble' )//record
  where deep-equals($rcrd/*[1], $xml)
  return $rcrd
Hope this helps, Christian
CG
Christian Grünin reply to Meredith Gregory, 9 Apr 2011, 05:569 Apr 2011 03:59 #
Quoted text · Meredith Gregory · 1 line
> P.S. To further demonstrate my cluelessness...
;)
Quoted text · Meredith Gregory · 2 lines
> for $rcrd in collection( 'Squibble' )//record let $k := $rcrd/*[1] where > node-name( $k ) = contentChannel return $rcrd
This might help you out:
  for $rcrd in collection( 'Squibble' )//record
  where name( $rcrd/*[1] ) = "contentChannel"
  return $rcrd
You could also try collection( 'Squibble' )//record[contentChannel] Christian
CG
Christian Grünin reply to Meredith Gregory, 9 Apr 2011, 05:599 Apr 2011 04:00 #
Quoted text · Meredith Gregory · 1 line
> Thanks! The GUI says it's never heard of "deep-equals". Any suggestions?
Sorry, it was deep-equal; an example: deep-equals('a','b')
CG
Christian Grün9 Apr 2011 04:00 #
Quoted text · Christian Grün · 1 line
> Sorry, it was deep-equal; an example: deep-equals('a','b')
(Hopefully) last correction: deep-equal('a','b')
MG
Meredith Gregory9 Apr 2011 05:44 #
Dear BaseXers, i've got a result from an XQuery that i don't understand and am looking for insight and guidance. i've got a collection called 'Squibble' with three documents in it. They are listed below. The query
for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] =
<contentChannel><String>email</String></contentChannel> return $rcrd
returns record elements from the first *two* documents. This is surprising to me because the first child of the first record element in the first document is <contactMeUsing>...</contactMeUsing>, not <contentChannel>...</contentChannel>. i was expecting it to return just the record element from the second document. i confess, i don't know anything about XQuery. So, it could be that i don't understand how the where clause is supposed to work. Any clues would be most appreciated. i'm running my tests using - BaseX 6.6 - on Mac OS X 10.6.7 Best wishes, --greg
<?xml version="1.0" encoding="UTF-8"?>
<record>
  <contactMeUsing>
    <String>email</String>
  </contactMeUsing>
  <String>{&amp;quot;com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground&amp;quot;:{&amp;quot;v&amp;quot;:{&amp;quot;@class&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;$&amp;quot;:&amp;quot;for
the win Mikail.Mauz at gmail.com
&amp;quot;},&amp;quot;_-outer&amp;quot;:{&amp;quot;@class
&amp;quot;:&amp;quot;com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$&amp;quot;}}}</String>
</record>

<?xml version="1.0" encoding="UTF-8"?>
<record>
  <contentChannel>
    <String>email</String>
  </contentChannel>
  <String>{&amp;quot;com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground&amp;quot;:{&amp;quot;v&amp;quot;:{&amp;quot;@class&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;$&amp;quot;:&amp;quot;for
the get Donald.Duque at yahoo.com
&amp;quot;},&amp;quot;_-outer&amp;quot;:{&amp;quot;@class
&amp;quot;:&amp;quot;com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$&amp;quot;}}}</String>
</record>

<?xml version="1.0" encoding="UTF-8"?>
<record>
  <phone>
    <var>cell</var>
  </phone>
  <String>{&amp;quot;com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground&amp;quot;:{&amp;quot;v&amp;quot;:{&amp;quot;@class
&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;$&amp;quot;:&amp;quot;2xx.6xx.3xxx&amp;quot;},&amp;quot;_-outer&amp;quot;:{&amp;quot;@class
&amp;quot;:&amp;quot;com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$&amp;quot;}}}</String>
</record>
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
MG
Meredith Gregory9 Apr 2011 05:56 #
P.S. To further demonstrate my cluelessness...
for $rcrd in collection( 'Squibble' )//record let $k := $rcrd/*[1] where
node-name( $k ) = contentChannel return $rcrd
returns nothing -- while
for $rcrd in collection( 'Squibble' )//record let $k := $rcrd/*[1] return
node-name( $k )
returns contactMeUsing contentChannel phone i find this mildly surprising. On Fri, Apr 8, 2011 at 6:44 PM, Meredith Gregory <lgreg.meredith at gmail.com>wrote:
Quoted text · Meredith Gregory · 78 lines
> Dear BaseXers, > > i've got a result from an XQuery that i don't understand and am looking for > insight and guidance. i've got a collection called 'Squibble' with three > documents in it. They are listed below. The query > > for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = > <contentChannel><String>email</String></contentChannel> return $rcrd > > returns record elements from the first *two* documents. This is surprising > to me because the first child of the first record element in the first > document is <contactMeUsing>...</contactMeUsing>, not > <contentChannel>...</contentChannel>. > > i was expecting it to return just the record element from the second > document. > > i confess, i don't know anything about XQuery. So, it could be that i don't > understand how the where clause is supposed to work. Any clues would be most > appreciated. > > i'm running my tests using > > - BaseX 6.6 > - on Mac OS X 10.6.7 > > > Best wishes, > > --greg > > <?xml version="1.0" encoding="UTF-8"?> > <record> > <contactMeUsing> > <String>email</String> > </contactMeUsing> > > <String>{&amp;quot;com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground&amp;quot;:{&amp;quot;v&amp;quot;:{&amp;quot;@class&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;$&amp;quot;:&amp;quot;for > the win Mikail.Mauz at gmail.com > &amp;quot;},&amp;quot;_-outer&amp;quot;:{&amp;quot;@class > &amp;quot;:&amp;quot;com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$&amp;quot;}}}</String> > </record> > > <?xml version="1.0" encoding="UTF-8"?> > <record> > <contentChannel> > <String>email</String> > </contentChannel> > > <String>{&amp;quot;com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground&amp;quot;:{&amp;quot;v&amp;quot;:{&amp;quot;@class&amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;$&amp;quot;:&amp;quot;for > the get Donald.Duque at yahoo.com > &amp;quot;},&amp;quot;_-outer&amp;quot;:{&amp;quot;@class > &amp;quot;:&amp;quot;com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$&amp;quot;}}}</String> > </record> > > <?xml version="1.0" encoding="UTF-8"?> > <record> > <phone> > <var>cell</var> > </phone> > > <String>{&amp;quot;com.biosimilarity.lift.model.store.MonadicTermTypes_-Ground&amp;quot;:{&amp;quot;v&amp;quot;:{&amp;quot;@class > &amp;quot;:&amp;quot;string&amp;quot;,&amp;quot;$&amp;quot;:&amp;quot;2xx.6xx.3xxx&amp;quot;},&amp;quot;_-outer&amp;quot;:{&amp;quot;@class > &amp;quot;:&amp;quot;com.biosimilarity.lift.model.store.PersistedMonadicTS$TheMTT$&amp;quot;}}}</String> > </record> > > -- > L.G. Meredith > Managing Partner > Biosimilarity LLC > 7329 39th Ave SW > Seattle, WA 98136 > > +1 206.650.3740 > > http://biosimilarity.blogspot.com > >
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
MG
Meredith Gregoryin reply to Christian Grün, 9 Apr 2011, 03:569 Apr 2011 05:59 #
Dear Christian, Thanks! The GUI says it's never heard of "deep-equals". Any suggestions? Best wishes, --greg On Fri, Apr 8, 2011 at 6:56 PM, Christian Grün <christian.gruen at gmail.com>wrote:
Quoted text · Christian Grün · 19 lines
> Dear Meredith, > > > for $rcrd in collection( 'Squibble' )//record where $rcrd/*[1] = > > <contentChannel><String>email</String></contentChannel> return $rcrd > > In your query, the XML snippets <contentChannel>... is "atomized" > (i.e., converted to a string), before it is compared to the atomized > result of the first argument. If you want to the equality of your XML > fragment, you might want to try the deep-equals() function. A query > could look sth like this: > > let $xml := <contentChannel><String>email</String></contentChannel> > for $rcrd in collection( 'Squibble' )//record > where deep-equals($rcrd/*[1], $xml) > return $rcrd > > Hope this helps, > Christian >
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com
MG
Meredith Gregoryin reply to Christian Grün, 9 Apr 2011, 04:009 Apr 2011 06:02 #
Dear Christian, Thanks for the prompt responses! The last one did the trick. It's now performing as expected. Cheers! Best wishes, --greg On Fri, Apr 8, 2011 at 7:00 PM, Christian Grün <christian.gruen at gmail.com>wrote:
Quoted text · Christian Grün · 4 lines
> > Sorry, it was deep-equal; an example: deep-equals('a','b') > > (Hopefully) last correction: deep-equal('a','b') >
-- L.G. Meredith Managing Partner Biosimilarity LLC 7329 39th Ave SW Seattle, WA 98136 +1 206.650.3740 http://biosimilarity.blogspot.com

⚡Generated with XQuery