/* * 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.query; import com.mongodb.CursorType; import com.mongodb.DBObject; import com.mongodb.ReadConcern; import com.mongodb.ReadPreference; import com.mongodb.client.model.Collation; import com.mongodb.client.model.DBCollectionFindOptions; import java.util.concurrent.TimeUnit; /** * The options to apply to a find operation (also commonly referred to as a query). * * @since 1.3 * @mongodb.driver.manual tutorial/query-documents/ Find * @mongodb.driver.manual ../meta-driver/latest/legacy/mongodb-wire-protocol/#op-query OP_QUERY */ public class FindOptions { private DBCollectionFindOptions options = new DBCollectionFindOptions(); /** * Creates an empty options instance. */ public FindOptions() { } private FindOptions(final DBCollectionFindOptions copy) { options = copy.copy(); } /** * Makes a copy of these find options * @return the new copy */ public FindOptions copy() { return new FindOptions(options.copy()); } /** * Gets the limit to apply. The default is null. * * @return the limit * @mongodb.driver.manual reference/method/cursor.limit/#cursor.limit Limit */ public int getLimit() { return options.getLimit(); } /** * Sets the limit to apply. * * @param limit the limit, which may be null * @return this * @mongodb.driver.manual reference/method/cursor.limit/#cursor.limit Limit */ public FindOptions limit(final int limit) { options.limit(limit); return this; } /** * Gets the number of documents to skip. The default is 0. * * @return the number of documents to skip, which may be null * @mongodb.driver.manual reference/method/cursor.skip/#cursor.skip Skip */ public int getSkip() { return options.getSkip(); } /** * Sets the number of documents to skip. * * @param skip the number of documents to skip * @return this * @mongodb.driver.manual reference/method/cursor.skip/#cursor.skip Skip */ public FindOptions skip(final int skip) { options.skip(skip); return this; } /** * Gets the maximum execution time on the server for this operation. The default is 0, which places no limit on the execution time. * * @param timeUnit the time unit to return the result in * @return the maximum execution time in the given time unit * @mongodb.driver.manual reference/method/cursor.maxTimeMS/#cursor.maxTimeMS Max Time */ public long getMaxTime(final TimeUnit timeUnit) { return options.getMaxTime(timeUnit); } /** * Sets the maximum execution time on the server for this operation. * * @param maxTime the max time * @param timeUnit the time unit, which may not be null * @return this * @mongodb.driver.manual reference/method/cursor.maxTimeMS/#cursor.maxTimeMS Max Time */ public FindOptions maxTime(final long maxTime, final TimeUnit timeUnit) { options.maxTime(maxTime, timeUnit); return this; } /** * The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor * query. This only applies to a TAILABLE_AWAIT cursor. When the cursor is not a TAILABLE_AWAIT cursor, * this option is ignored. * * On servers >= 3.2, this option will be specified on the getMore command as "maxTimeMS". The default * is no value: no "maxTimeMS" is sent to the server with the getMore command. * * On servers < 3.2, this option is ignored, and indicates that the driver should respect the server's default value * * A zero value will be ignored. * * @param timeUnit the time unit to return the result in * @return the maximum await execution time in the given time unit * @mongodb.driver.manual reference/method/cursor.maxTimeMS/#cursor.maxTimeMS Max Time */ public long getMaxAwaitTime(final TimeUnit timeUnit) { return options.getMaxAwaitTime(timeUnit); } /** * Sets the maximum await execution time on the server for this operation. * * @param maxAwaitTime the max await time. A zero value will be ignored, and indicates that the driver should respect the server's * default value * @param timeUnit the time unit, which may not be null * @return this * @mongodb.driver.manual reference/method/cursor.maxTimeMS/#cursor.maxTimeMS Max Time */ public FindOptions maxAwaitTime(final long maxAwaitTime, final TimeUnit timeUnit) { options.maxAwaitTime(maxAwaitTime, timeUnit); return this; } /** * Gets the number of documents to return per batch. Default to 0, which indicates that the server chooses an appropriate batch * size. * * @return the batch size, which may be null * @mongodb.driver.manual reference/method/cursor.batchSize/#cursor.batchSize Batch Size */ public int getBatchSize() { return options.getBatchSize(); } /** * Sets the number of documents to return per batch. * * @param batchSize the batch size * @return this * @mongodb.driver.manual reference/method/cursor.batchSize/#cursor.batchSize Batch Size */ public FindOptions batchSize(final int batchSize) { options.batchSize(batchSize); return this; } /** * Gets the query modifiers to apply to this operation. The default is not to apply any modifiers. * * @return the query modifiers, which may be null * @mongodb.driver.manual reference/operator/query-modifier/ Query Modifiers */ DBObject getModifiers() { return options.getModifiers(); } /** * Adds a modifier to the find operation * * @param key the modifier name * @param value the modifier value * @return this */ public FindOptions modifier(final String key, final Object value) { options.getModifiers().put(key, value); return this; } /** * Gets a document describing the fields to return for all matching documents. * * @return the project document, which may be null * @mongodb.driver.manual reference/method/db.collection.find/ Projection */ DBObject getProjection() { return options.getProjection(); } /** * Sets a document describing the fields to return for all matching documents. * * @param projection the project document, which may be null. * @return this * @mongodb.driver.manual reference/method/db.collection.find/ Projection */ FindOptions projection(final DBObject projection) { options.projection(projection); return this; } /** * Gets the sort criteria to apply to the query. The default is null, which means that the documents will be returned in an undefined * order. * * @return a document describing the sort criteria * @mongodb.driver.manual reference/method/cursor.sort/ Sort */ DBObject getSortDBObject() { return options.getSort(); } /** * Sets the sort criteria to apply to the query. * * @param sort the sort criteria, which may be null. * @return this * @mongodb.driver.manual reference/method/cursor.sort/ Sort */ FindOptions sort(final DBObject sort) { options.sort(sort); return this; } /** * The server normally times out idle cursors after an inactivity period (10 minutes) * to prevent excess memory use. If true, that timeout is disabled. * * @return true if cursor timeout is disabled */ public boolean isNoCursorTimeout() { return options.isNoCursorTimeout(); } /** * The server normally times out idle cursors after an inactivity period (10 minutes) * to prevent excess memory use. Set this option to prevent that. * * @param noCursorTimeout true if cursor timeout is disabled * @return this */ public FindOptions noCursorTimeout(final boolean noCursorTimeout) { options.noCursorTimeout(noCursorTimeout); return this; } /** * Users should not set this under normal circumstances. * * @return if oplog replay is enabled */ public boolean isOplogReplay() { return options.isOplogReplay(); } /** * Users should not set this under normal circumstances. * * @param oplogReplay if oplog replay is enabled * @return this */ public FindOptions oplogReplay(final boolean oplogReplay) { options.oplogReplay(oplogReplay); return this; } /** * Get partial results from a sharded cluster if one or more shards are unreachable (instead of throwing an error). * * @return if partial results for sharded clusters is enabled */ public boolean isPartial() { return options.isPartial(); } /** * Get partial results from a sharded cluster if one or more shards are unreachable (instead of throwing an error). * * @param partial if partial results for sharded clusters is enabled * @return this */ public FindOptions partial(final boolean partial) { options.partial(partial); return this; } /** * Get the cursor type. * * @return the cursor type */ public CursorType getCursorType() { return options.getCursorType(); } /** * Sets the cursor type. * * @param cursorType the cursor type * @return this */ public FindOptions cursorType(final CursorType cursorType) { options.cursorType(cursorType); return this; } /** * Returns the readPreference * * @return the readPreference */ public ReadPreference getReadPreference() { return options.getReadPreference(); } /** * Sets the readPreference * * @param readPreference the readPreference * @return this */ public FindOptions readPreference(final ReadPreference readPreference) { options.readPreference(readPreference); return this; } /** * Returns the readConcern * * @return the readConcern * @mongodb.server.release 3.2 */ public ReadConcern getReadConcern() { return options.getReadConcern(); } /** * Sets the readConcern * * @param readConcern the readConcern * @return this * @mongodb.server.release 3.2 */ public FindOptions readConcern(final ReadConcern readConcern) { options.readConcern(readConcern); return this; } /** * Returns the collation options * * @return the collation options * @mongodb.server.release 3.4 */ public Collation getCollation() { return options.getCollation(); } /** * Sets the collation * * @param collation the collation * @return this * @mongodb.server.release 3.4 */ public FindOptions collation(final Collation collation) { options.collation(collation); return this; } DBCollectionFindOptions getOptions() { return options; } boolean isSnapshot() { Object snapshot = getModifiers().get("$snapshot"); return snapshot != null ? (Boolean) snapshot : false; } boolean hasHint() { return getModifiers().get("$indexHint") != null; } }