ninjudd-model_set 0.10.4 → 0.10.5

Sign up to get free protection for your applications and to get access to all the features.
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