class Mongo::Collection::View::Builder::MapReduce

Builds a map/reduce specification from the view and options.

@since 2.2.0

Constants

MAPPINGS

The mappings from ruby options to the map/reduce options.

@since 2.2.0

Attributes

map[R]

@return [ String ] map The map function.

options[R]

@return [ Hash ] options The map/reduce specific options.

reduce[R]

@return [ String ] reduce The reduce function.

view[R]

@return [ Collection::View ] view The collection view.

Public Class Methods

new(map, reduce, view, options) click to toggle source

Initialize the builder.

@example Initialize the builder.

MapReduce.new(map, reduce, view, options)

@param [ String ] map The map function. @param [ String ] reduce The reduce function. @param [ Collection::View ] view The collection view. @param [ Hash ] options The map/reduce options.

@since 2.2.0

# File lib/mongo/collection/view/builder/map_reduce.rb, line 66
def initialize(map, reduce, view, options)
  @map = map
  @reduce = reduce
  @view = view
  @options = options
end

Public Instance Methods

specification() click to toggle source

Get the specification to pass to the map/reduce operation.

@example Get the specification.

builder.specification

@return [ Hash ] The specification.

@since 2.2.0

# File lib/mongo/collection/view/builder/map_reduce.rb, line 81
def specification
  spec = {
    selector: map_reduce_command,
    db_name: database.name,
    # Note that selector just above may also have a read preference
    # specified, per the #map_reduce_command method below.
    read: read,
    session: options[:session]
  }
  write?(spec) ? spec.merge!(write_concern: write_concern) : spec
end

Private Instance Methods

map_reduce_command() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 102
def map_reduce_command
  command = BSON::Document.new(
    :mapReduce => collection.name,
    :map => map,
    :reduce => reduce,
    :query => filter,
    :out => { inline: 1 },
  )
  # Shouldn't this use self.read ?
  if collection.read_concern
    command[:readConcern] = Options::Mapper.transform_values_to_strings(
      collection.read_concern)
  end
  command.update(view_options)
  command.update(options.slice(:collation))

  # Read preference isn't simply passed in the command payload
  # (it may need to be converted to wire protocol flags).
  # Ideally it should be removed here, however due to Mongoid 7
  # using this method and requiring :read to be returned from it,
  # we cannot do this just yet - see RUBY-2932.
  #command.delete(:read)

  command.merge!(Options::Mapper.transform_documents(options, MAPPINGS))
  command
end
view_options() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 129
def view_options
  @view_options ||= (opts = view.options.dup
                     opts.delete(:session)
                     opts)
end
write?(spec) click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 95
def write?(spec)
  if out = spec[:selector][:out]
    out.is_a?(String) ||
      (out.respond_to?(:keys) && out.keys.first.to_s.downcase != View::MapReduce::INLINE)
  end
end