Class: RbPath::Query
Instance Method Summary collapse
-
#initialize(*query) ⇒ Query
constructor
takes a string query or a pre-parsed query list.
- #parse_query_list(query) ⇒ Object
-
#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.
- #pquery(data) ⇒ Object
- #query(data) ⇒ Object
- #values_at(data, paths) ⇒ Object
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 |