predicate 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/predicate.rb +4 -0
- data/lib/predicate/sequel/to_sequel.rb +13 -1
- data/lib/predicate/version.rb +1 -1
- data/spec/predicate/test_evaluate.rb +9 -0
- data/spec/sequel/test_to_sequel.rb +24 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6f717f6bf0c4cddf18b0a7762f6a85dd47200ec21c274fb974755319862420f1
|
4
|
+
data.tar.gz: 48ce7004023d6121f650ab05d9893c2d25ff3a60324450b773ec4629e643b752
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb29761546c30faca593aa4dd5749367fce9e3a3d85404a49d32db310c73471a9008b01f046828070583cb043f3142e1e10688be06a2a5dca4d318c144b1f33a
|
7
|
+
data.tar.gz: d8852634d7c9d33199544fa2ee0ef70f92198b379d6f7e6ed670d40266e8799e7ff7d804551cb1bcaf19c4b6390715217e665e8a03b4c50a5213be10c3e3c626
|
data/lib/predicate.rb
CHANGED
@@ -94,6 +94,10 @@ class Predicate
|
|
94
94
|
expr.evaluate(tuple)
|
95
95
|
end
|
96
96
|
|
97
|
+
def call(tuple)
|
98
|
+
expr.evaluate(tuple)
|
99
|
+
end
|
100
|
+
|
97
101
|
# Splits this predicate, say P, as too predicates P1 & P2
|
98
102
|
# such that `P <=> P1 & P2` and P2 makes no reference to
|
99
103
|
# any attribute in `attr_list`.
|
@@ -48,7 +48,19 @@ class Predicate
|
|
48
48
|
def on_in(sexpr)
|
49
49
|
left, right = apply(sexpr.identifier), sexpr.right
|
50
50
|
if right.literal?
|
51
|
-
|
51
|
+
values = Array(right.value).uniq
|
52
|
+
if values.include?(nil)
|
53
|
+
nonnil = values.compact
|
54
|
+
if nonnil.empty?
|
55
|
+
::Sequel.expr(left => nil)
|
56
|
+
elsif nonnil.size == 1
|
57
|
+
::Sequel.expr(left => nil) | ::Sequel.expr(left => nonnil.first)
|
58
|
+
else
|
59
|
+
::Sequel.expr(left => nil) | ::Sequel.expr(left => nonnil)
|
60
|
+
end
|
61
|
+
else
|
62
|
+
::Sequel.expr(left => right.value)
|
63
|
+
end
|
52
64
|
elsif right.opaque?
|
53
65
|
::Sequel.expr(left => apply(right))
|
54
66
|
else
|
data/lib/predicate/version.rb
CHANGED
@@ -216,5 +216,14 @@ class Predicate
|
|
216
216
|
end
|
217
217
|
end
|
218
218
|
|
219
|
+
context 'has a call alias' do
|
220
|
+
let(:predicate){
|
221
|
+
Predicate.new(Factory.gte(:x => 0))
|
222
|
+
}
|
223
|
+
|
224
|
+
let(:scope){ { x: 2 } }
|
225
|
+
|
226
|
+
it{ expect(predicate.call(scope)).to be(true) }
|
227
|
+
end
|
219
228
|
end
|
220
229
|
end
|
@@ -85,6 +85,30 @@ class Predicate
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
+
context 'in with nil among values' do
|
89
|
+
let(:predicate) { Predicate.in(:price, [nil, 10.0, 17.99]) }
|
90
|
+
|
91
|
+
it 'works as expected' do
|
92
|
+
expect(subject).to eql("SELECT * FROM `items` WHERE ((`price` IS NULL) OR (`price` IN (10.0, 17.99)))")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'in with nil among values that can be simplified' do
|
97
|
+
let(:predicate) { Predicate.in(:price, [nil, 17.99]) }
|
98
|
+
|
99
|
+
it 'works as expected' do
|
100
|
+
expect(subject).to eql("SELECT * FROM `items` WHERE ((`price` IS NULL) OR (`price` = 17.99))")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'in with only nil among values ' do
|
105
|
+
let(:predicate) { Predicate.in(:price, [nil]) }
|
106
|
+
|
107
|
+
it 'works as expected' do
|
108
|
+
expect(subject).to eql("SELECT * FROM `items` WHERE (`price` IS NULL)")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
88
112
|
context 'in with something responding to sql_literal' do
|
89
113
|
let(:operand){
|
90
114
|
Object.new.tap{|o|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: predicate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sexpr
|
@@ -204,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
204
|
version: '0'
|
205
205
|
requirements: []
|
206
206
|
rubyforge_project:
|
207
|
-
rubygems_version: 2.
|
207
|
+
rubygems_version: 2.7.6
|
208
208
|
signing_key:
|
209
209
|
specification_version: 4
|
210
210
|
summary: Predicate provides a simple class and processors to encode and manipulate
|