lib/mongo/collection/view/map_reduce.rb in mongo-2.5.0.beta vs lib/mongo/collection/view/map_reduce.rb in mongo-2.5.0

- old
+ new

@@ -39,14 +39,14 @@ # @return [ View ] view The collection view. attr_reader :view # @return [ String ] map The map function. - attr_reader :map + attr_reader :map_function # @return [ String ] reduce The reduce function. - attr_reader :reduce + attr_reader :reduce_function # Delegate necessary operations to the view. def_delegators :view, :collection, :read, :cluster # Delegate necessary operations to the collection. @@ -64,13 +64,14 @@ # @since 2.0.0 # # @yieldparam [ Hash ] Each matching document. def each @cursor = nil - session = client.send(:get_session, view.options) - write_with_retry(session, Proc.new { server_selector.select_server(cluster, false) }) do |server| + session = client.send(:get_session, @options) + legacy_write_with_retry do |server| result = send_initial_query(server, session) + result = send_fetch_query(server, session) unless inline? @cursor = Cursor.new(view, result, server, session: session) end @cursor.each do |doc| yield doc end if block_given? @@ -103,12 +104,12 @@ # @param [ Hash ] options The map/reduce options. # # @since 2.0.0 def initialize(view, map, reduce, options = {}) @view = view - @map = map.freeze - @reduce = reduce.freeze + @map_function = map.freeze + @reduce_function = reduce.freeze @options = BSON::Document.new(options).freeze end # Set or get the jsMode flag for the operation. # @@ -178,26 +179,43 @@ # @since 2.0.5 def verbose(value = nil) configure(:verbose, value) end + # Execute the map reduce, without doing a fetch query to retrieve the results + # if outputted to a collection. + # + # @example Execute the map reduce and get the raw result. + # map_reduce.execute + # + # @return [ Mongo::Operation::Result ] The raw map reduce result + # + # @since 2.5.0 + def execute + view.send(:with_session, @options) do |session| + legacy_write_with_retry do |server| + send_initial_query(server, session) + end + end + end + private def server_selector @view.send(:server_selector) end def inline? out.nil? || out == { inline: 1 } || out == { INLINE => 1 } end - def map_reduce_spec(session) - Builder::MapReduce.new(map, reduce, view, options.merge(session: session)).specification + def map_reduce_spec(session = nil) + Builder::MapReduce.new(map_function, reduce_function, view, options.merge(session: session)).specification end def new(options) - MapReduce.new(view, map, reduce, options) + MapReduce.new(view, map_function, reduce_function, options) end def initial_query_op(session) Operation::Commands::MapReduce.new(map_reduce_spec(session)) end @@ -214,19 +232,18 @@ unless valid_server?(server) log_warn(REROUTE) server = cluster.next_primary(false) end validate_collation!(server) - result = initial_query_op(session).execute(server) - inline? ? result : send_fetch_query(server, session) + initial_query_op(session).execute(server) end def fetch_query_spec - Builder::MapReduce.new(map, reduce, view, options).query_specification + Builder::MapReduce.new(map_function, reduce_function, view, options).query_specification end def find_command_spec(session) - Builder::MapReduce.new(map, reduce, view, options.merge(session: session)).command_specification + Builder::MapReduce.new(map_function, reduce_function, view, options.merge(session: session)).command_specification end def fetch_query_op(server, session) if server.features.find_command_enabled? Operation::Commands::Find.new(find_command_spec(session))