class Mongo::BulkWrite::ResultCombiner

Combines bulk write results together.

@api private

@since 2.1.0

Attributes

count[R]

@return [ Integer ] count The number of documents in the entire batch.

results[R]

@return [ Hash ] results The results hash.

Public Class Methods

new() click to toggle source

Create the new result combiner.

@api private

@example Create the result combiner.

ResultCombiner.new

@since 2.1.0

# File lib/mongo/bulk_write/result_combiner.rb, line 39
def initialize
  @results = {}
  @count = 0
end

Public Instance Methods

combine!(result, count) click to toggle source

Adds a result to the overall results.

@api private

@example Add the result.

combiner.combine!(result, count)

@param [ Operation::Result ] result The result to combine. @param [ Integer ] count The count of requests in the batch.

@since 2.1.0

# File lib/mongo/bulk_write/result_combiner.rb, line 55
def combine!(result, count)
  # Errors can be communicated by the server in a variety of fields:
  # writeError, writeErrors, writeConcernError, writeConcernErrors.
  # Currently only errors given in writeConcernErrors will cause
  # counts not to be added, because this behavior is covered by the
  # retryable writes tests. It is possible that some or all of the
  # other errors should also be excluded when combining counts and
  # ids, and it is also possible that only a subset of these error
  # fields is actually possible in the context of bulk writes.
  unless result.write_concern_error?
    combine_counts!(result)
    combine_ids!(result)
  end
  combine_errors!(result)
  @count += count
end
result() click to toggle source

Get the final result.

@api private

@example Get the final result.

combinator.result

@return [ BulkWrite::Result ] The final result.

@since 2.1.0

# File lib/mongo/bulk_write/result_combiner.rb, line 82
def result
  BulkWrite::Result.new(results).validate!
end

Private Instance Methods

combine_counts!(result) click to toggle source
# File lib/mongo/bulk_write/result_combiner.rb, line 88
def combine_counts!(result)
  Result::FIELDS.each do |field|
    if result.respond_to?(field) && value = result.send(field)
      results.merge!(field => (results[field] || 0) + value)
    end
  end
end
combine_errors!(result) click to toggle source
# File lib/mongo/bulk_write/result_combiner.rb, line 107
def combine_errors!(result)
  combine_write_errors!(result)
  combine_write_concern_errors!(result)
end
combine_ids!(result) click to toggle source
# File lib/mongo/bulk_write/result_combiner.rb, line 96
def combine_ids!(result)
  if result.respond_to?(Result::INSERTED_IDS)
    results[Result::INSERTED_IDS] = (results[Result::INSERTED_IDS] || []) +
                                      result.inserted_ids
  end
  if result.respond_to?(Result::UPSERTED)
    results[Result::UPSERTED_IDS] = (results[Result::UPSERTED_IDS] || []) +
                                      result.upserted.map{ |doc| doc['_id'] }
  end
end
combine_write_concern_errors!(result) click to toggle source
# File lib/mongo/bulk_write/result_combiner.rb, line 122
def combine_write_concern_errors!(result)
  if write_concern_errors = result.aggregate_write_concern_errors(count)
    results['writeConcernErrors'] = (results['writeConcernErrors'] || []) +
                                             write_concern_errors
  end
end
combine_write_errors!(result) click to toggle source
# File lib/mongo/bulk_write/result_combiner.rb, line 112
def combine_write_errors!(result)
  if write_errors = result.aggregate_write_errors(count)
    results.merge!(
      'writeErrors' => ((results['writeErrors'] || []) << write_errors).flatten
    )
  else
    result.validate!
  end
end