ninjudd-model_set 0.10.4 → 0.10.5
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.
- data/VERSION.yml +2 -2
- data/lib/model_set.rb +26 -9
- data/lib/model_set/query.rb +4 -0
- data/lib/model_set/set_query.rb +1 -1
- data/lib/model_set/sql_base_query.rb +1 -1
- data/lib/model_set/sql_query.rb +18 -1
- data/test/model_set_test.rb +15 -1
- metadata +4 -3
data/VERSION.yml
CHANGED
data/lib/model_set.rb
CHANGED
@@ -56,7 +56,7 @@ class ModelSet
|
|
56
56
|
query.send(action, as_ids(models))
|
57
57
|
self
|
58
58
|
end
|
59
|
-
end
|
59
|
+
end
|
60
60
|
|
61
61
|
clone_method :+, :add!
|
62
62
|
clone_method :-, :subtract!
|
@@ -68,6 +68,13 @@ class ModelSet
|
|
68
68
|
alias without! subtract!
|
69
69
|
clone_method :without
|
70
70
|
|
71
|
+
clone_method :shuffle
|
72
|
+
def shuffle!(seed = nil)
|
73
|
+
reanchor!(:set)
|
74
|
+
query.shuffle!(seed)
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
71
78
|
def include?(model)
|
72
79
|
model_id = as_id(model)
|
73
80
|
model_ids.include?(model_id)
|
@@ -168,14 +175,17 @@ class ModelSet
|
|
168
175
|
self
|
169
176
|
end
|
170
177
|
|
171
|
-
def select(&block)
|
172
|
-
self.clone.select!(&block)
|
178
|
+
def select(limit = nil, &block)
|
179
|
+
self.clone.select!(limit, &block)
|
173
180
|
end
|
174
181
|
|
175
|
-
def select!
|
182
|
+
def select!(limit = nil)
|
176
183
|
filtered_ids = []
|
177
184
|
self.each do |model|
|
178
|
-
|
185
|
+
if yield model
|
186
|
+
filtered_ids << model.send(id_field)
|
187
|
+
break if filtered_ids.size == limit
|
188
|
+
end
|
179
189
|
end
|
180
190
|
self.ids = filtered_ids
|
181
191
|
self
|
@@ -237,7 +247,7 @@ class ModelSet
|
|
237
247
|
def sort!(&block)
|
238
248
|
block ||= lambda {|a,b| a <=> b}
|
239
249
|
sorted_ids = to_a.sort(&block).collect {|m| m.id}
|
240
|
-
|
250
|
+
reorder!(sorted_ids)
|
241
251
|
self
|
242
252
|
end
|
243
253
|
|
@@ -247,7 +257,7 @@ class ModelSet
|
|
247
257
|
|
248
258
|
def sort_by!(&block)
|
249
259
|
sorted_ids = to_a.sort_by(&block).collect {|m| m.id}
|
250
|
-
|
260
|
+
reorder!(sorted_ids)
|
251
261
|
self
|
252
262
|
end
|
253
263
|
|
@@ -340,6 +350,13 @@ class ModelSet
|
|
340
350
|
end
|
341
351
|
self
|
342
352
|
end
|
353
|
+
|
354
|
+
def reanchor!(type = default_query_type, *args)
|
355
|
+
# Force anchoring even if you are already anchored to this type.
|
356
|
+
return unless type
|
357
|
+
self.query = query_class(type).new(self, *args)
|
358
|
+
self
|
359
|
+
end
|
343
360
|
|
344
361
|
def default_query_type
|
345
362
|
:sql
|
@@ -364,6 +381,7 @@ class ModelSet
|
|
364
381
|
|
365
382
|
# Use the default query engine if the the current engine doesn't respond to the method.
|
366
383
|
anchor!(default_query_type) unless query.respond_to?(method_name)
|
384
|
+
anchor!(:set) if [:limit!, :page!].include?(method_name) and not query.limit_enabled?
|
367
385
|
|
368
386
|
query.send(method_name, *args)
|
369
387
|
self
|
@@ -379,7 +397,6 @@ class ModelSet
|
|
379
397
|
|
380
398
|
def add_fields!(fields)
|
381
399
|
raise 'cannot use both add_fields and include_models' if @included_models
|
382
|
-
|
383
400
|
( @add_fields ||= {} ).merge!(fields)
|
384
401
|
|
385
402
|
# We have to reload the models because we are adding additional fields.
|
@@ -464,7 +481,7 @@ class ModelSet
|
|
464
481
|
end
|
465
482
|
|
466
483
|
def self.find_by_sql(sql)
|
467
|
-
query = RawSQLQuery.new
|
484
|
+
query = RawSQLQuery.new(self)
|
468
485
|
query.sql = sql
|
469
486
|
new(query)
|
470
487
|
end
|
data/lib/model_set/query.rb
CHANGED
data/lib/model_set/set_query.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class ModelSet
|
2
2
|
class SetQuery < Query
|
3
|
-
delegate :add!, :unshift!, :subtract!, :intersect!, :reorder!, :reverse!, :reverse_reorder!, :to => :set
|
3
|
+
delegate :add!, :unshift!, :subtract!, :intersect!, :reorder!, :reverse!, :reverse_reorder!, :shuffle!, :to => :set
|
4
4
|
|
5
5
|
def anchor!(query)
|
6
6
|
@set = query.ids.to_ordered_set
|
data/lib/model_set/sql_query.rb
CHANGED
@@ -8,9 +8,23 @@ class ModelSet
|
|
8
8
|
else
|
9
9
|
sql = ids_clause(query.ids)
|
10
10
|
end
|
11
|
+
@reorder = query.ids
|
11
12
|
add_conditions!(sql)
|
12
13
|
end
|
13
14
|
|
15
|
+
def ids
|
16
|
+
if @ids.nil?
|
17
|
+
@ids = fetch_id_set(sql)
|
18
|
+
@ids.reorder!(@reorder) if @reorder
|
19
|
+
end
|
20
|
+
@ids
|
21
|
+
end
|
22
|
+
|
23
|
+
def limit_enabled?
|
24
|
+
return false if @reorder
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
14
28
|
def aggregate(query, opts = {})
|
15
29
|
sql = "SELECT #{query} #{from_clause}"
|
16
30
|
sql << " LIMIT #{opts[:limit]}" if opts[:limit]
|
@@ -39,11 +53,14 @@ class ModelSet
|
|
39
53
|
|
40
54
|
@sort_join = sanitize_condition(opts[:join])
|
41
55
|
@sort_order = args
|
56
|
+
@reorder = nil
|
42
57
|
clear_cache!
|
43
58
|
end
|
44
59
|
|
45
60
|
def reverse!
|
46
|
-
if @
|
61
|
+
if @reorder
|
62
|
+
@reorder.reverse!
|
63
|
+
elsif @sort_order
|
47
64
|
@sort_order.collect! do |sub_order|
|
48
65
|
if sub_order =~ / DESC$/i
|
49
66
|
sub_order.slice(0..-6)
|
data/test/model_set_test.rb
CHANGED
@@ -106,6 +106,20 @@ class ModelSetTest < Test::Unit::TestCase
|
|
106
106
|
assert_equal [captain.id, spidey.id, ironman.id], set.ids
|
107
107
|
end
|
108
108
|
|
109
|
+
should "maintain initial order when adding conditions" do
|
110
|
+
captain = Hero.create(:name => 'Captain America', :universe => 'Marvel')
|
111
|
+
spidey = Hero.create(:name => 'Spider Man', :universe => 'Marvel')
|
112
|
+
batman = Hero.create(:name => 'Batman', :universe => 'D.C.' )
|
113
|
+
superman = Hero.create(:name => 'Superman', :universe => 'D.C.' )
|
114
|
+
ironman = Hero.create(:name => 'Iron Man', :universe => 'Marvel')
|
115
|
+
|
116
|
+
set = HeroSet.new([ironman, captain, superman, spidey, batman])
|
117
|
+
|
118
|
+
set.add_conditions!("universe = 'Marvel'")
|
119
|
+
|
120
|
+
assert_equal [ironman.id, captain.id, spidey.id], set.ids
|
121
|
+
end
|
122
|
+
|
109
123
|
should "order and reverse set" do
|
110
124
|
captain = Hero.create(:name => 'Captain America', :universe => 'Marvel')
|
111
125
|
spidey = Hero.create(:name => 'Spider Man', :universe => 'Marvel')
|
@@ -135,7 +149,7 @@ class ModelSetTest < Test::Unit::TestCase
|
|
135
149
|
set.reverse!
|
136
150
|
assert_equal ids.reverse, set.ids
|
137
151
|
end
|
138
|
-
|
152
|
+
|
139
153
|
should "have missing ids" do
|
140
154
|
missing_id = 5555
|
141
155
|
spidey = Hero.create(:name => 'Spider Man', :universe => 'Marvel')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ninjudd-model_set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Balthrop
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-08-18 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- vendor/sphinx_client/tasks/sphinx.rake
|
126
126
|
has_rdoc: true
|
127
127
|
homepage: http://github.com/ninjudd/model_set
|
128
|
+
licenses:
|
128
129
|
post_install_message:
|
129
130
|
rdoc_options:
|
130
131
|
- --inline-source
|
@@ -146,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
147
|
requirements: []
|
147
148
|
|
148
149
|
rubyforge_project:
|
149
|
-
rubygems_version: 1.
|
150
|
+
rubygems_version: 1.3.5
|
150
151
|
signing_key:
|
151
152
|
specification_version: 2
|
152
153
|
summary: Easy manipulation of sets of ActiveRecord models
|