/**
* Copyright (c) 2010 10gen, Inc. <http://10gen.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.mongodb;
import java.util.Map;
/**
* This class groups the argument for a map/reduce operation and can build the underlying command object
* @dochub mapreduce
*/
public class MapReduceCommand {
/**
* INLINE - Return results inline, no result is written to the DB server
* REPLACE - Save the job output to a collection, replacing its previous content
* MERGE - Merge the job output with the existing contents of outputTarget collection
* REDUCE - Reduce the job output with the existing contents of outputTarget collection
*/
public static enum OutputType {
REPLACE, MERGE, REDUCE, INLINE
};
/**
* Represents the command for a map reduce operation
* Runs the command in REPLACE output type to a named collection
*
* @param inputCollection
* the collection to read from
* @param map
* map function in javascript code
* @param reduce
* reduce function in javascript code
* @param outputCollection
* optional - leave null if want to get the result inline
* @param type
* the type of output
* @param query
* the query to use on input
* @return
* @throws MongoException
* @dochub mapreduce
*/
public MapReduceCommand(DBCollection inputCollection , String map , String reduce , String outputCollection, OutputType type, DBObject query) throws MongoException {
_input = inputCollection.getName();
_map = map;
_reduce = reduce;
_outputTarget = outputCollection;
_outputType = type;
_query = query;
}
/**
* Sets the verbosity of the MapReduce job,
* defaults to 'true'
*
* @param verbose
* The verbosity level.
*/
public void setVerbose( Boolean verbose ){
_verbose = verbose;
}
/**
* Gets the verbosity of the MapReduce job.
*
* @return the verbosity level.
*/
public Boolean isVerbose(){
return _verbose;
}
/**
* Get the name of the collection the MapReduce will read from
*
* @return name of the collection the MapReduce will read from
*/
public String getInput(){
return _input;
}
/**
* Get the map function, as a JS String
*
* @return the map function (as a JS String)
*/
public String getMap(){
return _map;
}
/**
* Gets the reduce function, as a JS String
*
* @return the reduce function (as a JS String)
*/
public String getReduce(){
return _reduce;
}
/**
* Gets the output target (name of collection to save to)
* This value is nullable only if OutputType is set to INLINE
*
* @return The outputTarget
*/
public String getOutputTarget(){
return _outputTarget;
}
/**
* Gets the OutputType for this instance.
* @return The outputType.
*/
public OutputType getOutputType(){
return _outputType;
}
/**
* Gets the Finalize JS Function
*
* @return The finalize function (as a JS String).
*/
public String getFinalize(){
return _finalize;
}
/**
* Sets the Finalize JS Function
*
* @param finalize
* The finalize function (as a JS String)
*/
public void setFinalize( String finalize ){
_finalize = finalize;
}
/**
* Gets the query to run for this MapReduce job
*
* @return The query object
*/
public DBObject getQuery(){
return _query;
}
/**
* Gets the (optional) sort specification object
*
* @return the Sort DBObject
*/
public DBObject getSort(){
return _sort;
}
/**
* Sets the (optional) sort specification object
*
* @param sort
* The sort specification object
*/
public void setSort( DBObject sort ){
_sort = sort;
}
/**
* Gets the (optional) limit on input
*
* @return The limit specification object
*/
public int getLimit(){
return _limit;
}
/**
* Sets the (optional) limit on input
*
* @param limit
* The limit specification object
*/
public void setLimit( int limit ){
_limit = limit;
}
/**
* Gets the (optional) JavaScript scope
*
* @return The JavaScript scope
*/
public Map<String, Object> getScope(){
return _scope;
}
/**
* Sets the (optional) JavaScript scope
*
* @param scope
* The JavaScript scope
*/
public void setScope( Map<String, Object> scope ){
_scope = scope;
}
/**
* Sets the (optional) database name where the output collection should reside
* @param outputDB
*/
public void setOutputDB(String outputDB) {
this._outputDB = outputDB;
}
public DBObject toDBObject() {
BasicDBObject cmd = new BasicDBObject();
cmd.put("mapreduce", _input);
cmd.put("map", _map);
cmd.put("reduce", _reduce);
cmd.put("verbose", _verbose);
BasicDBObject out = new BasicDBObject();
switch(_outputType) {
case INLINE:
out.put("inline", 1);
break;
case REPLACE:
out.put("replace", _outputTarget);
break;
case MERGE:
out.put("merge", _outputTarget);
break;
case REDUCE:
out.put("reduce", _outputTarget);
break;
}
if (_outputDB != null)
out.put("db", _outputDB);
cmd.put("out", out);
if (_query != null)
cmd.put("query", _query);
if (_finalize != null)
cmd.put( "finalize", _finalize );
if (_sort != null)
cmd.put("sort", _sort);
if (_limit > 0)
cmd.put("limit", _limit);
if (_scope != null)
cmd.put("scope", _scope);
if (_extra != null) {
cmd.putAll(_extra);
}
return cmd;
}
public void addExtraOption(String name, Object value) {
if (_extra == null)
_extra = new BasicDBObject();
_extra.put(name, value);
}
public DBObject getExtraOptions() {
return _extra;
}
/**
* Sets the read preference for this command.
* See the * documentation for {@link ReadPreference}
* for more information.
*
* @param preference Read Preference to use
*/
public void setReadPreference( ReadPreference preference ){
_readPref = preference;
}
/**
* Gets the read preference
* @return
*/
public ReadPreference getReadPreference(){
return _readPref;
}
public String toString() {
return toDBObject().toString();
}
final String _input;
final String _map;
final String _reduce;
final String _outputTarget;
ReadPreference _readPref;
String _outputDB = null;
final OutputType _outputType;
final DBObject _query;
String _finalize;
DBObject _sort;
int _limit;
Map<String, Object> _scope;
Boolean _verbose = true;
DBObject _extra;
}