Class: Moped::PromiscuousCollectionWrapper::PromiscuousCollectionOperation

Inherits:
Promiscuous::Publisher::Operation::Atomic show all
Defined in:
lib/promiscuous/publisher/operation/mongoid.rb

Instance Attribute Summary

Attributes inherited from Promiscuous::Publisher::Operation::Atomic

#instance

Attributes inherited from Promiscuous::Publisher::Operation::Base

#operation

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Promiscuous::Publisher::Operation::Atomic

#acquire_op_lock, #do_database_query, #fetch_instance, #increment_version_in_document, #operation_payloads, #query_dependencies, #reload_instance, #use_id_selector, #yell_about_missing_instance

Methods inherited from Promiscuous::Publisher::Operation::Base

_acquire_lock, #acquire_op_lock, #dependencies_for, #dependency_for_op_lock, #ensure_op_still_locked, #execute, #explain_operation, #generate_payload, #get_new_op_lock, #increment_dependencies, lock_options, #on_rabbitmq_confirm, #operation_payloads, #payload_for, #publish_payload_in_rabbitmq_async, #publish_payload_in_redis, #query_dependencies, rabbitmq_staging_set_key, #record_timestamp, recover_locks, recover_operation_from_lock, recover_payloads_for_rabbitmq, #recovering?, register_recovery_mechanism, #release_op_lock, run_recovery_mechanisms, #trace_operation, #write_dependencies

Constructor Details

#initialize(options = {}) ⇒ PromiscuousCollectionOperation

Returns a new instance of PromiscuousCollectionOperation.



8
9
10
11
12
13
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 8

def initialize(options={})
  super
  @operation = :create
  @collection = options[:collection]
  @document   = options[:document]
end

Class Method Details

.recover_operation(collection, instance_id, document) ⇒ Object



29
30
31
32
33
34
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 29

def self.recover_operation(collection, instance_id, document)
  model = Promiscuous::Publisher::Model::Mongoid.collection_mapping[collection]
  document = YAML.load(document)
  instance = Mongoid::Factory.from_db(model, document)
  new(:collection => model.collection, :document => document, :instance => instance)
end

Instance Method Details

#execute_instrumented(query) ⇒ Object



43
44
45
46
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 43

def execute_instrumented(query)
  @instance = Mongoid::Factory.from_db(model, @document)
  super
end

#modelObject



15
16
17
18
19
20
21
22
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 15

def model
  @model ||= @document.try(:[], '_type').try(:constantize) ||
             Promiscuous::Publisher::Model::Mongoid.collection_mapping[@collection.name]
  # Double check because of the _type lookup
  @model = nil unless @model < Promiscuous::Publisher::Model::Mongoid
  @model
rescue NameError
end

#recover_db_operationObject



36
37
38
39
40
41
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 36

def recover_db_operation
  without_promiscuous do
    return if model.unscoped.where(:id => @instance.id).first # already done?
    @collection.insert(@document)
  end
end

#recoverable_failure?(exception) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 52

def recoverable_failure?(exception)
  exception.is_a?(Moped::Errors::ConnectionFailure)
end

#recovery_payloadObject



24
25
26
27
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 24

def recovery_payload
  # We use yaml because we need the BSON types.
  [@instance.class.promiscuous_collection_name, @instance.id, @document.to_yaml]
end

#should_instrument_query?Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/promiscuous/publisher/operation/mongoid.rb', line 48

def should_instrument_query?
  super && model
end