mongoid_paranoia 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,13 @@
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
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Paranoia
5
+ class Configuration
6
+ attr_accessor :paranoid_field
7
+
8
+ def initialize
9
+ @paranoid_field = :deleted_at
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,113 +1,114 @@
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 Association
21
- module Nested
22
- class Many
23
- # Destroy the child document, needs to do some checking for embedded
24
- # relations and delay the destroy in case parent validation fails.
25
- #
26
- # @api private
27
- #
28
- # @example Destroy the child.
29
- # builder.destroy(parent, relation, doc)
30
- #
31
- # @param [ Document ] parent The parent document.
32
- # @param [ Proxy ] relation The relation proxy.
33
- # @param [ Document ] doc The doc to destroy.
34
- #
35
- # @since 3.0.10
36
- def destroy(parent, relation, doc)
37
- doc.flagged_for_destroy = true
38
- if !doc.embedded? || parent.new_record? || doc.paranoid?
39
- destroy_document(relation, doc)
40
- else
41
- parent.flagged_destroys.push(->{ destroy_document(relation, doc) })
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
48
-
49
- module Mongoid
50
- module Association
51
- module Embedded
52
- class EmbedsMany
53
- class Proxy < Association::Many
54
- # Delete the supplied document from the target. This method is proxied
55
- # in order to reindex the array after the operation occurs.
56
- #
57
- # @example Delete the document from the relation.
58
- # person.addresses.delete(address)
59
- #
60
- # @param [ Document ] document The document to be deleted.
61
- #
62
- # @return [ Document, nil ] The deleted document or nil if nothing deleted.
63
- #
64
- # @since 2.0.0.rc.1
65
- def delete(document)
66
- execute_callback :before_remove, document
67
- doc = _target.delete_one(document)
68
- if doc && !_binding?
69
- _unscoped.delete_one(doc) unless doc.paranoid?
70
- if _assigning?
71
- if doc.paranoid?
72
- doc.destroy(suppress: true)
73
- else
74
- _base.add_atomic_pull(doc)
75
- end
76
- else
77
- doc.delete(suppress: true)
78
- unbind_one(doc)
79
- end
80
- end
81
- reindex
82
- execute_callback :after_remove, document
83
- doc
84
- end
85
- end
86
- end
87
- end
88
- end
89
- end
90
-
91
- module Mongoid
92
- module Association
93
- module Embedded
94
- class EmbedsMany
95
- class Proxy < Association::Many
96
- # For use only with Mongoid::Paranoia - will be removed in 4.0.
97
- #
98
- # @example Get the deleted documents from the relation.
99
- # person.paranoid_phones.deleted
100
- #
101
- # @return [ Criteria ] The deleted documents.
102
- #
103
- # @since 3.0.10
104
- def deleted
105
- unscoped.deleted
106
- end
107
- # This class handles the behaviour for a document that embeds many other
108
- # documents within in it as an array.
109
- end
110
- end
111
- end
112
- end
113
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Paranoia
5
+ module Document
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ # Indicates whether or not the document includes Mongoid::Paranoia.
10
+ # In Mongoid 3, this method was defined on all Mongoid::Documents.
11
+ # In Mongoid 4, it is no longer defined, hence we are shimming it here.
12
+ class_attribute :paranoid
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ Mongoid::Document.include Mongoid::Paranoia::Document
19
+
20
+ module Mongoid
21
+ module Association
22
+ module Nested
23
+ class Many
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
+
50
+ module Mongoid
51
+ module Association
52
+ module Embedded
53
+ class EmbedsMany
54
+ class Proxy < Association::Many
55
+ # Delete the supplied document from the target. This method is proxied
56
+ # in order to reindex the array after the operation occurs.
57
+ #
58
+ # @example Delete the document from the relation.
59
+ # person.addresses.delete(address)
60
+ #
61
+ # @param [ Document ] document The document to be deleted.
62
+ #
63
+ # @return [ Document, nil ] The deleted document or nil if nothing deleted.
64
+ #
65
+ # @since 2.0.0.rc.1
66
+ def delete(document)
67
+ execute_callback :before_remove, document
68
+ doc = _target.delete_one(document)
69
+ if doc && !_binding?
70
+ _unscoped.delete_one(doc) unless doc.paranoid?
71
+ if _assigning?
72
+ if doc.paranoid?
73
+ doc.destroy(suppress: true)
74
+ else
75
+ _base.add_atomic_pull(doc)
76
+ end
77
+ else
78
+ doc.delete(suppress: true)
79
+ unbind_one(doc)
80
+ end
81
+ end
82
+ reindex
83
+ execute_callback :after_remove, document
84
+ doc
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ module Mongoid
93
+ module Association
94
+ module Embedded
95
+ class EmbedsMany
96
+ class Proxy < Association::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
114
+ end
@@ -1,5 +1,7 @@
1
- module Mongoid
2
- module Paranoia
3
- VERSION = '0.4.0'.freeze
4
- end
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Mongoid
4
+ module Paranoia
5
+ VERSION = '0.4.1'
6
+ end
7
+ end
@@ -1 +1,3 @@
1
- require "mongoid/paranoia"
1
+ # frozen_string_literal: true
2
+
3
+ require 'mongoid/paranoia'
data/perf/scope.rb CHANGED
@@ -1,64 +1,65 @@
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
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'mongoid'
5
+ require 'mongoid/paranoia'
6
+ require 'benchmark'
7
+
8
+ Mongoid.configure do |config|
9
+ config.connect_to('my_little_test')
10
+ end
11
+
12
+ class Model
13
+ include Mongoid::Document
14
+ field :text, type: String
15
+
16
+ index({ text: 'text' })
17
+ end
18
+
19
+ class ParanoidModel
20
+ include Mongoid::Document
21
+ include Mongoid::Paranoia
22
+ field :text, type: String
23
+
24
+ index({ text: 'text' })
25
+ end
26
+
27
+ class MetaParanoidModel
28
+ include Mongoid::Document
29
+ field :text, type: String
30
+ field :deleted_at, type: Time
31
+ default_scope -> { where(deleted_at: nil) }
32
+
33
+ index({ text: 'text' })
34
+ end
35
+
36
+ if ENV['FORCE']
37
+ Mongoid.purge!
38
+ ::Mongoid::Tasks::Database.create_indexes
39
+
40
+ n = 50_000
41
+ n.times {|i| Model.create(text: "text #{i}") }
42
+ n.times {|i| ParanoidModel.create(text: "text #{i}") }
43
+ n.times {|i| MetaParanoidModel.create(text: "text #{i}") }
44
+ end
45
+
46
+ n = 100
47
+
48
+ puts 'text_search benchmark ***'
49
+ Benchmark.bm(20) do |x|
50
+ x.report('without') { n.times { Model.text_search('text').execute } }
51
+ x.report('with') { n.times { ParanoidModel.text_search('text').execute } }
52
+ x.report('meta') { n.times { MetaParanoidModel.text_search('text').execute } }
53
+ x.report('unscoped meta') { n.times { MetaParanoidModel.unscoped.text_search('text').execute } }
54
+ x.report('unscoped paranoid') { n.times { ParanoidModel.unscoped.text_search('text').execute } }
55
+ end
56
+
57
+ puts ''
58
+ puts 'Pluck all ids benchmark ***'
59
+ Benchmark.bm(20) do |x|
60
+ x.report('without') { n.times { Model.all.pluck(:id) } }
61
+ x.report('with') { n.times { ParanoidModel.all.pluck(:id) } }
62
+ x.report('meta') { n.times { MetaParanoidModel.all.pluck(:id) } }
63
+ x.report('unscoped meta') { n.times { MetaParanoidModel.unscoped.all.pluck(:id) } }
64
+ x.report('unscoped paranoid') { n.times { ParanoidModel.unscoped.all.pluck(:id) } }
65
+ 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