mongoid-eager-loading 0.1.0

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.
Files changed (54) hide show
  1. data/.gitignore +4 -0
  2. data/.rvmrc.example +2 -0
  3. data/.watchr +24 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +54 -0
  6. data/LICENSE +20 -0
  7. data/README.md +35 -0
  8. data/Rakefile +45 -0
  9. data/lib/mongoid-eager-loading.rb +8 -0
  10. data/lib/mongoid-eager-loading/mongoid/criteria.rb +18 -0
  11. data/lib/mongoid-eager-loading/mongoid/criterion/eager_loading.rb +116 -0
  12. data/lib/mongoid-eager-loading/mongoid/finders.rb +5 -0
  13. data/lib/mongoid-eager-loading/version.rb +5 -0
  14. data/mongoid-eager-loading.gemspec +28 -0
  15. data/spec/config/mongoid.yml +21 -0
  16. data/spec/models/account.rb +10 -0
  17. data/spec/models/address.rb +52 -0
  18. data/spec/models/agent.rb +8 -0
  19. data/spec/models/animal.rb +15 -0
  20. data/spec/models/answer.rb +4 -0
  21. data/spec/models/callbacks.rb +47 -0
  22. data/spec/models/category.rb +13 -0
  23. data/spec/models/comment.rb +10 -0
  24. data/spec/models/country_code.rb +6 -0
  25. data/spec/models/description.rb +8 -0
  26. data/spec/models/employer.rb +5 -0
  27. data/spec/models/favorite.rb +8 -0
  28. data/spec/models/game.rb +14 -0
  29. data/spec/models/inheritance.rb +72 -0
  30. data/spec/models/location.rb +5 -0
  31. data/spec/models/login.rb +6 -0
  32. data/spec/models/mixed_drink.rb +4 -0
  33. data/spec/models/name.rb +13 -0
  34. data/spec/models/namespacing.rb +11 -0
  35. data/spec/models/paranoid_post.rb +18 -0
  36. data/spec/models/parents.rb +32 -0
  37. data/spec/models/patient.rb +15 -0
  38. data/spec/models/person.rb +113 -0
  39. data/spec/models/pet.rb +7 -0
  40. data/spec/models/pet_owner.rb +6 -0
  41. data/spec/models/phone.rb +7 -0
  42. data/spec/models/post.rb +25 -0
  43. data/spec/models/preference.rb +7 -0
  44. data/spec/models/question.rb +8 -0
  45. data/spec/models/survey.rb +6 -0
  46. data/spec/models/translation.rb +5 -0
  47. data/spec/models/user.rb +8 -0
  48. data/spec/models/user_account.rb +9 -0
  49. data/spec/models/vet_visit.rb +5 -0
  50. data/spec/models/video.rb +5 -0
  51. data/spec/mongoid-eager-loading/mongoid/criteria_spec.rb +26 -0
  52. data/spec/mongoid-eager-loading/mongoid/criterion/eager_loading_spec.rb +103 -0
  53. data/spec/spec_helper.rb +29 -0
  54. metadata +213 -0
