sample_models 1.2.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,146 +0,0 @@
1
- class ARQuery
2
- attr_reader :joins
3
-
4
- def initialize(simple_values={})
5
- @simple_values = simple_values
6
- @base_condition = Condition.new self
7
- @joins = UniqueArray.new simple_values[:joins]
8
- end
9
-
10
- def method_missing(sym, *args)
11
- if sym == :total_entries=
12
- @simple_values[:total_entries] = args.first
13
- elsif [:has_conditions?, :boolean_join=].include?(sym)
14
- @base_condition.send(sym, *args)
15
- else
16
- super
17
- end
18
- end
19
-
20
- def add_condition(&block)
21
- if @base_condition.has_conditions?
22
- @base_condition.add_condition do |nested|
23
- block.call nested
24
- end
25
- else
26
- block.call @base_condition
27
- end
28
- end
29
-
30
- def condition_bind_vars
31
- @base_condition.bind_vars
32
- end
33
-
34
- def condition_bind_vars=(arg)
35
- @base_condition.bind_vars = arg
36
- end
37
-
38
- def condition_sqls
39
- @base_condition.sqls
40
- end
41
-
42
- def conditions
43
- @base_condition
44
- end
45
-
46
- def to_hash
47
- hash = @simple_values.dup
48
- hash[:conditions] = @base_condition.to_conditions if has_conditions?
49
- joins = @joins
50
- if includes = @simple_values[:include]
51
- if includes.is_a?(Array)
52
- joins = joins.reject { |join|
53
- includes.any? { |inc| inc.to_sym == join.to_sym }
54
- }
55
- else
56
- joins = joins.reject { |join| includes.to_sym == join.to_sym }
57
- end
58
- end
59
- hash[:joins] = joins unless joins.empty?
60
- hash
61
- end
62
-
63
- class Condition
64
- attr_accessor :bind_vars, :boolean_join
65
- attr_reader :ar_query, :sqls
66
-
67
- def initialize(ar_query)
68
- @ar_query = ar_query
69
- @bind_vars = []
70
- @sqls = SQLs.new
71
- @boolean_join = :and
72
- @children = []
73
- end
74
-
75
- def []=(attr, value)
76
- @sqls << "#{attr} = ?"
77
- @bind_vars << value
78
- end
79
-
80
- def add_condition(&block)
81
- if has_conditions?
82
- @children << Condition.new(@ar_query)
83
- yield @children.last
84
- else
85
- yield self
86
- end
87
- end
88
-
89
- def has_conditions?
90
- !@sqls.empty?
91
- end
92
-
93
- def to_conditions
94
- join_str = @boolean_join == :and ? ' AND ' : ' OR '
95
- binds = @bind_vars.dup || []
96
- condition_sql_fragments = @sqls.map { |c_sql| "(#{c_sql})" }
97
- @children.each do |child|
98
- sub_conditions = child.to_conditions
99
- if sub_conditions
100
- if sub_conditions.is_a?(Array)
101
- sql = sub_conditions.first
102
- sub_binds = sub_conditions[1..-1]
103
- condition_sql_fragments << "(#{sql})"
104
- binds.concat sub_binds
105
- else
106
- condition_sql_fragments << "(#{sub_conditions})"
107
- end
108
- end
109
- end
110
- condition_sql = condition_sql_fragments.join(join_str)
111
- if binds.empty?
112
- condition_sql unless condition_sql == ''
113
- else
114
- [ condition_sql, *binds ]
115
- end
116
- end
117
-
118
- class SQLs < Array
119
- def <<(elt)
120
- if elt.is_a?(String)
121
- super
122
- else
123
- raise(
124
- ArgumentError,
125
- "Tried appending #{elt.inspect} to ARQuery::Condition::SQLs: Only strings are allowed"
126
- )
127
- end
128
- end
129
- end
130
- end
131
-
132
- class UniqueArray < Array
133
- def initialize(values)
134
- super()
135
- if values
136
- values = [values] unless values.is_a?(Array)
137
- values.each do |value| self << value; end
138
- end
139
- end
140
-
141
- def <<(value)
142
- super
143
- uniq!
144
- end
145
- end
146
- end
@@ -1,318 +0,0 @@
1
- require File.dirname(__FILE__) + '/../lib/ar_query'
2
-
3
- describe ARQuery do
4
- describe '#initialize with no values' do
5
- before :all do
6
- ar_query = ARQuery.new
7
- @hash = ar_query.to_hash
8
- end
9
-
10
- it 'should not have conditions' do
11
- @hash[:conditions].should be_nil
12
- end
13
-
14
- it 'should not have joins' do
15
- @hash[:joins].should be_nil
16
- end
17
-
18
- it 'should not let you assign like a hash' do
19
- lambda {
20
- @ar_query[:conditions] = "foo = 'bar'"
21
- }.should raise_error(NoMethodError)
22
- lambda {
23
- @ar_query[:joins] = "foo = 'bar'"
24
- }.should raise_error(NoMethodError)
25
- end
26
- end
27
-
28
- describe '#initialize with values' do
29
- before :all do
30
- @ar_query = ARQuery.new(:order => 'id desc', :limit => 25)
31
- @hash = @ar_query.to_hash
32
- end
33
-
34
- it 'should have those values in the hash' do
35
- @hash[:order].should == 'id desc'
36
- @hash[:limit].should == 25
37
- end
38
-
39
- it 'should not have other values in the hash' do
40
- @hash[:conditions].should be_nil
41
- end
42
- end
43
-
44
- describe "#condition_sqls <<" do
45
- before :all do
46
- @ar_query = ARQuery.new
47
- @ar_query.condition_sqls << "fname is not null"
48
- @ar_query.condition_sqls << "lname is not null"
49
- end
50
-
51
- it 'should join the conditions with an AND' do
52
- @ar_query.to_hash[:conditions].should ==
53
- "(fname is not null) AND (lname is not null)"
54
- end
55
-
56
- it "should prevent you from appending nil" do
57
- lambda { @ar_query.condition_sqls << nil }.should raise_error(
58
- ArgumentError,
59
- "Tried appending nil to ARQuery::Condition::SQLs: Only strings are allowed"
60
- )
61
- end
62
-
63
- it "should prevent you from appending a value besides a string" do
64
- lambda { @ar_query.condition_sqls << 55 }.should raise_error(
65
- ArgumentError,
66
- "Tried appending 55 to ARQuery::Condition::SQLs: Only strings are allowed"
67
- )
68
- end
69
- end
70
-
71
- describe '#condition_sqls << with OR as the boolean join' do
72
- before :all do
73
- @ar_query = ARQuery.new
74
- @ar_query.boolean_join = :or
75
- @ar_query.condition_sqls << "fname is not null"
76
- @ar_query.condition_sqls << "lname is not null"
77
- end
78
-
79
- it 'should join the conditions with an OR' do
80
- @ar_query.to_hash[:conditions].should ==
81
- "(fname is not null) OR (lname is not null)"
82
- end
83
- end
84
-
85
- describe '#conditions hash usage << with OR as the boolean join' do
86
- before :all do
87
- @ar_query = ARQuery.new
88
- @ar_query.boolean_join = :or
89
- @ar_query.conditions[:fname] = 'John'
90
- @ar_query.conditions[:lname] = 'Doe'
91
- end
92
-
93
- it 'should join the conditions with an OR' do
94
- @ar_query.to_hash[:conditions].should == [
95
- "(fname = ?) OR (lname = ?)", 'John', 'Doe'
96
- ]
97
- end
98
- end
99
-
100
- describe '[:conditions]' do
101
- describe 'with bind vars' do
102
- before :all do
103
- @ar_query = ARQuery.new
104
- @ar_query.condition_sqls << "fname = ?"
105
- @ar_query.condition_sqls << "lname = ?"
106
- end
107
-
108
- describe 'using appends' do
109
- before :all do
110
- @ar_query.condition_bind_vars << 'Francis'
111
- @ar_query.condition_bind_vars << 'Hwang'
112
- end
113
-
114
- it 'should put the bind_vars at the end of the conditions array' do
115
- @ar_query.to_hash[:conditions].should ==
116
- [ "(fname = ?) AND (lname = ?)", 'Francis', 'Hwang' ]
117
- end
118
- end
119
-
120
- describe 'using assignment' do
121
- before :all do
122
- @ar_query.condition_bind_vars = %w( Francis Hwang )
123
- end
124
-
125
- it 'should put the bind_vars at the end of the conditions array' do
126
- @ar_query.to_hash[:conditions].should ==
127
- [ "(fname = ?) AND (lname = ?)", 'Francis', 'Hwang' ]
128
- end
129
- end
130
- end
131
-
132
- describe 'with hash setters' do
133
- before :all do
134
- @ar_query = ARQuery.new
135
- @ar_query.conditions[:fname] = 'John'
136
- @ar_query.conditions[:lname] = 'Doe'
137
- end
138
-
139
- it 'should return conditions as an array with bind vars' do
140
- @ar_query.to_hash[:conditions].should == [
141
- "(fname = ?) AND (lname = ?)", 'John', 'Doe'
142
- ]
143
- end
144
- end
145
-
146
- describe 'with a combination of hash setters and bind vars' do
147
- before :all do
148
- @ar_query = ARQuery.new
149
- @ar_query.conditions[:fname] = 'John'
150
- @ar_query.condition_sqls << "lname = ?"
151
- @ar_query.condition_bind_vars << 'Doe'
152
- end
153
-
154
- it 'should return conditions as an array with bind vars' do
155
- @ar_query.to_hash[:conditions].should == [
156
- "(fname = ?) AND (lname = ?)", 'John', 'Doe'
157
- ]
158
- end
159
- end
160
- end
161
-
162
- describe 'with a nested condition' do
163
- before :all do
164
- @ar_query = ARQuery.new
165
- @ar_query.condition_sqls << "fname = ?"
166
- @ar_query.condition_bind_vars << 'Francis'
167
- @ar_query.add_condition do |cond|
168
- cond.boolean_join = :or
169
- cond.sqls << 'lname = ?'
170
- cond.sqls << 'lname = ?'
171
- cond.bind_vars << 'Hwang'
172
- cond.bind_vars << 'Bacon'
173
- cond.ar_query.should == @ar_query
174
- end
175
- end
176
-
177
- it 'should generate nested conditions in SQL' do
178
- @ar_query.to_hash[:conditions].should == [
179
- "(fname = ?) AND ((lname = ?) OR (lname = ?))",
180
- 'Francis', 'Hwang', 'Bacon'
181
- ]
182
- end
183
- end
184
-
185
- describe 'with a nested condition using hash setters' do
186
- before :all do
187
- @ar_query = ARQuery.new
188
- @ar_query.condition_sqls << "fname = ?"
189
- @ar_query.condition_bind_vars << 'Francis'
190
- @ar_query.add_condition do |cond|
191
- cond.boolean_join = :or
192
- cond[:lname] = 'Hwang'
193
- cond[:city] = 'Brooklyn'
194
- cond.ar_query.should == @ar_query
195
- end
196
- end
197
-
198
- it 'should generate nested conditions in SQL' do
199
- @ar_query.to_hash[:conditions].should == [
200
- "(fname = ?) AND ((lname = ?) OR (city = ?))",
201
- 'Francis', 'Hwang', 'Brooklyn'
202
- ]
203
- end
204
- end
205
-
206
- describe "when using the nested condition syntax even though the query isn't nested" do
207
- before :all do
208
- @ar_query = ARQuery.new
209
- @ar_query.add_condition do |cond|
210
- cond.boolean_join = :or
211
- cond.sqls << "fname = ?"
212
- cond.bind_vars << 'Chunky'
213
- end
214
- end
215
-
216
- it 'should generate the non-nested condition in SQL' do
217
- @ar_query.to_hash[:conditions].should == ["(fname = ?)", 'Chunky']
218
- end
219
- end
220
-
221
- describe 'when nesting the nested condition unnecessarily' do
222
- before :all do
223
- @ar_query = ARQuery.new
224
- @ar_query.add_condition do |cond|
225
- cond.add_condition do |subcond|
226
- subcond.boolean_join = :or
227
- subcond.sqls << "fname = ?"
228
- subcond.bind_vars << 'Chunky'
229
- end
230
- end
231
- end
232
-
233
- it 'should generate the non-nested condition in SQL' do
234
- @ar_query.to_hash[:conditions].should == ["(fname = ?)", 'Chunky']
235
- end
236
- end
237
-
238
- describe 'when calling an empty #add_condition after already adding to condition_sqls' do
239
- before :all do
240
- @ar_query = ARQuery.new
241
- @ar_query.condition_sqls << "published = true"
242
- @ar_query.add_condition do |cond|
243
- end
244
- end
245
-
246
- it 'should not append anything to the condition' do
247
- @ar_query.to_hash[:conditions].should == '(published = true)'
248
- end
249
- end
250
-
251
- describe '#joins <<' do
252
- describe 'when there are no joins to start' do
253
- before :all do
254
- @ar_query = ARQuery.new
255
- @ar_query.joins << :user
256
- end
257
-
258
- it 'should result in an array of 1 join' do
259
- @ar_query.to_hash[:joins].should == [:user]
260
- end
261
- end
262
-
263
- describe 'when it was initialized with one join' do
264
- before :all do
265
- @ar_query = ARQuery.new :joins => :user
266
- @ar_query.joins << :tags
267
- end
268
-
269
- it 'should result in an array of 2 joins' do
270
- @ar_query.to_hash[:joins].should == [:user, :tags]
271
- end
272
- end
273
-
274
- describe 'when there are already two joins' do
275
- before :all do
276
- @ar_query = ARQuery.new :joins => [:user, :tags]
277
- @ar_query.joins << :images
278
- end
279
-
280
- it 'should result in 3 joins' do
281
- @ar_query.to_hash[:joins].should == [:user, :tags, :images]
282
- end
283
- end
284
-
285
- describe 'when a duplicate join is being appended' do
286
- before :all do
287
- @ar_query = ARQuery.new :joins => [:user, :tags]
288
- @ar_query.joins << :user
289
- end
290
-
291
- it 'should not keep the array of joins unique' do
292
- @ar_query.to_hash[:joins].should == [:user, :tags]
293
- end
294
- end
295
-
296
- describe 'when the same association has already been :included' do
297
- before :all do
298
- @ar_query = ARQuery.new :include => 'user'
299
- @ar_query.joins << :user
300
- end
301
-
302
- it 'should not include the association in the join' do
303
- @ar_query.to_hash[:joins].should be_nil
304
- end
305
- end
306
- end
307
-
308
- describe '#total_entries =' do
309
- before :all do
310
- @ar_query = ARQuery.new
311
- @ar_query.total_entries = 25
312
- end
313
-
314
- it 'should set [:total_entries]' do
315
- @ar_query.to_hash[:total_entries].should == 25
316
- end
317
- end
318
- end
File without changes
@@ -1 +0,0 @@
1
- # Uninstall hook code here