mongoid 0.7.8 → 0.7.9

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 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