mongoid-eager-loading 0.1.0

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