mongoid 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.8
1
+ 0.7.9
@@ -64,8 +64,9 @@ module Mongoid #:nodoc:
64
64
  #
65
65
  # Returns: <tt>Integer</tt>
66
66
  def count(klass = nil)
67
+ return @count if @count
67
68
  @klass = klass if klass
68
- return @klass.collection.find(@selector, @options).count
69
+ return @klass.collection.find(@selector, @options.dup).count
69
70
  end
70
71
 
71
72
  # Adds a criterion to the +Criteria+ that specifies values that are not allowed
@@ -100,13 +101,17 @@ module Mongoid #:nodoc:
100
101
  # objects of the type of class provided.
101
102
  def execute(klass = nil)
102
103
  @klass = klass if klass
103
- filter_options
104
104
  if type == :first
105
- attributes = klass.collection.find_one(@selector, @options)
106
- attributes ? @klass.instantiate(attributes) : nil
105
+ attributes = klass.collection.find_one(@selector, @options.dup)
106
+ return attributes ? @klass.instantiate(attributes) : nil
107
107
  else
108
- attributes = @klass.collection.find(@selector, @options)
109
- attributes ? attributes.collect { |doc| @klass.instantiate(doc) } : []
108
+ attributes = @klass.collection.find(@selector, @options.dup)
109
+ if attributes
110
+ @count = attributes.count
111
+ return attributes.collect { |doc| @klass.instantiate(doc) }
112
+ else
113
+ return []
114
+ end
110
115
  end
111
116
  end
112
117
 
@@ -123,7 +128,9 @@ module Mongoid #:nodoc:
123
128
  #
124
129
  # Returns: <tt>self</tt>
125
130
  def extras(extras)
126
- @options = extras; self
131
+ @options = extras
132
+ filter_options
133
+ self
127
134
  end
128
135
 
129
136
  GROUP_REDUCE = "function(obj, prev) { prev.group.push(obj); }"
@@ -234,9 +241,7 @@ module Mongoid #:nodoc:
234
241
  # will replace it with a skip parameter and return the same value. Defaults
235
242
  # to 20 if nothing was provided.
236
243
  def offset
237
- per_page = @options[:per_page] || 20
238
- offset = (page * per_page) - per_page
239
- @options[:skip] ||= offset
244
+ @options[:skip]
240
245
  end
241
246
 
242
247
  # Adds a criterion to the +Criteria+ that specifies the sort order of
@@ -258,15 +263,16 @@ module Mongoid #:nodoc:
258
263
  # Either returns the page option and removes it from the options, or
259
264
  # returns a default value of 1.
260
265
  def page
261
- @options[:page] || 1
266
+ if @options[:skip] && @options[:limit]
267
+ (@options[:skip].to_i + @options[:limit].to_i) / @options[:limit].to_i
268
+ else
269
+ 1
270
+ end
262
271
  end
263
272
 
264
273
  # Returns the number of results per page or the default of 20.
265
274
  def per_page
266
- num = @options[:per_page] || 20
267
- skip = (page * num) - num
268
- @options[:skip] = skip
269
- num
275
+ (@options[:limit] || 20).to_i
270
276
  end
271
277
 
272
278
  # Adds a criterion to the +Criteria+ that specifies the fields that will
@@ -351,8 +357,12 @@ module Mongoid #:nodoc:
351
357
 
352
358
  protected
353
359
  def filter_options
354
- @options.delete(:page)
355
- @options.delete(:per_page)
360
+ page_num = @options.delete(:page)
361
+ per_page_num = @options.delete(:per_page)
362
+ if (page_num || per_page_num)
363
+ @options[:limit] = (per_page_num || 20).to_i
364
+ @options[:skip] = (page_num || 1).to_i * @options[:limit] - @options[:limit]
365
+ end
356
366
  end
357
367
 
358
368
  end
@@ -172,9 +172,8 @@ module Mongoid #:nodoc:
172
172
  # Returns paginated array of docs.
173
173
  def paginate(params = {})
174
174
  criteria = Criteria.translate(:all, params)
175
- WillPaginate::Collection.create(criteria.page, criteria.per_page, 0) do |pager|
176
- results = criteria.execute(self)
177
- pager.total_entries = results.size
175
+ results = criteria.execute(self)
176
+ WillPaginate::Collection.create(criteria.page, criteria.per_page, criteria.count) do |pager|
178
177
  pager.replace(results)
179
178
  end
180
179
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "0.7.8"
8
+ s.version = "0.7.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Durran Jordan"]
@@ -114,6 +114,12 @@ describe Mongoid::Document do
114
114
  Person.paginate(:per_page => 20, :page => 2).length.should == 10
115
115
  end
116
116
 
117
+ it "returns a proper count" do
118
+ @criteria = Mongoid::Criteria.translate(:all, { :per_page => 20, :page => 1 })
119
+ @criteria.execute(Person)
120
+ @criteria.count.should == 30
121
+ end
122
+
117
123
  end
118
124
 
119
125
  describe "#reload" do
@@ -274,10 +280,8 @@ describe Mongoid::Document do
274
280
  end
275
281
 
276
282
  it "creates new versions" do
277
- p @comment
278
283
  @from_db = Comment.find(@comment.id)
279
284
  @from_db.version.should == 6
280
- p @from_db
281
285
  @from_db.versions.size.should == 5
282
286
  end
283
287
 
@@ -56,19 +56,35 @@ describe Mongoid::Criteria do
56
56
 
57
57
  describe "#count" do
58
58
 