@@ -0,0 +1,7 @@
1
+ class Pet
2
+ include Mongoid::Document
3
+ field :name
4
+ field :weight, :type => Float, :default => 0.0
5
+ embeds_many :vet_visits
6
+ embedded_in :pet_owner, :inverse_of => :pet
7
+ end
@@ -0,0 +1,6 @@
1
+ class PetOwner
2
+ include Mongoid::Document
3
+ field :title
4
+ embeds_one :pet
5
+ embeds_one :address
6
+ end
@@ -0,0 +1,7 @@
1
+ class Phone
2
+ include Mongoid::Document
3
+ field :number
4
+ key :number
5
+ embeds_one :country_code
6
+ embedded_in :person, :inverse_of => :phone_numbers
7
+ end
@@ -0,0 +1,25 @@
1
+ class Tag
2
+ include Mongoid::Document
3
+ field :text
4
+ referenced_in :post, :stored_as => :array
5
+ end
6
+
7
+ class Post
8
+ include Mongoid::Document
9
+ include Mongoid::Versioning
10
+ include Mongoid::Timestamps
11
+ field :title
12
+ referenced_in :person
13
+ referenced_in :author, :foreign_key => :author_id, :class_name => "User"
14
+ referenced_in :poster, :foreign_key => :poster_id, :class_name => "Agent"
15
+
16
+ references_many :tags, :stored_as => :array
17
+
18
+ named_scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
19
+
20
+ class << self
21
+ def old
22
+ where(:created_at => { "$lt" => 30.days.ago })
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ class Preference
2
+ include Mongoid::Document
3
+ field :name
4
+ field :value
5
+ references_many :people, :stored_as => :array, :inverse_of => :preferences
6
+ validates_length_of :name, :minimum => 2, :allow_nil => true
7
+ end
@@ -0,0 +1,8 @@
1
+ class Question
2
+ include Mongoid::Document
3
+ field :content
4
+ embedded_in :survey, :inverse_of => :questions
5
+ embeds_many :answers
6
+
7
+ accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
8
+ end
@@ -0,0 +1,6 @@
1
+ class Survey
2
+ include Mongoid::Document
3
+ embeds_many :questions
4
+
5
+ accepts_nested_attributes_for :questions, :reject_if => lambda{ |a| a[:content].blank? }, :allow_destroy => true
6
+ end
@@ -0,0 +1,5 @@
1
+ class Translation
2
+ include Mongoid::Document
3
+ field :language
4
+ embedded_in :name, :inverse_of => :translations
5
+ end
@@ -0,0 +1,8 @@
1
+ class User
2
+ include Mongoid::Document
3
+ references_one :account, :foreign_key => :creator_id
4
+ references_many :posts, :foreign_key => :author_id, :inverse_of => :author
5
+ field :name
6
+
7
+ references_many :descriptions
8
+ end
@@ -0,0 +1,9 @@
1
+ class UserAccount
2
+ include Mongoid::Document
3
+ field :username
4
+ field :email
5
+ validates_uniqueness_of :username, :message => "is not unique"
6
+ validates_uniqueness_of :email, :message => "is not unique", :case_sensitive => false
7
+
8
+ referenced_in :person, :inverse_of => :user_accounts
9
+ end
@@ -0,0 +1,5 @@
1
+ class VetVisit
2
+ include Mongoid::Document
3
+ field :date, :type => Date
4
+ embedded_in :pet, :inverse_of => :vet_visits
5
+ end
@@ -0,0 +1,5 @@
1
+ class Video
2
+ include Mongoid::Document
3
+ field :title
4
+ embedded_in :person, :inverse_of => :videos
5
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criteria do
4
+
5
+ describe "#each" do
6
+
7
+ before :each do
8
+ Person.destroy_all
9
+ @person1 = Person.create(:title => "Sir", :age => 100, :aliases => ["D", "Durran"], :ssn => "666666666")
10
+ @person2 = Person.create(:title => "Madam", :age => 1, :ssn => "098-76-5434")
11
+ @person1.create_game(:score => 10)
12
+ @person2.create_game(:score => 20)
13
+ end
14
+
15
+ it "without includes" do
16
+ criteria = Person.all
17
+ criteria.collect(&:title).should == ["Sir", "Madam"]
18
+ end
19
+
20
+ it "with includes" do
21
+ criteria = Person.includes(:game)
22
+ criteria.collect(&:title).should == ["Sir", "Madam"]
23
+ criteria.collect(&:game).should == [@person1.game, @person2.game]
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,103 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Criterion::EagerLoading do
4
+
5
+ describe "#includes" do
6
+
7
+ it "should return self" do
8
+ criteria = Mongoid::Criteria.new(Person)
9
+ criteria.includes(:game, :posts).should == criteria
10
+ end
11
+
12
+ it "set eager loadings" do
13
+ criteria = Mongoid::Criteria.new(Person)
14
+ criteria.includes(:game, :posts)
15
+ criteria.eager_loadings.should == [:game, :posts]
16
+ end
17
+ end
18
+
19
+ describe "#preload" do
20
+
21
+ before do
22
+ person1 = Person.create(:title => "Sir", :age => 100, :aliases => ["D", "Durran"], :ssn => "666666666")
23
+ person2 = Person.create(:title => "Madam", :age => 1, :ssn => "098-76-5434")
24
+
25
+ person1.create_game(:score => 10)
26
+ person2.create_game(:score => 20)
27
+
28
+ person1.posts.create(:title => "post1")
29
+ person1.posts.create(:title => "post2")
30
+ person2.posts.create(:title => "post3")
31
+ person2.posts.create(:title => "post4")
32
+
33
+ person1.preferences.create(:name => "preference1")
34
+ person1.preferences.create(:name => "preference2")
35
+ person2.preferences.create(:name => "preference3")
36
+ person2.preferences.create(:name => "preference4")
37
+ end
38
+
39
+ it "preload references_one association" do
40
+ people = Person.all.to_a
41
+ games = Game.all.to_a
42
+
43
+ complex = stub(:key => :person_id, :operator => "in")
44
+ Mongoid::Criterion::Complex.expects(:new).with(:key => :person_id, :operator => "in").returns(complex)
45
+ Game.expects(:where).with(complex => people.collect(&:id)).returns(games)
46
+
47
+ criteria = Mongoid::Criteria.new(Person)
48
+ criteria.includes(:game)
49
+ criteria.preload(people)
50
+
51
+ people.first.game.should == games.first
52
+ people.last.game.should == games.last
53
+ end
54
+
55
+ it "preload references_many association" do
56
+ people = Person.all.to_a
57
+ posts = Post.all.to_a
58
+ person1_posts = Post.where(:person_id => people.first.id).to_a
59
+ person2_posts = Post.where(:person_id => people.last.id).to_a
60
+
61
+ complex = stub(:key => :person_id, :operator => "in")
62
+ Mongoid::Criterion::Complex.expects(:new).with(:key => :person_id, :operator => "in").returns(complex)
63
+ Post.expects(:where).with(complex => people.collect(&:id)).returns(posts)
64
+
65
+ criteria = Mongoid::Criteria.new(Person)
66
+ criteria.includes(:posts)
67
+ criteria.preload(people)
68
+
69
+ people.first.posts.should == person1_posts
70
+ people.last.posts.should == person2_posts
71
+ end
72
+
73
+ it "preload references_many_as_array association" do
74
+ people = Person.all.to_a
75
+ preferences = Preference.all.to_a
76
+ person1_preferences = Preference.find(people.first.preference_ids).to_a
77
+ person2_preferences = Preference.find(people.last.preference_ids).to_a
78
+
79
+ Preference.expects(:find).with(preferences.collect(&:id)).returns(preferences)
80
+
81
+ criteria = Mongoid::Criteria.new(Person)
82
+ criteria.includes(:preferences)
83
+ criteria.preload(people)
84
+
85
+ people.first.preferences.should == person1_preferences
86
+ people.last.preferences.should == person2_preferences
87
+ end
88
+
89
+ it "preload referenced_in association" do
90
+ people = Person.all.to_a
91
+ games = Game.all.to_a
92
+
93
+ Person.expects(:find).with(people.collect(&:id)).returns(people)
94
+
95
+ criteria = Mongoid::Criteria.new(Game)
96
+ criteria.includes(:person)
97
+ criteria.preload(games)
98
+
99
+ people.first.game.should == games.first
100
+ people.last.game.should == games.last
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,29 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ MODELS = File.join(File.dirname(__FILE__), "models")
5
+ $LOAD_PATH.unshift(MODELS)
6
+
7
+ require "mongoid"
8
+ require "mongoid-eager-loading"
9
+ require "mocha"
10
+ require "rspec"
11
+
12
+ Mongoid.configure do |config|
13
+ name = "mongoid_test"
14
+ host = "localhost"
15
+ config.master = Mongo::Connection.new.db(name)
16
+ config.logger = nil
17
+ # config.slaves = [
18
+ # Mongo::Connection.new(host, 27018, :slave_ok => true).db(name)
19
+ # ]
20
+ end
21
+
22
+ Dir[ File.join(MODELS, "*.rb") ].sort.each { |file| require File.basename(file) }
23
+
24
+ Rspec.configure do |config|
25
+ config.mock_with :mocha
26
+ config.after :suite do
27
+ Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongoid-eager-loading
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Richard Huang
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-26 00:00:00 +08:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ hash: 62196423
28
+ segments:
29
+ - 2
30
+ - 0
31
+ - 0
32
+ - beta
33
+ - 18
34
+ version: 2.0.0.beta.18
35
+ name: mongoid
36
+ prerelease: false
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 23
46
+ segments:
47
+ - 1
48
+ - 0
49
+ - 0
50
+ version: 1.0.0
51
+ name: bundler
52
+ prerelease: false
53
+ type: :development
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 15
62
+ segments:
63
+ - 2
64
+ - 0
65
+ - 0
66
+ version: 2.0.0
67
+ name: rspec
68
+ prerelease: false
69
+ type: :development
70
+ version_requirements: *id003
71
+ - !ruby/object:Gem::Dependency
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ name: mocha
82
+ prerelease: false
83
+ type: :development
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ requirement: &id005 !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ hash: 3
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ name: watchr
96
+ prerelease: false
97
+ type: :development
98
+ version_requirements: *id005
99
+ - !ruby/object:Gem::Dependency
100
+ requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ name: bson_ext
110
+ prerelease: false
111
+ type: :development
112
+ version_requirements: *id006
113
+ description: eager loading for mongoid
114
+ email:
115
+ - flyerhzm@gmail.com
116
+ executables: []
117
+
118
+ extensions: []
119
+
120
+ extra_rdoc_files: []
121
+
122
+ files:
123
+ - .gitignore
124
+ - .rvmrc.example
125
+ - .watchr
126
+ - Gemfile
127
+ - Gemfile.lock
128
+ - LICENSE
129
+ - README.md
130
+ - Rakefile
131
+ - lib/mongoid-eager-loading.rb
132
+ - lib/mongoid-eager-loading/mongoid/criteria.rb
133
+ - lib/mongoid-eager-loading/mongoid/criterion/eager_loading.rb
134
+ - lib/mongoid-eager-loading/mongoid/finders.rb
135
+ - lib/mongoid-eager-loading/version.rb
136
+ - mongoid-eager-loading.gemspec
137
+ - spec/config/mongoid.yml
138
+ - spec/models/account.rb
139
+ - spec/models/address.rb
140
+ - spec/models/agent.rb
141
+ - spec/models/animal.rb
142
+ - spec/models/answer.rb
143
+ - spec/models/callbacks.rb
144
+ - spec/models/category.rb
145
+ - spec/models/comment.rb
146
+ - spec/models/country_code.rb
147
+ - spec/models/description.rb
148
+ - spec/models/employer.rb
149
+ - spec/models/favorite.rb
150
+ - spec/models/game.rb
151
+ - spec/models/inheritance.rb
152
+ - spec/models/location.rb
153
+ - spec/models/login.rb
154
+ - spec/models/mixed_drink.rb
155
+ - spec/models/name.rb
156
+ - spec/models/namespacing.rb
157
+ - spec/models/paranoid_post.rb
158
+ - spec/models/parents.rb
159
+ - spec/models/patient.rb
160
+ - spec/models/person.rb
161
+ - spec/models/pet.rb
162
+ - spec/models/pet_owner.rb
163
+ - spec/models/phone.rb
164
+ - spec/models/post.rb
165
+ - spec/models/preference.rb
166
+ - spec/models/question.rb
167
+ - spec/models/survey.rb
168
+ - spec/models/translation.rb
169
+ - spec/models/user.rb
170
+ - spec/models/user_account.rb
171
+ - spec/models/vet_visit.rb
172
+ - spec/models/video.rb
173
+ - spec/mongoid-eager-loading/mongoid/criteria_spec.rb
174
+ - spec/mongoid-eager-loading/mongoid/criterion/eager_loading_spec.rb
175
+ - spec/spec_helper.rb
176
+ has_rdoc: true
177
+ homepage: http://rubygems.org/gems/mongoid-eager-loading
178
+ licenses: []
179
+
180
+ post_install_message:
181
+ rdoc_options: []
182
+
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ none: false
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ hash: 3
191
+ segments:
192
+ - 0
193
+ version: "0"
194
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
+ none: false
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ hash: 23
200
+ segments:
201
+ - 1
202
+ - 3
203
+ - 6
204
+ version: 1.3.6
205
+ requirements: []
206
+
207
+ rubyforge_project: mongoid-eager-loading
208
+ rubygems_version: 1.3.7
209
+ signing_key:
210
+ specification_version: 3
211
+ summary: eager loading for mongoid
212
+ test_files: []
213
+