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,8 @@
1
+ class Agent
2
+ include Mongoid::Document
3
+ field :title
4
+ field :number
5
+ embeds_many :names
6
+ references_many :posts, :foreign_key => :poster_id
7
+ accepts_nested_attributes_for :posts, :allow_destroy => true
8
+ end
@@ -0,0 +1,15 @@
1
+ class Animal
2
+ include Mongoid::Document
3
+ field :name
4
+ field :tags, :type => Array
5
+ key :name
6
+ embedded_in :person, :inverse_of => :pet
7
+
8
+ def tag_list
9
+ tags.join(", ")
10
+ end
11
+
12
+ def tag_list=(_tag_list)
13
+ self.tags = _tag_list.split(",").map(&:strip)
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ class Answer
2
+ include Mongoid::Document
3
+ embedded_in :question, :inverse_of => :answers
4
+ end
@@ -0,0 +1,47 @@
1
+ class Artist
2
+ include Mongoid::Document
3
+ field :name
4
+ embeds_many :songs
5
+ embeds_many :labels
6
+
7
+ before_create :before_create_stub
8
+ after_create :create_songs
9
+
10
+ protected
11
+ def before_create_stub
12
+ true
13
+ end
14
+
15
+ def create_songs
16
+ 2.times { |n| songs.create!(:title => "#{n}") }
17
+ end
18
+ end
19
+
20
+ class Song
21
+ include Mongoid::Document
22
+ field :title
23
+ embedded_in :artist, :inverse_of => :songs
24
+ end
25
+
26
+ class Label
27
+ include Mongoid::Document
28
+ field :name
29
+ embedded_in :artist, :inverse_of => :labels
30
+ before_validation :cleanup
31
+
32
+ private
33
+ def cleanup
34
+ self.name = self.name.downcase.capitalize
35
+ end
36
+ end
37
+
38
+ class ValidationCallback
39
+ include Mongoid::Document
40
+ field :history, :type => Array, :default => []
41
+ validate do
42
+ self.history << :validate
43
+ end
44
+
45
+ before_validation { self.history << :before_validation }
46
+ after_validation { self.history << :after_validation }
47
+ end
@@ -0,0 +1,13 @@
1
+ class RootCategory
2
+ include Mongoid::Document
3
+ embeds_many :categories
4
+ end
5
+
6
+ class Category
7
+ include Mongoid::Document
8
+ embedded_in :root_category, :inverse_of => :categories
9
+ embedded_in :category, :inverse_of => :categories
10
+ embeds_many :categories
11
+
12
+ field :name
13
+ end
@@ -0,0 +1,10 @@
1
+ class Comment
2
+ include Mongoid::Document
3
+ include Mongoid::Versioning
4
+ include Mongoid::Timestamps
5
+ field :title
6
+
7
+ field :text
8
+ key :text
9
+ validates_presence_of :text
10
+ end
@@ -0,0 +1,6 @@
1
+ class CountryCode
2
+ include Mongoid::Document
3
+ field :code, :type => Integer
4
+ key :code
5
+ embedded_in :phone_number, :inverse_of => :country_codes
6
+ end
@@ -0,0 +1,8 @@
1
+ class Description
2
+ include Mongoid::Document
3
+
4
+ field :details
5
+
6
+ referenced_in :user
7
+ referenced_in :updater, :class_name => 'User'
8
+ end
@@ -0,0 +1,5 @@
1
+ class Employer
2
+ def id
3
+ "1"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class Favorite
2
+ include Mongoid::Document
3
+
4
+ field :title
5
+ validates_uniqueness_of :title, :case_sensitive => false
6
+
7
+ embedded_in :person, :inverse_of => :favorites
8
+ end
@@ -0,0 +1,14 @@
1
+ class Game
2
+ include Mongoid::Document
3
+ field :high_score, :type => Integer, :default => 500
4
+ field :score, :type => Integer, :default => 0
5
+ field :name
6
+ referenced_in :person, :index => true
7
+ enslave and cache
8
+
9
+ attr_protected :_id
10
+
11
+ set_callback(:initialize, :after) do |document|
12
+ write_attribute("name", "Testing")
13
+ end
14
+ end
@@ -0,0 +1,72 @@
1
+ class Canvas
2
+ include Mongoid::Document
3
+ field :name
4
+ embeds_many :shapes
5
+ embeds_one :writer
6
+ embeds_one :palette
7
+
8
+ def render
9
+ shapes.each { |shape| render }
10
+ end
11
+ end
12
+
13
+ class Browser < Canvas
14
+ field :version, :type => Integer
15
+ def render; end
16
+ end
17
+
18
+ class Firefox < Browser
19
+ field :user_agent
20
+ def render; end
21
+ end
22
+
23
+ class Shape
24
+ include Mongoid::Document
25
+ field :x, :type => Integer, :default => 0
26
+ field :y, :type => Integer, :default => 0
27
+
28
+ embedded_in :canvas, :inverse_of => :shapes
29
+
30
+ def render; end
31
+ end
32
+
33
+ class Square < Shape
34
+ field :width, :type => Integer, :default => 0
35
+ field :height, :type => Integer, :default => 0
36
+ end
37
+
38
+ class Circle < Shape
39
+ field :radius, :type => Integer, :default => 0
40
+ end
41
+
42
+ class Writer
43
+ include Mongoid::Document
44
+ field :speed, :type => Integer, :default => 0
45
+
46
+ embedded_in :canvas, :inverse_of => :writer
47
+
48
+ def write; end
49
+ end
50
+
51
+ class HtmlWriter < Writer
52
+ def write; end
53
+ end
54
+
55
+ class PdfWriter < Writer
56
+ def write; end
57
+ end
58
+
59
+ class Palette
60
+ include Mongoid::Document
61
+ embedded_in :canvas, :inverse_of => :palette
62
+ embeds_many :tools
63
+ end
64
+
65
+ class Tool
66
+ include Mongoid::Document
67
+ embedded_in :palette, :inverse_of => :tools
68
+ end
69
+
70
+ class Pencil < Tool; end
71
+
72
+ class Eraser < Tool; end
@@ -0,0 +1,5 @@
1
+ class Location
2
+ include Mongoid::Document
3
+ field :name
4
+ embedded_in :address, :inverse_of => :locations
5
+ end
@@ -0,0 +1,6 @@
1
+ class Login
2
+ include Mongoid::Document
3
+ field :username
4
+ key :username
5
+ validates_uniqueness_of :username
6
+ end
@@ -0,0 +1,4 @@
1
+ class MixedDrink
2
+ include Mongoid::Document
3
+ field :name
4
+ end
@@ -0,0 +1,13 @@
1
+ class Name
2
+ include Mongoid::Document
3
+ field :first_name
4
+ field :last_name
5
+ field :parent_title
6
+ key :first_name, :last_name
7
+ embeds_many :translations
8
+ embedded_in :namable, :inverse_of => [:name, :names]
9
+
10
+ def set_parent=(set = false)
11
+ self.parent_title = namable.title if set
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Medical
2
+ class Patient
3
+ include Mongoid::Document
4
+ field :name
5
+ embeds_many :prescriptions, :class_name => "Medical::Prescription"
6
+ end
7
+ class Prescription
8
+ include Mongoid::Document
9
+ field :name
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ class ParanoidPost
2
+ include Mongoid::Document
3
+ include Mongoid::Versioning
4
+ include Mongoid::Timestamps
5
+ include Mongoid::Paranoia
6
+ field :title
7
+ referenced_in :person
8
+
9
+ references_many :tags, :stored_as => :array
10
+
11
+ named_scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
12
+
13
+ class << self
14
+ def old
15
+ where(:created_at => { "$lt" => 30.days.ago })
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ class ParentDoc
2
+ include Mongoid::Document
3
+
4
+ embeds_many :child_docs
5
+
6
+ field :statistic
7
+ field :children_order, :type => Array, :default => [] # hold all the children's id
8
+ end
9
+
10
+
11
+ class ChildDoc
12
+ include Mongoid::Document
13
+
14
+ embedded_in :parent_doc, :inverse_of => :child_docs
15
+
16
+ attr_writer :position
17
+
18
+ after_save :update_position
19
+
20
+ def position
21
+ exsited_position = parent_doc.children_order.index(id)
22
+ exsited_position ? exsited_position + 1 : parent_doc.aspects.size
23
+ end
24
+
25
+ def update_position
26
+ if @position && (@position.to_i > 0)
27
+ parent_doc.children_order.delete(id)
28
+ parent_doc.children_order.insert(@position.to_i - 1, id)
29
+ parent_doc.save
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ class Email
2
+ include Mongoid::Document
3
+ field :address
4
+ validates_uniqueness_of :address
5
+ embedded_in :patient, :inverse_of => :email
6
+ end
7
+
8
+ class Patient
9
+ include Mongoid::Document
10
+ field :title
11
+ store_in :inpatient
12
+ embeds_many :addresses
13
+ embeds_one :email
14
+ validates_presence_of :title, :on => :create
15
+ end
@@ -0,0 +1,113 @@
1
+ class Person
2
+ include Mongoid::Document
3
+ include Mongoid::Timestamps
4
+ include Mongoid::EagerLoading
5
+
6
+ attr_accessor :mode
7
+
8
+ field :title
9
+ field :terms, :type => Boolean
10
+ field :pets, :type => Boolean, :default => false
11
+ field :age, :type => Integer, :default => 100
12
+ field :dob, :type => Date
13
+ field :mixed_drink, :type => MixedDrink
14
+ field :employer_id
15
+ field :lunch_time, :type => Time
16
+ field :aliases, :type => Array
17
+ field :map, :type => Hash
18
+ field :score, :type => Integer
19
+ field :blood_alcohol_content, :type => Float, :default => lambda{ 0.0 }
20
+ field :last_drink_taken_at, :type => Date, :default => lambda { 1.day.ago.in_time_zone("Alaska") }
21
+ field :ssn
22
+ field :owner_id, :type => Integer
23
+ field :security_code
24
+ field :reading, :type => Object
25
+
26
+ index :age
27
+ index :addresses
28
+ index :dob
29
+ index :name
30
+ index :title
31
+ index :ssn, :unique => true
32
+
33
+ attr_reader :rescored
34
+
35
+ attr_protected :security_code, :owner_id
36
+
37
+ embeds_many :favorites
38
+ embeds_many :videos
39
+ embeds_many :phone_numbers, :class_name => "Phone"
40
+ embeds_many :addresses do
41
+ def extension
42
+ "Testing"
43
+ end
44
+ def find_by_street(street)
45
+ @target.select { |doc| doc.street == street }
46
+ end
47
+ end
48
+
49
+ embeds_one :pet, :class_name => "Animal"
50
+ embeds_one :name do
51
+ def extension
52
+ "Testing"
53
+ end
54
+ def dawkins?
55
+ first_name == "Richard" && last_name == "Dawkins"
56
+ end
57
+ end
58
+
59
+ accepts_nested_attributes_for :addresses, :reject_if => lambda { |attrs| attrs["street"].blank? }
60
+ accepts_nested_attributes_for :name, :update_only => true
61
+ accepts_nested_attributes_for :pet, :allow_destroy => true
62
+ accepts_nested_attributes_for :game, :allow_destroy => true
63
+ accepts_nested_attributes_for :favorites, :allow_destroy => true, :limit => 5
64
+
65
+ references_one :game, :dependent => :destroy do
66
+ def extension
67
+ "Testing"
68
+ end
69
+ end
70
+
71
+ references_many :posts, :dependent => :delete do
72
+ def extension
73
+ "Testing"
74
+ end
75
+ end
76
+ references_many :paranoid_posts
77
+ references_many :preferences, :stored_as => :array, :inverse_of => :people, :index => true
78
+ references_many :user_accounts, :stored_as => :array, :inverse_of => :person
79
+
80
+ def score_with_rescoring=(score)
81
+ @rescored = score.to_i + 20
82
+ self.score_without_rescoring = score
83
+ end
84
+
85
+ alias_method_chain :score=, :rescoring
86
+
87
+ def update_addresses
88
+ addresses.each do |address|
89
+ address.street = "Updated Address"
90
+ end
91
+ end
92
+
93
+ def employer=(emp)
94
+ self.employer_id = emp.id
95
+ end
96
+
97
+ class << self
98
+ def accepted
99
+ criteria.where(:terms => true)
100
+ end
101
+ def knight
102
+ criteria.where(:title => "Sir")
103
+ end
104
+ def old
105
+ criteria.where(:age => { "$gt" => 50 })
106
+ end
107
+ end
108
+
109
+ end
110
+
111
+ class Doctor < Person
112
+ field :specialty
113
+ end