mongo-parser-rb 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1 -1
- data/lib/mongo-parser-rb/query.rb +7 -1
- data/lib/mongo-parser-rb/query/expression.rb +21 -2
- data/lib/mongo-parser-rb/version.rb +1 -1
- data/test/mongo-parser-rb/query_test.rb +30 -2
- metadata +7 -9
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2ca72a97d873ee39341d3940cd420c4356d3f36d
|
4
|
+
data.tar.gz: 8cd517a154c3e5f8f0777c8160565cc39b413ad9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 248798735c41f7905a3d24cf26986161715fd97d60e1b15b7b84c53535efa2a57a6aa0201680fee05329ab3bbd93fb5a00e578b3d9fdae8e8a0e643aaf8905db
|
7
|
+
data.tar.gz: 86e95e493e18b9e524f5ff7a1da9cfc66a5c6b502bea4ca6ea68ce92aa37f719264b2d66365a0655493bd19175322b871eca9561439bd745c396d0de87db2bad
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ q.matches_document?({:comment_count => 11}) => false
|
|
23
23
|
q.matches_document?({:comment_count => 6}) => true
|
24
24
|
```
|
25
25
|
|
26
|
-
The following operators are currently supported: `$and`, `$or`, `$in`, `$nin`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`.
|
26
|
+
The following operators are currently supported: `$and`, `$or`, `$in`, `$nin`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$not`.
|
27
27
|
|
28
28
|
Regexps are also supported:
|
29
29
|
|
@@ -41,12 +41,18 @@ module MongoParserRB
|
|
41
41
|
parse_sub_expression(key, value, field)
|
42
42
|
end)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def parse_sub_expression(key, value, field = nil)
|
46
46
|
if Expression.operator?(key)
|
47
47
|
case key
|
48
48
|
when *Expression.conjunction_operators
|
49
49
|
Expression.new(key, value.map { |v| parse_root_expression(v) })
|
50
|
+
when *Expression.inversion_operators
|
51
|
+
if value.kind_of?(Hash)
|
52
|
+
Expression.new(:$not, field, parse_root_expression(value, field))
|
53
|
+
else
|
54
|
+
Expression.new(:$not, field, Expression.new(:$eq, field, value))
|
55
|
+
end
|
50
56
|
else
|
51
57
|
Expression.new(key, field, value)
|
52
58
|
end
|
@@ -4,6 +4,16 @@ module MongoParserRB
|
|
4
4
|
|
5
5
|
class << self
|
6
6
|
|
7
|
+
def inversion_operators
|
8
|
+
@inversion_operators ||= [
|
9
|
+
:$not
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
def inversion_operator?(operator)
|
14
|
+
inversion_operators.include?(operator)
|
15
|
+
end
|
16
|
+
|
7
17
|
def conjunction_operators
|
8
18
|
@conjunction_operators ||= [
|
9
19
|
:$and,
|
@@ -38,7 +48,7 @@ module MongoParserRB
|
|
38
48
|
end
|
39
49
|
|
40
50
|
def operator?(operator)
|
41
|
-
equality_operator?(operator) || conjunction_operator?(operator)
|
51
|
+
equality_operator?(operator) || conjunction_operator?(operator) || inversion_operator?(operator)
|
42
52
|
end
|
43
53
|
|
44
54
|
end
|
@@ -46,7 +56,7 @@ module MongoParserRB
|
|
46
56
|
def initialize(operator, *args)
|
47
57
|
@operator = operator
|
48
58
|
|
49
|
-
if Expression.conjunction_operator?
|
59
|
+
if Expression.conjunction_operator?(@operator)
|
50
60
|
@arguments = args[0]
|
51
61
|
else
|
52
62
|
@field = Field.new(args[0])
|
@@ -62,6 +72,8 @@ module MongoParserRB
|
|
62
72
|
evaluate_negative_equality(document)
|
63
73
|
when *Expression.equality_operators
|
64
74
|
evaluate_equality(document)
|
75
|
+
when *Expression.inversion_operators
|
76
|
+
evaluate_inversion(document)
|
65
77
|
end
|
66
78
|
rescue NoMethodError, TypeError
|
67
79
|
false
|
@@ -69,6 +81,13 @@ module MongoParserRB
|
|
69
81
|
|
70
82
|
private
|
71
83
|
|
84
|
+
def evaluate_inversion(document)
|
85
|
+
# Mongo negative equality operators return true when
|
86
|
+
# the specified field does not exist on a document.
|
87
|
+
return true if !@field.value_in_document(document) && !@field.in_document?(document)
|
88
|
+
!@arguments.evaluate(document)
|
89
|
+
end
|
90
|
+
|
72
91
|
def evaluate_conjunction(document)
|
73
92
|
case @operator
|
74
93
|
when :$and
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class QueryTest < MiniTest::Unit::TestCase
|
4
|
-
|
5
4
|
def test_raises_if_not_parsed
|
6
5
|
assert_raises(MongoParserRB::NotParsedError) do
|
7
6
|
query = MongoParserRB::Query.new(:integer_key => 10)
|
@@ -28,6 +27,22 @@ class QueryTest < MiniTest::Unit::TestCase
|
|
28
27
|
refute query.matches_document?(:integer_key => 9)
|
29
28
|
end
|
30
29
|
|
30
|
+
def test_integer_not_gt
|
31
|
+
query = MongoParserRB::Query.parse(:integer_key => {:$not => {:$gt => 10}})
|
32
|
+
refute query.matches_document?(:integer_key => 11)
|
33
|
+
assert query.matches_document?(:integer_key => 10)
|
34
|
+
assert query.matches_document?(:integer_key => 9)
|
35
|
+
assert query.matches_document?({})
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_integer_not_gt_or_lt
|
39
|
+
query = MongoParserRB::Query.parse(:integer_key => {:$not => {:$gt => 8, :$lt => 10}})
|
40
|
+
assert query.matches_document?(:integer_key => 6)
|
41
|
+
assert query.matches_document?(:integer_key => 11)
|
42
|
+
refute query.matches_document?(:integer_key => 9)
|
43
|
+
assert query.matches_document?({})
|
44
|
+
end
|
45
|
+
|
31
46
|
def test_integer_lt
|
32
47
|
query = MongoParserRB::Query.parse(:integer_key => {:$lt => 10})
|
33
48
|
query.matches_document?(:integer_key => 9)
|
@@ -135,6 +150,14 @@ class QueryTest < MiniTest::Unit::TestCase
|
|
135
150
|
refute query.matches_document?(:integer_key => 3)
|
136
151
|
end
|
137
152
|
|
153
|
+
def test_integer_in_and_ne
|
154
|
+
query = MongoParserRB::Query.parse(:integer_key => {:$in => [1,2,3], :$ne => 3})
|
155
|
+
assert query.matches_document?(:integer_key => 1)
|
156
|
+
assert query.matches_document?(:integer_key => 2)
|
157
|
+
refute query.matches_document?(:integer_key => 3)
|
158
|
+
refute query.matches_document?(:integer_key => 4)
|
159
|
+
end
|
160
|
+
|
138
161
|
def test_eq_nil
|
139
162
|
query = MongoParserRB::Query.parse(:string_key => nil)
|
140
163
|
assert query.matches_document?(:string_key => nil)
|
@@ -160,6 +183,12 @@ class QueryTest < MiniTest::Unit::TestCase
|
|
160
183
|
refute query.matches_document?(:string_key => 'world')
|
161
184
|
end
|
162
185
|
|
186
|
+
def test_regex_not_eq
|
187
|
+
query = MongoParserRB::Query.parse(:string_key => {:$not => /hello/})
|
188
|
+
assert query.matches_document?(:string_key => 'world')
|
189
|
+
refute query.matches_document?(:string_key => 'hello world')
|
190
|
+
end
|
191
|
+
|
163
192
|
def test_operator_data_type_mismatch
|
164
193
|
query = MongoParserRB::Query.parse(:array_key => {:$in => [1]})
|
165
194
|
refute query.matches_document?(:array_key => "hey")
|
@@ -195,5 +224,4 @@ class QueryTest < MiniTest::Unit::TestCase
|
|
195
224
|
query = MongoParserRB::Query.parse(:integer_key => {:$gt => 5})
|
196
225
|
refute query.matches_document?(:integer_key => "hello")
|
197
226
|
end
|
198
|
-
|
199
227
|
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo-parser-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.9
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ben McRedmond
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-31 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Parse and evaluate mongo queries in Ruby
|
15
14
|
email:
|
@@ -36,27 +35,26 @@ files:
|
|
36
35
|
- test/test_helper.rb
|
37
36
|
homepage: ''
|
38
37
|
licenses: []
|
38
|
+
metadata: {}
|
39
39
|
post_install_message:
|
40
40
|
rdoc_options: []
|
41
41
|
require_paths:
|
42
42
|
- lib
|
43
43
|
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
-
none: false
|
45
44
|
requirements:
|
46
|
-
- -
|
45
|
+
- - '>='
|
47
46
|
- !ruby/object:Gem::Version
|
48
47
|
version: '0'
|
49
48
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
49
|
requirements:
|
52
|
-
- -
|
50
|
+
- - '>='
|
53
51
|
- !ruby/object:Gem::Version
|
54
52
|
version: '0'
|
55
53
|
requirements: []
|
56
54
|
rubyforge_project:
|
57
|
-
rubygems_version:
|
55
|
+
rubygems_version: 2.0.14
|
58
56
|
signing_key:
|
59
|
-
specification_version:
|
57
|
+
specification_version: 4
|
60
58
|
summary: Parse and evaluate mongo queries in Ruby
|
61
59
|
test_files:
|
62
60
|
- test/mongo-parser-rb/field_test.rb
|