59
- before do
60
- @criteria = Mongoid::Criteria.new(:all, Person)
61
- @selector = { :test => "Testing" }
62
- @criteria.where(@selector)
63
- @collection = mock
64
- @cursor = mock
65
- Person.expects(:collection).returns(@collection)
59
+ context "when criteria has not been executed" do
60
+
61
+ before do
62
+ @criteria.instance_variable_set(:@count, 34)
63
+ end
64
+
65
+ it "returns a count from the cursor" do
66
+ @criteria.count.should == 34
67
+ end
68
+
66
69
  end
67
70
 
68
- it "returns the count from the cursor without creating the documents" do
69
- @collection.expects(:find).with(@selector, {}).returns(@cursor)
70
- @cursor.expects(:count).returns(10)
71
- @criteria.count.should == 10
71
+ context "when criteria has been executed" do
72
+
73
+ before do
74
+ @criteria = Mongoid::Criteria.new(:all, Person)
75
+ @selector = { :test => "Testing" }
76
+ @criteria.where(@selector)
77
+ @collection = mock
78
+ @cursor = mock
79
+ Person.expects(:collection).returns(@collection)
80
+ end
81
+
82
+ it "returns the count from the cursor without creating the documents" do
83
+ @collection.expects(:find).with(@selector, {}).returns(@cursor)
84
+ @cursor.expects(:count).returns(10)
85
+ @criteria.count.should == 10
86
+ end
87
+
72
88
  end
73
89
 
74
90
  end
@@ -93,8 +109,8 @@ describe Mongoid::Criteria do
93
109
  before do
94
110
  @collection = mock
95
111
  Person.expects(:collection).returns(@collection)
96
- @collection.expects(:find).with(@criteria.selector, @criteria.options).returns([])
97
112
  @criteria = Mongoid::Criteria.new(:all).extras(:page => 1, :per_page => 20)
113
+ @collection.expects(:find).with(@criteria.selector, @criteria.options).returns([])
98
114
  end
99
115
 
100
116
  it "filters out unused params" do
@@ -105,6 +121,23 @@ describe Mongoid::Criteria do
105
121
 
106
122
  end
107
123
 
124
+ context "when type is :all" do
125
+
126
+ before do
127
+ @collection = mock
128
+ Person.expects(:collection).returns(@collection)
129
+ @criteria = Mongoid::Criteria.new(:all).extras(:page => 1, :per_page => 20)
130
+ @cursor = stub(:count => 44, :collect => [])
131
+ @collection.expects(:find).with(@criteria.selector, @criteria.options).returns(@cursor)
132
+ end
133
+
134
+ it "adds the count instance variable" do
135
+ @criteria.execute(Person).should == []
136
+ @criteria.count.should == 44
137
+ end
138
+
139
+ end
140
+
108
141
  context "when type is :first" do
109
142
 
110
143
  context "when documents exist" do
@@ -155,6 +188,39 @@ describe Mongoid::Criteria do
155
188
 
156
189
  describe "#extras" do
157
190
 
191
+ context "filtering" do
192
+
193
+ context "when page is provided" do
194
+
195
+ it "sets the limit and skip options" do
196
+ @criteria.extras({ :page => "2" })
197
+ @criteria.page.should == 2
198
+ @criteria.options.should == { :skip => 20, :limit => 20 }
199
+ end
200
+
201
+ end
202
+
203
+ context "when per_page is provided" do
204
+
205
+ it "sets the limit and skip options" do
206
+ @criteria.extras({ :per_page => 45 })
207
+ @criteria.options.should == { :skip => 0, :limit => 45 }
208
+ end
209
+
210
+ end
211
+
212
+ context "when page and per_page both provided" do
213
+
214
+ it "sets the limit and skip options" do
215
+ @criteria.extras({ :per_page => 30, :page => "4" })
216
+ @criteria.options.should == { :skip => 90, :limit => 30 }
217
+ @criteria.page.should == 4
218
+ end
219
+
220
+ end
221
+
222
+ end
223
+
158
224
  it "adds the extras to the options" do
159
225
  @criteria.extras({ :skip => 10 })
160
226
  @criteria.options.should == { :skip => 10 }
@@ -319,9 +385,9 @@ describe Mongoid::Criteria do
319
385
  @criteria = Mongoid::Criteria.new(:all)
320
386
  end
321
387
 
322
- it "adds the skip option to the options and returns it" do
323
- @criteria.offset.should == 0
324
- @criteria.options[:skip].should == 0
388
+ it "returns nil" do
389
+ @criteria.offset.should be_nil
390
+ @criteria.options[:skip].should be_nil
325
391
  end
326
392
 
327
393
  end
@@ -59,7 +59,7 @@ describe Mongoid::Document do
59
59
  describe "#all" do
60
60
 
61
61
  before do
62
- @cursor = mock
62
+ @cursor = stub(:count => 100)
63
63
  @people = []
64
64
  end
65
65
 
@@ -282,7 +282,7 @@ describe Mongoid::Document do
282
282
  context "when finding all" do
283
283
 
284
284
  before do
285
- @cursor = mock
285
+ @cursor = stub(:count => 100)
286
286
  @people = []
287
287
  end
288
288
 
@@ -297,7 +297,7 @@ describe Mongoid::Document do
297
297
  context "when sorting" do
298
298
 
299
299
  before do
300
- @cursor = mock
300
+ @cursor = stub(:count => 50)
301
301
  @people = []
302
302
  end
303
303
 
@@ -550,7 +550,7 @@ describe Mongoid::Document do
550
550
  describe "#paginate" do
551
551
 
552
552
  before do
553
- @criteria = stub(:page => 1, :per_page => "20")
553
+ @criteria = stub(:page => 1, :per_page => "20", :count => 100)
554
554
  end
555
555
 
556
556
  context "when pagination parameters are passed" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.8
4
+ version: 0.7.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan