Module: Mongoid::Threaded

Extended by:
Threaded
Included in:
Threaded
Defined in:
build/mongoid-8.1/lib/mongoid/threaded.rb,
build/mongoid-8.1/lib/mongoid/threaded/lifecycle.rb

Overview

This module contains logic for easy access to objects that have a lifecycle on the current thread.

Defined Under Namespace

Modules: Lifecycle

Constant Summary collapse

DATABASE_OVERRIDE_KEY =
"[mongoid]:db-override"
CLIENTS_KEY =

Constant for the key to store clients.

"[mongoid]:clients"
CLIENT_OVERRIDE_KEY =

The key to override the client.

"[mongoid]:client-override"
CURRENT_SCOPE_KEY =

The key for the current thread’s scope stack.

"[mongoid]:current-scope"
AUTOSAVES_KEY =
"[mongoid]:autosaves"
VALIDATIONS_KEY =
"[mongoid]:validations"
STACK_KEYS =
Hash.new do |hash, key|
  hash[key] = "[mongoid]:#{key}-stack"
end
EXECUTE_CALLBACKS =

The key storing the default value for whether or not callbacks are executed on documents.

'[mongoid]:execute-callbacks'
BIND =
'bind'.freeze
ASSIGN =
'assign'.freeze
BUILD =
'build'.freeze
LOAD =
'load'.freeze
CREATE =
'create'.freeze

Instance Method Summary collapse

Instance Method Details

#autosaved?(document) ⇒ true | false

Is the document autosaved on the current thread?

Examples:

Is the document autosaved?

Threaded.autosaved?(doc)

Parameters:

  • document (Document)

    The document to check.

Returns:

  • (true | false)

    If the document is autosaved.



263
264
265
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 263

def autosaved?(document)
  autosaves_for(document.class).include?(document._id)
end

#autosavesHash

Get all autosaves on the current thread.

Examples:

Get all autosaves.

Threaded.autosaves

Returns:

  • (Hash)

    The current autosaves.



285
286
287
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 285

def autosaves
  Thread.current[AUTOSAVES_KEY] ||= {}
end

#autosaves_for(klass) ⇒ Array

Get all autosaves on the current thread for the class.

Examples:

Get all autosaves.

Threaded.autosaves_for(Person)

Parameters:

  • klass (Class)

    The class to check.

Returns:

  • (Array)

    The current autosaves.



307
308
309
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 307

def autosaves_for(klass)
  autosaves[klass] ||= []
end

#begin_autosave(document) ⇒ Object

Begin autosaving a document on the current thread.

Examples:

Begin autosave.

Threaded.begin_autosave(doc)

Parameters:

  • document (Document)

    The document to autosave.



111
112
113
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 111

def begin_autosave(document)
  autosaves_for(document.class).push(document._id)
end

#begin_execution(name) ⇒ true

Begin entry into a named thread local stack.

Examples:

Begin entry into the stack.

Threaded.begin_execution(:create)

Parameters:

  • name (String)

    The name of the stack

Returns:

  • (true)

    True.



43
44
45
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 43

def begin_execution(name)
  stack(name).push(true)
end

#begin_validate(document) ⇒ Object

Begin validating a document on the current thread.

Examples:

Begin validation.

Threaded.begin_validate(doc)

Parameters:

  • document (Document)

    The document to validate.



121
122
123
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 121

def begin_validate(document)
  validations_for(document.class).push(document._id)
end

#begin_without_default_scope(klass) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Begin suppressing default scopes for given model on the current thread.

Examples:

Begin without default scope stack.

Threaded.begin_without_default_scope(klass)

Parameters:

  • klass (Class)

    The model to suppress default scoping on.



153
154
155
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 153

def begin_without_default_scope(klass)
  stack(:without_default_scope).push(klass)
end

#clear_sessionnil

Clear the cached session for this thread.

Examples:

Clear this thread’s session.

Threaded.clear_session

Returns:

  • (nil)


348
349
350
351
352
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 348

def clear_session
  session = get_session
  session.end_session if session
  Thread.current["[mongoid]:session"] = nil
end

#client_overrideString | Symbol

Get the global client override.

Examples:

Get the global client override.

Threaded.client_override

Returns:

  • (String | Symbol)

    The override.



175
176
177
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 175

def client_override
  Thread.current[CLIENT_OVERRIDE_KEY]
end

#client_override=(name) ⇒ String | Symbol

Set the global client override.

Examples:

Set the global client override.

Threaded.client_override = :testing

Parameters:

  • name (String | Symbol)

    The global override name.

Returns:

  • (String | Symbol)

    The override.



187
188
189
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 187

def client_override=(name)
  Thread.current[CLIENT_OVERRIDE_KEY] = name
end

#current_scope(klass = nil) ⇒ Criteria

Get the current Mongoid scope.

Examples:

Get the scope.

Threaded.current_scope(klass)
Threaded.current_scope

Parameters:

  • klass (Klass) (defaults to: nil)

    The class type of the scope.

Returns:



200
201
202
203
204
205
206
207
208
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 200

def current_scope(klass = nil)
  if klass && Thread.current[CURRENT_SCOPE_KEY].respond_to?(:keys)
    Thread.current[CURRENT_SCOPE_KEY][
        Thread.current[CURRENT_SCOPE_KEY].keys.find { |k| k <= klass }
    ]
  else
    Thread.current[CURRENT_SCOPE_KEY]
  end
end

#current_scope=(scope) ⇒ Criteria

Set the current Mongoid scope.

Examples:

Set the scope.

Threaded.current_scope = scope

Parameters:

  • scope (Criteria)

    The current scope.

Returns:



218
219
220
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 218

def current_scope=(scope)
  Thread.current[CURRENT_SCOPE_KEY] = scope
end

#database_overrideString | Symbol

Get the global database override.

Examples:

Get the global database override.

Threaded.database_override

Returns:

  • (String | Symbol)

    The override.



53
54
55
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 53

def database_override
  Thread.current[DATABASE_OVERRIDE_KEY]
end

#database_override=(name) ⇒ String | Symbol

Set the global database override.

Examples:

Set the global database override.

Threaded.database_override = :testing

Parameters:

  • name (String | Symbol)

    The global override name.

Returns:

  • (String | Symbol)

    The override.



65
66
67
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 65

def database_override=(name)
  Thread.current[DATABASE_OVERRIDE_KEY] = name
end

#execute_callbacks=(flag) ⇒ Object

Indicates whether document callbacks should be invoked by default for the current thread. Individual documents may further override the callback behavior, but this will be used for the default behavior.

Parameters:

  • flag (true | false)

    Whether or not document callbacks should be executed by default.



376
377
378
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 376

def execute_callbacks=(flag)
  Thread.current[EXECUTE_CALLBACKS] = flag
end

#execute_callbacks?true | false

Queries whether document callbacks should be executed by default for the current thread.

