/*
 * Copyright 2016 MongoDB, Inc.
 *
 * 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 org.mongodb.morphia;

import com.mongodb.DBCollection;
import com.mongodb.MapReduceCommand;
import com.mongodb.MapReduceCommand.OutputType;
import com.mongodb.ReadPreference;
import com.mongodb.client.model.Collation;
import org.mongodb.morphia.mapping.Mapper;
import org.mongodb.morphia.query.Query;
import org.mongodb.morphia.query.QueryException;
import org.mongodb.morphia.utils.Assert;

import java.util.Map;
import java.util.concurrent.TimeUnit;

This defines options that can be applied to a mapreduce job
Type parameters:
  • <T> – the type of the output
Since:1.3
/** * This defines options that can be applied to a mapreduce job * * @param <T> the type of the output * @since 1.3 */
public class MapReduceOptions<T> { private String outputDB; private String outputCollection; private String inputCollection; private String map; private String reduce; private OutputType outputType; private Query query; private String finalize; private ReadPreference readPreference; private int limit; private long maxTimeMS; private Map<String, Object> scope; private boolean jsMode; private boolean verbose; private boolean bypassDocumentValidation; private Collation collation; private Class<T> resultType;
Sets whether to bypass document validation.
Params:
  • bypassDocumentValidation – whether to bypass document validation, or null if unspecified
Returns:this
@mongodb.server.release3.2
/** * Sets whether to bypass document validation. * * @param bypassDocumentValidation whether to bypass document validation, or null if unspecified * @return this * @mongodb.server.release 3.2 */
public MapReduceOptions<T> bypassDocumentValidation(final Boolean bypassDocumentValidation) { this.bypassDocumentValidation = bypassDocumentValidation; return this; }
Sets the collation options
Params:
  • collation – the collation options
Returns:this
@mongodb.server.release3.4
/** * Sets the collation options * * @param collation the collation options * @return this * @mongodb.server.release 3.4 */
public MapReduceOptions<T> collation(final Collation collation) { this.collation = collation; return this; }
Sets the Finalize JS Function
Params:
  • finalize – The finalize function (as a JS String)
Returns:this
/** * Sets the Finalize JS Function * * @param finalize The finalize function (as a JS String) * @return this */
public MapReduceOptions<T> finalize(final String finalize) { this.finalize = finalize; return this; }
Sets the (optional) JavaScript Mode
Params:
  • jsMode – Specifies whether to convert intermediate data into BSON format between the execution of the map and reduce functions
Returns:this
/** * Sets the (optional) JavaScript Mode * * @param jsMode Specifies whether to convert intermediate data into BSON format between the execution of the map and reduce functions * @return this */
public MapReduceOptions<T> jsMode(final Boolean jsMode) { this.jsMode = jsMode; return this; }
Sets the (optional) limit on input
Params:
  • limit – The limit specification object
Returns:this
/** * Sets the (optional) limit on input * * @param limit The limit specification object * @return this */
public MapReduceOptions<T> limit(final int limit) { this.limit = limit; return this; }
Set the JavaScript function that associates or "maps" a value with a key and emits the key and value pair.
Params:
  • map – the JavaScript function
Returns:this
/** * Set the JavaScript function that associates or "maps" a value with a key and emits the key and value pair. * * @param map the JavaScript function * @return this */
public MapReduceOptions<T> map(final String map) { Assert.parametersNotNull("map", map); Assert.parameterNotEmpty("map", map); this.map = map; return this; }
Sets the max execution time for this command, in the given time unit.
Params:
  • maxTimeMS – the maximum execution time in milliseconds. A non-zero value requires a server version >= 2.6
Returns:this
@mongodb.server.release2.6
/** * Sets the max execution time for this command, in the given time unit. * * @param maxTimeMS the maximum execution time in milliseconds. A non-zero value requires a server version &gt;= 2.6 * @return this * @mongodb.server.release 2.6 */
public MapReduceOptions<T> maxTimeMS(final long maxTimeMS) { this.maxTimeMS = maxTimeMS; return this; }
Sets the input collection for the job should that collection differ from the mapped collection used in the query
Params:
  • name – the collection name
Returns:this
/** * Sets the input collection for the job should that collection differ from the mapped collection used in the query * * @param name the collection name * @return this */
public MapReduceOptions<T> inputCollection(final String name) { this.inputCollection = name; return this; }
Sets the output collection for the job
Params:
  • name – the collection name
Returns:this
/** * Sets the output collection for the job * * @param name the collection name * @return this */
public MapReduceOptions<T> outputCollection(final String name) { this.outputCollection = name; return this; }
Sets the (optional) database name where the output collection should reside
Params:
  • outputDB – the name of the database to send the Map Reduce output to
Returns:this
/** * Sets the (optional) database name where the output collection should reside * * @param outputDB the name of the database to send the Map Reduce output to * @return this */
public MapReduceOptions<T> outputDB(final String outputDB) { this.outputDB = outputDB; return this; }
Sets the output type of the job
Params:
  • outputType – the output type
Returns:this
/** * Sets the output type of the job * * @param outputType the output type * @return this */
public MapReduceOptions<T> outputType(final OutputType outputType) { this.outputType = outputType; return this; }
Sets the query defining the input for the job. Must not be null.
Params:
  • query – the query to use
Returns:this
/** * Sets the query defining the input for the job. Must not be null. * * @param query the query to use * @return this */
public MapReduceOptions<T> query(final Query query) { Assert.parametersNotNull("query", query); this.query = query; return this; }
Sets the read preference for this command. See the documentation for ReadPreference for more information.
Params:
  • preference – Read Preference to use
Returns:this
/** * Sets the read preference for this command. See the documentation for {@link ReadPreference} for more information. * * @param preference Read Preference to use * @return this */
public MapReduceOptions<T> readPreference(final ReadPreference preference) { this.readPreference = preference; return this; }
Sets the JavaScript function that "reduces" to a single object all the values associated with a particular key.
Params:
  • reduce – the javascript function
Returns:this
/** * Sets the JavaScript function that "reduces" to a single object all the values associated with a particular key. * * @param reduce the javascript function * @return this */
public MapReduceOptions<T> reduce(final String reduce) { Assert.parametersNotNull("reduce", reduce); Assert.parameterNotEmpty("reduce", reduce); this.reduce = reduce; return this; }
Sets the result type of the job
Params:
  • resultType – the type
Returns:this
/** * Sets the result type of the job * * @param resultType the type * @return this */
public MapReduceOptions<T> resultType(final Class<T> resultType) { this.resultType = resultType; return this; }
Sets the (optional) JavaScript scope
Params:
  • scope – The JavaScript scope
Returns:this
/** * Sets the (optional) JavaScript scope * * @param scope The JavaScript scope * @return this */
public MapReduceOptions<T> scope(final Map<String, Object> scope) { this.scope = scope; return this; }
Sets the verbosity of the MapReduce job, defaults to 'true'
Params:
  • verbose – The verbosity level.
Returns:this
/** * Sets the verbosity of the MapReduce job, defaults to 'true' * * @param verbose The verbosity level. * @return this */
public MapReduceOptions<T> verbose(final Boolean verbose) { this.verbose = verbose; return this; } OutputType getOutputType() { return outputType; } Query getQuery() { return query; } Class<T> getResultType() { return resultType; } @SuppressWarnings("deprecation") MapReduceCommand toCommand(final Mapper mapper) { if (query.getOffset() != 0 || query.getFieldsObject() != null) { throw new QueryException("mapReduce does not allow the offset/retrievedFields query "); } final DBCollection dbColl = inputCollection != null ? getQuery().getCollection().getDB().getCollection(inputCollection) : query.getCollection(); final String target = outputCollection != null ? outputCollection : mapper.getMappedClass(resultType).getCollectionName(); final MapReduceCommand command = new MapReduceCommand(dbColl, map, reduce, target, outputType, query.getQueryObject()); command.setBypassDocumentValidation(bypassDocumentValidation); command.setCollation(collation); command.setFinalize(finalize); command.setJsMode(jsMode); command.setLimit(limit); command.setMaxTime(maxTimeMS, TimeUnit.MILLISECONDS); command.setOutputDB(outputDB); command.setReadPreference(readPreference); command.setScope(scope); command.setSort(query.getSortObject()); command.setVerbose(verbose); return command; } }