On Fri, Nov 18, 2011 at 8:42 PM, Joel VanderWerf
<joelvanderwerf / gmail.com> wrote:
> On 11/18/2011 08:09 AM, R. Kumar wrote:
>>
>> For yaml, is there a way to say "give me title and author where category
>> = 'unix' etc in some format. Are there tools that can read up the
>> structure of any yml file and allow us to query telling *what* we want
>> without having to understand yaml format, and *how* to retrieve it.
>
> Does ypath help?
>
> Never used it myself....
>
> http://yaml4r.sourceforge.net/doc/page/parsing_yaml_documents.htm
> https://www.ruby-toolbox.com/gems/ytools

Oh, interesting: XPath for Yaml.  Apparently it's part of the std lib
- at least with 1.9.2 I did not need to install something:

robert@fussel:~/projects/rbp-blog$ irb19 -r yaml
irb(main):001:0> players = YAML::parse( <<EOY )
irb(main):002:1"   player:
irb(main):003:1"     - given: Sammy
irb(main):004:1"       family: Sosa
irb(main):005:1"     - given: Ken
irb(main):006:1"       family: Griffey
irb(main):007:1"     - given: Mark
irb(main):008:1"       family: McGwire
irb(main):009:1" EOY
=> #<Syck::Map:0x95943c8>
irb(main):010:0> players
=> #<Syck::Map:0x95943c8>
irb(main):011:0> players.class
=> Syck::Map
irb(main):012:0> players.select '//given'
=> [#<Syck::Scalar:0x95953f4>, #<Syck::Scalar:0x9594fe4>,
#<Syck::Scalar:0x9594738>]
irb(main):013:0> players.select('//given').transform
NoMethodError: undefined method `transform' for #<Array:0x98f5058>
	from (irb):13
	from /usr/local/bin/irb19:12:in `<main>'
irb(main):014:0> players.select('//given').map &:class
=> [Syck::Scalar, Syck::Scalar, Syck::Scalar]
irb(main):019:0> players.select('//given').map &:value
=> ["Sammy", "Ken", "Mark"]

Still the issue with multiple files would hold.  Rahul, I believe this
is your major problem: you have to define relationships between data
from different sources within the query, because there is no inherent
relationship between those files.  It's a bit like a federated
database approach for RDBMS: if you combine different databases which
know nothing of each other to a single database you need a federation
layer which does all the SQL interpretation and joining between
different sources.

Bottom line: you're easier off by having it in one Yaml file only. :-)
 You could write a transformation routine which reads in all the
different sources makes the connections and then allows you to query a
single object graph.

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/