Skip to content

Commit

Permalink
Adding mapping filter to JsonQuery.
Browse files Browse the repository at this point in the history
  • Loading branch information
jcoglan committed Jan 11, 2009
1 parent 03ac05a commit 7489bfa
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 3 deletions.
61 changes: 59 additions & 2 deletions lib/json_query.rb
Expand Up @@ -227,8 +227,14 @@ def _nt_filter
r0 = r2
r0.extend(Filter)
else
self.index = i0
r0 = nil
r3 = _nt_map_filter
if r3
r0 = r3
r0.extend(Filter)
else
self.index = i0
r0 = nil
end
end
end

Expand Down Expand Up @@ -488,6 +494,57 @@ def _nt_boolean_filter
return r0
end

module MapFilter0
def expression
elements[1]
end

end

def _nt_map_filter
start_index = index
if node_cache[:map_filter].has_key?(index)
cached = node_cache[:map_filter][index]
@index = cached.interval.end if cached
return cached
end

i0, s0 = index, []
if input.index("[=", index) == index
r1 = (SyntaxNode).new(input, index...(index + 2))
@index += 2
else
terminal_parse_failure("[=")
r1 = nil
end
s0 << r1
if r1
r2 = _nt_expression
s0 << r2
if r2
if input.index("]", index) == index
r3 = (SyntaxNode).new(input, index...(index + 1))
@index += 1
else
terminal_parse_failure("]")
r3 = nil
end
s0 << r3
end
end
if s0.last
r0 = (MapFilter).new(input, i0...index, s0)
r0.extend(MapFilter0)
else
self.index = i0
r0 = nil
end

node_cache[:map_filter][start_index] = r0

return r0
end

def _nt_boolean_expression
start_index = index
if node_cache[:boolean_expression].has_key?(index)
Expand Down
6 changes: 5 additions & 1 deletion lib/json_query.tt
Expand Up @@ -24,7 +24,7 @@ grammar JsonQuery
end

rule filter
(field_access / boolean_filter) <Filter>
(field_access / boolean_filter / map_filter) <Filter>
end

rule field_access
Expand All @@ -43,6 +43,10 @@ grammar JsonQuery
"[?" boolean_expression "]" <BooleanFilter>
end

rule map_filter
"[=" expression "]" <MapFilter>
end

rule boolean_expression
or_expression / and_expression / boolean_atom
end
Expand Down
8 changes: 8 additions & 0 deletions lib/json_query/nodes.rb
Expand Up @@ -84,6 +84,14 @@ def value(list, root, symbols, current = nil)
end
end

class MapFilter < Treetop::Runtime::SyntaxNode
def value(list, root, symbols, current = nil)
list.map do |object|
expression.value(root, symbols, object)
end
end
end

class And < Treetop::Runtime::SyntaxNode
def value(root, symbols, current = nil)
first.value(root, symbols, current) && second.value(root, symbols, current)
Expand Down
3 changes: 3 additions & 0 deletions test/test_siren.rb
Expand Up @@ -101,6 +101,9 @@ def test_json_query

assert_equal ["Sayings of the Century", "The Lord of the Rings"],
Siren.query("$.store.book[0,3]", fixtures(:store)).map { |b| b["title"] }

assert_equal fixtures(:store)["store"]["book"].map { |b| b["title"] },
Siren.query("$.store.book[= @.title ]", fixtures(:store))
end
end

0 comments on commit 7489bfa

Please sign in to comment.