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 CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 4
3
- :major: 0
4
2
  :minor: 10
3
+ :patch: 5
4
+ :major: 0
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
- filtered_ids << model.send(id_field) if yield model
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
- model_ids.reorder!(sorted_ids)
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
- model_ids.reorder!(sorted_ids)
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
@@ -27,6 +27,10 @@ class ModelSet
27
27
  clear_limited_cache!
28
28
  end
29
29
 
30
+ def limit_enabled?
31
+ true # Override if limit is not possible for subclass.
32
+ end
33
+
30
34
  def limit!(limit, offset = nil)
31
35
  @limit = limit ? limit.to_i : nil
32
36
  @offset = offset ? offset.to_i : nil
@@ -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
@@ -24,7 +24,7 @@ class ModelSet
24
24
  end
25
25
 
26
26
  def sanitize_condition(condition)
27
- ActiveRecord::Base.send(:sanitize_sql, condition)
27
+ model_class.send(:sanitize_sql, condition)
28
28
  end
29
29
 
30
30
  def limit_clause
@@ -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 @sort_order
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)
@@ -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
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-07-01 00:00:00 -07:00
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.2.0
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