Unless otherwise indicated (by #execute_callbacks=), this will return true.

Returns:

  • (true | false)

    Whether or not document callbacks should be executed by default.



362
363
364
365
366
367
368
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 362

def execute_callbacks?
  if Thread.current.key?(EXECUTE_CALLBACKS)
    Thread.current[EXECUTE_CALLBACKS]
  else
    true
  end
end

#executing?(name) ⇒ true

Are in the middle of executing the named stack

Examples:

Are we in the stack execution?

Threaded.executing?(:create)

Parameters:

  • name (Symbol)

    The name of the stack

Returns:

  • (true)

    If the stack is being executed.



77
78
79
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 77

def executing?(name)
  !stack(name).empty?
end

#exit_autosave(document) ⇒ Object

Exit autosaving a document on the current thread.

Examples:

Exit autosave.

Threaded.exit_autosave(doc)

Parameters:

  • document (Document)

    The document to autosave.



131
132
133
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 131

def exit_autosave(document)
  autosaves_for(document.class).delete_one(document._id)
end

#exit_execution(name) ⇒ true

Exit from a named thread local stack.

Examples:

Exit from the stack.

Threaded.exit_execution(:create)

Parameters:

  • name (Symbol)

    The name of the stack

Returns:

  • (true)

    True.



89
90
91
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 89

def exit_execution(name)
  stack(name).pop
end

#exit_validate(document) ⇒ Object

Exit validating a document on the current thread.

Examples:

Exit validation.

Threaded.exit_validate(doc)

Parameters:

  • document (Document)

    The document to validate.



141
142
143
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 141

def exit_validate(document)
  validations_for(document.class).delete_one(document._id)
end

#exit_without_default_scope(klass) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Exit suppressing default scopes for given model on the current thread.

Examples:

Exit without default scope stack.

Threaded.exit_without_default_scope(klass)

Parameters:

  • klass (Class)

    The model to unsuppress default scoping on.



165
166
167
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 165

def exit_without_default_scope(klass)
  stack(:without_default_scope).delete(klass)
end

#get_sessionMongo::Session | nil

Get the cached session for this thread.

Examples:

Get the session for this thread.

Threaded.get_session

Returns:

  • (Mongo::Session | nil)

    The session cached on this thread or nil.



338
339
340
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 338

def get_session
  Thread.current["[mongoid]:session"]
end

#set_current_scope(scope, klass) ⇒ Criteria

Set the current Mongoid scope. Safe for multi-model scope chaining.

Examples:

Set the scope.

Threaded.current_scope(scope, klass)

Parameters:

  • scope (Criteria)

    The current scope.

  • klass (Class)

    The current model class.

Returns:



231
232
233
234
235
236
237
238
239
240
241
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 231

def set_current_scope(scope, klass)
  if scope.nil?
    if Thread.current[CURRENT_SCOPE_KEY]
      Thread.current[CURRENT_SCOPE_KEY].delete(klass)
      Thread.current[CURRENT_SCOPE_KEY] = nil if Thread.current[CURRENT_SCOPE_KEY].empty?
    end
  else
    Thread.current[CURRENT_SCOPE_KEY] ||= {}
    Thread.current[CURRENT_SCOPE_KEY][klass] = scope
  end
end

#set_session(session) ⇒ Object

Cache a session for this thread.

Examples:

Save a session for this thread.

Threaded.set_session(session)

Parameters:

  • session (Mongo::Session)

    The session to save.



328
329
330
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 328

def set_session(session)
  Thread.current["[mongoid]:session"] = session
end

#stack(name) ⇒ Array

Get the named stack.

Examples:

Get a stack by name

Threaded.stack(:create)

Parameters:

  • name (Symbol)

    The name of the stack

Returns:

  • (Array)

    The stack.



101
102
103
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 101

def stack(name)
  Thread.current[STACK_KEYS[name]] ||= []
end

#validated?(document) ⇒ true | false

Is the document validated on the current thread?

Examples:

Is the document validated?

Threaded.validated?(doc)

Parameters:

  • document (Document)

    The document to check.

Returns:

  • (true | false)

    If the document is validated.



275
276
277
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 275

def validated?(document)
  validations_for(document.class).include?(document._id)
end

#validationsHash

Get all validations on the current thread.

Examples:

Get all validations.

Threaded.validations

Returns:

  • (Hash)

    The current validations.



295
296
297
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 295

def validations
  Thread.current[VALIDATIONS_KEY] ||= {}
end

#validations_for(klass) ⇒ Array

Get all validations on the current thread for the class.

Examples:

Get all validations.

Threaded.validations_for(Person)

Parameters:

  • klass (Class)

    The class to check.

Returns:

  • (Array)

    The current validations.



318
319
320
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 318

def validations_for(klass)
  validations[klass] ||= []
end

#without_default_scope?(klass) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Is the given klass’ default scope suppressed on the current thread?

Examples:

Is the given klass’ default scope suppressed?

Threaded.without_default_scope?(klass)

Parameters:

  • klass (Class)

    The model to check for default scope suppression.

Returns:



251
252
253
# File 'build/mongoid-8.1/lib/mongoid/threaded.rb', line 251

def without_default_scope?(klass)
  stack(:without_default_scope).include?(klass)
end