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

OUT_ACTIONS

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 64
def initialize(map, reduce, view, options)
  @map = map
  @reduce = reduce
  @view = view
  @options = options
end

Public Instance Methods

command_specification() click to toggle source

Get the specification for issuing a find command on the map/reduce results.

@example Get the command specification.

builder.command_specification

@return [ Hash ] The specification.

@since 2.2.0

# File lib/mongo/collection/view/builder/map_reduce.rb, line 80
def command_specification
  {
    selector: find_command,
    db_name: query_database,
    read: read,
    session: options[:session]
  }
end
query_specification() click to toggle source

Get the specification for the document query after a map/reduce.

@example Get the query specification.

builder.query_specification

@return [ Hash ] The specification.

@since 2.2.0

# File lib/mongo/collection/view/builder/map_reduce.rb, line 97
def query_specification
  { selector: {}, options: {}, db_name: query_database, coll_name: query_collection }
end
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 109
def specification
  spec = {
    selector: map_reduce_command,
    db_name: database.name,
    read: read,
    session: options[:session]
  }
  write?(spec) ? spec.merge!(write_concern: write_concern) : spec
end

Private Instance Methods

find_command() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 130
def find_command
  BSON::Document.new('find' => query_collection, 'filter' => {})
end
map_reduce_command() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 134
def map_reduce_command
  command = BSON::Document.new(
    :mapReduce => collection.name,
    :map => map,
    :reduce => reduce,
    :query => filter,
    :out => { inline: 1 }
  )
  if collection.read_concern
    command[:readConcern] = Options::Mapper.transform_values_to_strings(
      collection.read_concern)
  end
  command.merge!(view_options)
  command.merge!(Options::Mapper.transform_documents(options, MAPPINGS))
  command
end
query_collection() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 155
def query_collection
  if options[:out].respond_to?(:keys)
    options[:out][OUT_ACTIONS.find { |action| options[:out][action] }]
  end || options[:out]
end
query_database() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 151
def query_database
  options[:out].respond_to?(:keys) && options[:out][:db] ? options[:out][:db] : database.name
end
view_options() click to toggle source
# File lib/mongo/collection/view/builder/map_reduce.rb, line 161
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 123
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