mongoid_paranoia 0.1.2 → 0.2.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.
@@ -0,0 +1,11 @@
1
+ module Mongoid
2
+ module Paranoia
3
+ class Configuration
4
+ attr_accessor :paranoid_field
5
+
6
+ def initialize
7
+ @paranoid_field = :deleted_at
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,113 +1,113 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Paranoia
4
- module Document
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- # Indicates whether or not the document includes Mongoid::Paranoia.
9
- # In Mongoid 3, this method was defined on all Mongoid::Documents.
10
- # In Mongoid 4, it is no longer defined, hence we are shimming it here.
11
- class_attribute :paranoid
12
- end
13
- end
14
- end
15
- end
16
-
17
- Mongoid::Document.send(:include, Mongoid::Paranoia::Document)
18
-
19
- module Mongoid
20
- module Relations
21
- module Builders
22
- module NestedAttributes
23
- class Many < NestedBuilder
24
- # Destroy the child document, needs to do some checking for embedded
25
- # relations and delay the destroy in case parent validation fails.
26
- #
27
- # @api private
28
- #
29
- # @example Destroy the child.
30
- # builder.destroy(parent, relation, doc)
31
- #
32
- # @param [ Document ] parent The parent document.
33
- # @param [ Proxy ] relation The relation proxy.
34
- # @param [ Document ] doc The doc to destroy.
35
- #
36
- # @since 3.0.10
37
- def destroy(parent, relation, doc)
38
- doc.flagged_for_destroy = true
39
- if !doc.embedded? || parent.new_record? || doc.paranoid?
40
- destroy_document(relation, doc)
41
- else
42
- parent.flagged_destroys.push(->{ destroy_document(relation, doc) })
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
50
-
51
- module Mongoid
52
- module Relations
53
- module Embedded
54
- # This class handles the behaviour for a document that embeds many other
55
- # documents within in it as an array.
56
- class Many < Relations::Many
57
- # Delete the supplied document from the target. This method is proxied
58
- # in order to reindex the array after the operation occurs.
59
- #
60
- # @example Delete the document from the relation.
61
- # person.addresses.delete(address)
62
- #
63
- # @param [ Document ] document The document to be deleted.
64
- #
65
- # @return [ Document, nil ] The deleted document or nil if nothing deleted.
66
- #
67
- # @since 2.0.0.rc.1
68
- def delete(document)
69
- execute_callback :before_remove, document
70
- doc = target.delete_one(document)
71
- if doc && !_binding?
72
- _unscoped.delete_one(doc) unless doc.paranoid?
73
- if _assigning?
74
- if doc.paranoid?
75
- doc.destroy(suppress: true)
76
- else
77
- base.add_atomic_pull(doc)
78
- end
79
- else
80
- doc.delete(suppress: true)
81
- unbind_one(doc)
82
- end
83
- end
84
- reindex
85
- execute_callback :after_remove, document
86
- doc
87
- end
88
- end
89
- end
90
- end
91
- end
92
-
93
- module Mongoid
94
- module Relations
95
- module Embedded
96
- class Many < Relations::Many
97
- # For use only with Mongoid::Paranoia - will be removed in 4.0.
98
- #
99
- # @example Get the deleted documents from the relation.
100
- # person.paranoid_phones.deleted
101
- #
102
- # @return [ Criteria ] The deleted documents.
103
- #
104
- # @since 3.0.10
105
- def deleted
106
- unscoped.deleted
107
- end
108
- # This class handles the behaviour for a document that embeds many other
109
- # documents within in it as an array.
110
- end
111
- end
112
- end
113
- end
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Paranoia
4
+ module Document
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ # Indicates whether or not the document includes Mongoid::Paranoia.
9
+ # In Mongoid 3, this method was defined on all Mongoid::Documents.
10
+ # In Mongoid 4, it is no longer defined, hence we are shimming it here.
11
+ class_attribute :paranoid
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ Mongoid::Document.send(:include, Mongoid::Paranoia::Document)
18
+
19
+ module Mongoid
20
+ module Relations
21
+ module Builders
22
+ module NestedAttributes
23
+ class Many < NestedBuilder
24
+ # Destroy the child document, needs to do some checking for embedded
25
+ # relations and delay the destroy in case parent validation fails.
26
+ #
27
+ # @api private
28
+ #
29
+ # @example Destroy the child.
30
+ # builder.destroy(parent, relation, doc)
31
+ #
32
+ # @param [ Document ] parent The parent document.
33
+ # @param [ Proxy ] relation The relation proxy.
34
+ # @param [ Document ] doc The doc to destroy.
35
+ #
36
+ # @since 3.0.10
37
+ def destroy(parent, relation, doc)
38
+ doc.flagged_for_destroy = true
39
+ if !doc.embedded? || parent.new_record? || doc.paranoid?
40
+ destroy_document(relation, doc)
41
+ else
42
+ parent.flagged_destroys.push(->{ destroy_document(relation, doc) })
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ module Mongoid
52
+ module Relations
53
+ module Embedded
54
+ # This class handles the behaviour for a document that embeds many other
55
+ # documents within in it as an array.
56
+ class Many < Relations::Many
57
+ # Delete the supplied document from the target. This method is proxied
58
+ # in order to reindex the array after the operation occurs.
59
+ #
60
+ # @example Delete the document from the relation.
61
+ # person.addresses.delete(address)
62
+ #
63
+ # @param [ Document ] document The document to be deleted.
64
+ #
65
+ # @return [ Document, nil ] The deleted document or nil if nothing deleted.
66
+ #
67
+ # @since 2.0.0.rc.1
68
+ def delete(document)
69
+ execute_callback :before_remove, document
70
+ doc = target.delete_one(document)
71
+ if doc && !_binding?
72
+ _unscoped.delete_one(doc) unless doc.paranoid?
73
+ if _assigning?
74
+ if doc.paranoid?
75
+ doc.destroy(suppress: true)
76
+ else
77
+ base.add_atomic_pull(doc)
78
+ end
79
+ else
80
+ doc.delete(suppress: true)
81
+ unbind_one(doc)
82
+ end
83
+ end
84
+ reindex
85
+ execute_callback :after_remove, document
86
+ doc
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ module Mongoid
94
+ module Relations
95
+ module Embedded
96
+ class Many < Relations::Many
97
+ # For use only with Mongoid::Paranoia - will be removed in 4.0.
98
+ #
99
+ # @example Get the deleted documents from the relation.
100
+ # person.paranoid_phones.deleted
101
+ #
102
+ # @return [ Criteria ] The deleted documents.
103
+ #
104
+ # @since 3.0.10
105
+ def deleted
106
+ unscoped.deleted
107
+ end
108
+ # This class handles the behaviour for a document that embeds many other
109
+ # documents within in it as an array.
110
+ end
111
+ end
112
+ end
113
+ end
@@ -1,5 +1,5 @@
1
- module Mongoid
2
- module Paranoia
3
- VERSION = '0.1.2'
4
- end
5
- end
1
+ module Mongoid
2
+ module Paranoia
3
+ VERSION = '0.2.0'
4
+ end
5
+ end
@@ -1 +1 @@
1
- require "mongoid/paranoia"
1
+ require "mongoid/paranoia"
data/perf/scope.rb CHANGED
@@ -1,64 +1,64 @@
1
- require 'bundler/setup'
2
- require 'mongoid'
3
- require 'mongoid/paranoia'
4
- require 'benchmark'
5
-
6
-
7
- Mongoid.configure do |config|
8
- config.connect_to('my_little_test')
9
- end
10
-
11
- class Model
12
- include Mongoid::Document
13
- field :text, type: String
14
-
15
- index({ text: "text" })
16
- end
17
-
18
- class ParanoidModel
19
- include Mongoid::Document
20
- include Mongoid::Paranoia
21
- field :text, type: String
22
-
23
- index({ text: "text" })
24
- end
25
-
26
- class MetaParanoidModel
27
- include Mongoid::Document
28
- field :text, type: String
29
- field :deleted_at, type: Time
30
- default_scope -> { where(deleted_at: nil) }
31
-
32
- index({ text: "text" })
33
- end
34
-
35
- if ENV['FORCE']
36
- Mongoid.purge!
37
- ::Mongoid::Tasks::Database.create_indexes
38
-
39
- n = 50_000
40
- n.times {|i| Model.create(text: "text #{i}")}
41
- n.times {|i| ParanoidModel.create(text: "text #{i}")}
42
- n.times {|i| MetaParanoidModel.create(text: "text #{i}")}
43
- end
44
-
45
- n = 100
46
-
47
- puts "text_search benchmark ***"
48
- Benchmark.bm(20) do |x|
49
- x.report("without") { n.times { Model.text_search("text").execute } }
50
- x.report("with") { n.times { ParanoidModel.text_search("text").execute } }
51
- x.report("meta") { n.times { MetaParanoidModel.text_search("text").execute } }
52
- x.report("unscoped meta") { n.times { MetaParanoidModel.unscoped.text_search("text").execute } }
53
- x.report("unscoped paranoid") { n.times { ParanoidModel.unscoped.text_search("text").execute } }
54
- end
55
-
56
- puts ""
57
- puts "Pluck all ids benchmark ***"
58
- Benchmark.bm(20) do |x|
59
- x.report("without") { n.times { Model.all.pluck(:id) } }
60
- x.report("with") { n.times { ParanoidModel.all.pluck(:id) } }
61
- x.report("meta") { n.times { MetaParanoidModel.all.pluck(:id) } }
62
- x.report("unscoped meta") { n.times { MetaParanoidModel.unscoped.all.pluck(:id) } }
63
- x.report("unscoped paranoid") { n.times { ParanoidModel.unscoped.all.pluck(:id) } }
64
- end
1
+ require 'bundler/setup'
2
+ require 'mongoid'
3
+ require 'mongoid/paranoia'
4
+ require 'benchmark'
5
+
6
+
7
+ Mongoid.configure do |config|
8
+ config.connect_to('my_little_test')
9
+ end
10
+
11
+ class Model
12
+ include Mongoid::Document
13
+ field :text, type: String
14
+
15
+ index({ text: "text" })
16
+ end
17
+
18
+ class ParanoidModel
19
+ include Mongoid::Document
20
+ include Mongoid::Paranoia
21
+ field :text, type: String
22
+
23
+ index({ text: "text" })
24
+ end
25
+
26
+ class MetaParanoidModel
27
+ include Mongoid::Document
28
+ field :text, type: String
29
+ field :deleted_at, type: Time
30
+ default_scope -> { where(deleted_at: nil) }
31
+
32
+ index({ text: "text" })
33
+ end
34
+
35
+ if ENV['FORCE']
36
+ Mongoid.purge!
37
+ ::Mongoid::Tasks::Database.create_indexes
38
+
39
+ n = 50_000
40
+ n.times {|i| Model.create(text: "text #{i}")}
41
+ n.times {|i| ParanoidModel.create(text: "text #{i}")}
42
+ n.times {|i| MetaParanoidModel.create(text: "text #{i}")}
43
+ end
44
+
45
+ n = 100
46
+
47
+ puts "text_search benchmark ***"
48
+ Benchmark.bm(20) do |x|
49
+ x.report("without") { n.times { Model.text_search("text").execute } }
50
+ x.report("with") { n.times { ParanoidModel.text_search("text").execute } }
51
+ x.report("meta") { n.times { MetaParanoidModel.text_search("text").execute } }
52
+ x.report("unscoped meta") { n.times { MetaParanoidModel.unscoped.text_search("text").execute } }
53
+ x.report("unscoped paranoid") { n.times { ParanoidModel.unscoped.text_search("text").execute } }
54
+ end
55
+
56
+ puts ""
57
+ puts "Pluck all ids benchmark ***"
58
+ Benchmark.bm(20) do |x|
59
+ x.report("without") { n.times { Model.all.pluck(:id) } }
60
+ x.report("with") { n.times { ParanoidModel.all.pluck(:id) } }
61
+ x.report("meta") { n.times { MetaParanoidModel.all.pluck(:id) } }
62
+ x.report("unscoped meta") { n.times { MetaParanoidModel.unscoped.all.pluck(:id) } }
63
+ x.report("unscoped paranoid") { n.times { ParanoidModel.unscoped.all.pluck(:id) } }
64
+ end
@@ -1,71 +1,71 @@
1
- class Address
2
- include Mongoid::Document
3
-
4
- field :_id, type: String, default: ->{ street.try(:parameterize) }
5
-
6
- attr_accessor :mode
7
-
8
- field :address_type
9
- field :number, type: Integer
10
- field :street
11
- field :city
12
- field :state
13
- field :post_code
14
- field :parent_title
15
- field :services, type: Array
16
- field :latlng, type: Array
17
- field :map, type: Hash
18
- field :move_in, type: DateTime
19
- field :s, type: String, as: :suite
20
- field :name, localize: true
21
-
22
- embeds_one :code, validate: false
23
- embeds_one :target, as: :targetable, validate: false
24
-
25
- embedded_in :addressable, polymorphic: true do
26
- def extension
27
- "Testing"
28
- end
29
- def doctor?
30
- title == "Dr"
31
- end
32
- end
33
-
34
- accepts_nested_attributes_for :code, :target
35
-
36
- belongs_to :account
37
-
38
- scope :without_postcode, -> {where(postcode: nil)}
39
- scope :rodeo, -> {
40
- where(street: "Rodeo Dr") do
41
- def mansion?
42
- all? { |address| address.street == "Rodeo Dr" }
43
- end
44
- end
45
- }
46
-
47
- validates_presence_of :street, on: :update
48
- validates_format_of :street, with: /\D/, allow_nil: true
49
-
50
- def set_parent=(set = false)
51
- self.parent_title = addressable.title if set
52
- end
53
-
54
- def <=>(other)
55
- street <=> other.street
56
- end
57
-
58
- class << self
59
- def california
60
- where(state: "CA")
61
- end
62
-
63
- def homes
64
- where(address_type: "Home")
65
- end
66
-
67
- def streets
68
- all.map(&:street)
69
- end
70
- end
71
- end
1
+ class Address
2
+ include Mongoid::Document
3
+
4
+ field :_id, type: String, default: ->{ street.try(:parameterize) }
5
+
6
+ attr_accessor :mode
7
+
8
+ field :address_type
9
+ field :number, type: Integer
10
+ field :street
11
+ field :city
12
+ field :state
13
+ field :post_code
14
+ field :parent_title
15
+ field :services, type: Array
16
+ field :latlng, type: Array
17
+ field :map, type: Hash
18
+ field :move_in, type: DateTime
19
+ field :s, type: String, as: :suite
20
+ field :name, localize: true
21
+
22
+ embeds_one :code, validate: false
23
+ embeds_one :target, as: :targetable, validate: false
24
+
25
+ embedded_in :addressable, polymorphic: true do
26
+ def extension
27
+ "Testing"
28
+ end
29
+ def doctor?
30
+ title == "Dr"
31
+ end
32
+ end
33
+
34
+ accepts_nested_attributes_for :code, :target
35
+
36
+ belongs_to :account
37
+
38
+ scope :without_postcode, -> {where(postcode: nil)}
39
+ scope :rodeo, -> {
40
+ where(street: "Rodeo Dr") do
41
+ def mansion?
42
+ all? { |address| address.street == "Rodeo Dr" }
43
+ end
44
+ end
45
+ }
46
+
47
+ validates_presence_of :street, on: :update
48
+ validates_format_of :street, with: /\D/, allow_nil: true
49
+
50
+ def set_parent=(set = false)
51
+ self.parent_title = addressable.title if set
52
+ end
53
+
54
+ def <=>(other)
55
+ street <=> other.street
56
+ end
57
+
58
+ class << self
59
+ def california
60
+ where(state: "CA")
61
+ end
62
+
63
+ def homes
64
+ where(address_type: "Home")
65
+ end
66
+
67
+ def streets
68
+ all.map(&:street)
69
+ end
70
+ end
71
+ end