Class: RbPath::Query

Inherits:
Object
  • Object
show all
Includes:
Utils
Defined in:
lib/rbpath/query.rb

Instance Method Summary collapse

Methods included from Utils

#deep_stringify_all, #deep_symbolize_all, #deep_transform_all

Constructor Details

#initialize(*query) ⇒ Query

takes a string query or a pre-parsed query list



6
7
8
# File 'lib/rbpath/query.rb', line 6

def initialize(*query)
  @query = parse_query_list(query)
end

Instance Method Details

#parse_query_list(query) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
# File 'lib/rbpath/query.rb', line 25

def parse_query_list(query)
  query.flat_map do |part|
    case part
    when String, Symbol
      parse_string_query(part.to_s)
    when Regexp
      {multi: false, neg: false, keys: [], regexp: part}
    else {multi: false, neg: false, keys: [part]}
    end
  end
end

#parse_string_query(query) ⇒ Object

Parsing rules:

  • query keys are seperated by spaces, keys with spaces must be single quoted

  • brackets group keys into an NOR group

  • parens group keys into a OR group

  • valid keys names consist of [chars|nums|spaces|-|_|.], anything else can be used as a seperator inside the parens/brackets



17
18
19
20
21
22
23
# File 'lib/rbpath/query.rb', line 17

def parse_string_query(query)
  query.scan(/(\([^\)]+\)|\[[^\]]+\]|'[^']+'|[^\s]+)/)
       .flatten
       .map { |keys| { multi: /\*\*/ === keys[0..1],
                       neg:  /[\[\*]/ === keys[0],
                       keys: keys.scan(/[\w\d\s\-\_\.]+/) }}
end

#pquery(data) ⇒ Object



43
44
45
# File 'lib/rbpath/query.rb', line 43

def pquery(data)
  do_query(deep_stringify_all(data), @query, [[]]).map(&:flatten)
end

#query(data) ⇒ Object



37
38
39
40
41
# File 'lib/rbpath/query.rb', line 37

def query(data)
  data = deep_stringify_all(data)
  do_query(data, @query, [[]]).map(&:flatten)
                              .map { |path| get_value(data, path) }
end

#values_at(data, paths) ⇒ Object



47
48
49
# File 'lib/rbpath/query.rb', line 47

def values_at(data, paths)
  paths.map {|path| get_value(deep_stringify_all(data), path) }
end