squeel 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/squeel/nodes/join.rb +5 -0
- data/lib/squeel/nodes/key_path.rb +15 -1
- data/lib/squeel/nodes/sifter.rb +13 -0
- data/lib/squeel/nodes/stub.rb +6 -0
- data/lib/squeel/version.rb +1 -1
- data/spec/squeel/nodes/key_path_spec.rb +6 -0
- data/spec/squeel/nodes/stub_spec.rb +6 -0
- data/spec/squeel/visitors/predicate_visitor_spec.rb +9 -0
- metadata +16 -16
data/lib/squeel/nodes/join.rb
CHANGED
@@ -109,7 +109,21 @@ module Squeel
|
|
109
109
|
# @param other The right hand side of the operation
|
110
110
|
# @return [Operation] An operation with the given custom operator, the KeyPath on its left and the other object on the right.
|
111
111
|
def op(operator, other)
|
112
|
-
endpoint.respond_to?(:op) ? super : no_method_error(
|
112
|
+
endpoint.respond_to?(:op) ? super : no_method_error(:op)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Allow KeyPath to have a sifter as its endpoint, if the endpoint is a
|
116
|
+
# chainable node (Stub or Join)
|
117
|
+
# @param [Symbol] name The name of the sifter
|
118
|
+
# @return [KeyPath] This keypath, with a sifter as its endpoint
|
119
|
+
def sift(name, *args)
|
120
|
+
if Stub === endpoint || Join === endpoint
|
121
|
+
@path << endpoint
|
122
|
+
@endpoint = Sifter.new(name, args)
|
123
|
+
self
|
124
|
+
else
|
125
|
+
no_method_error :sift
|
126
|
+
end
|
113
127
|
end
|
114
128
|
|
115
129
|
# Set the absolute flag on this KeyPath
|
data/lib/squeel/nodes/sifter.rb
CHANGED
@@ -9,6 +9,19 @@ module Squeel
|
|
9
9
|
@name, @args = name, args
|
10
10
|
end
|
11
11
|
|
12
|
+
# Implemented for equality testing
|
13
|
+
def hash
|
14
|
+
[name, args].hash
|
15
|
+
end
|
16
|
+
|
17
|
+
# Compare with other objects
|
18
|
+
def eql?(other)
|
19
|
+
self.class.eql?(other.class) &&
|
20
|
+
self.name.eql?(other.name) &&
|
21
|
+
self.args.eql?(other.args)
|
22
|
+
end
|
23
|
+
alias :== :eql?
|
24
|
+
|
12
25
|
end
|
13
26
|
end
|
14
27
|
end
|
data/lib/squeel/nodes/stub.rb
CHANGED
@@ -108,6 +108,12 @@ module Squeel
|
|
108
108
|
Join.new(self.symbol, Arel::InnerJoin)
|
109
109
|
end
|
110
110
|
|
111
|
+
# Create a keypath with a sifter as its endpoint
|
112
|
+
# @return [KeyPath] The new KeyPath
|
113
|
+
def sift(name, *args)
|
114
|
+
KeyPath.new(self, Sifter.new(name, args))
|
115
|
+
end
|
116
|
+
|
111
117
|
# Create an outer Join node for the association named by this Stub
|
112
118
|
# @return [Join] The new outer Join node
|
113
119
|
def outer
|
data/lib/squeel/version.rb
CHANGED
@@ -55,6 +55,12 @@ module Squeel
|
|
55
55
|
as.right.should eq 'other_name'
|
56
56
|
end
|
57
57
|
|
58
|
+
it 'creates sifter nodes with #sift' do
|
59
|
+
@k.sift(:blah, 1)
|
60
|
+
sifter = @k.endpoint
|
61
|
+
sifter.should be_a Sifter
|
62
|
+
end
|
63
|
+
|
58
64
|
it 'creates AND nodes with & if the endpoint responds to &' do
|
59
65
|
node = @k.third.fourth.eq('Bob') & Stub.new(:attr).eq('Joe')
|
60
66
|
node.should be_a And
|
@@ -39,6 +39,12 @@ module Squeel
|
|
39
39
|
keypath.path_with_endpoint.should eq [@s, Join.new(:another, Arel::InnerJoin, Person)]
|
40
40
|
end
|
41
41
|
|
42
|
+
it 'creates a KeyPath with a sifter endpoint when sent #sift' do
|
43
|
+
keypath = @s.sift(:blah, 1)
|
44
|
+
keypath.should be_a KeyPath
|
45
|
+
keypath.path_with_endpoint.should eq [@s, Sifter.new(:blah, [1])]
|
46
|
+
end
|
47
|
+
|
42
48
|
it 'creates an absolute keypath with just an endpoint with ~' do
|
43
49
|
node = ~@s
|
44
50
|
node.should be_a KeyPath
|
@@ -272,6 +272,15 @@ module Squeel
|
|
272
272
|
expr.right.to_sql.should match /"children_people"."name" LIKE '%smith'/
|
273
273
|
end
|
274
274
|
|
275
|
+
it 'visits sifters in a keypath' do
|
276
|
+
predicate = @v.accept(dsl {children.sift(:name_starts_or_ends_with, 'smith')})
|
277
|
+
predicate.should be_a Arel::Nodes::Grouping
|
278
|
+
expr = predicate.expr
|
279
|
+
expr.should be_a Arel::Nodes::Or
|
280
|
+
expr.left.to_sql.should match /"children_people"."name" LIKE 'smith%'/
|
281
|
+
expr.right.to_sql.should match /"children_people"."name" LIKE '%smith'/
|
282
|
+
end
|
283
|
+
|
275
284
|
it 'honors an explicit table in string keys' do
|
276
285
|
predicate = @v.accept('things.attribute' => 'retro')
|
277
286
|
predicate.should be_a Arel::Nodes::Equality
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: squeel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-09-
|
12
|
+
date: 2011-09-29 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70246229519260 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70246229519260
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
requirement: &
|
27
|
+
requirement: &70246229518440 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '3.0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70246229518440
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: polyamorous
|
38
|
-
requirement: &
|
38
|
+
requirement: &70246229517800 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.5.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70246229517800
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &70246229517260 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.6.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70246229517260
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: machinist
|
60
|
-
requirement: &
|
60
|
+
requirement: &70246229516760 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.0.6
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70246229516760
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: faker
|
71
|
-
requirement: &
|
71
|
+
requirement: &70246229516300 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 0.9.5
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70246229516300
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: sqlite3
|
82
|
-
requirement: &
|
82
|
+
requirement: &70246229515840 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ~>
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: 1.3.3
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70246229515840
|
91
91
|
description: ! "\n Squeel unlocks the power of ARel in your Rails 3 application
|
92
92
|
with\n a handy block-based syntax. You can write subqueries, access named\n
|
93
93
|
\ functions provided by your RDBMS, and more, all without writing\n SQL
|