/* Copyright 2010-present 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. */ using System; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver.Core.Misc; namespace MongoDB.Driver { /// /// Represents the options for a map-reduce operation. /// /// The type of the document. /// The type of the result. public sealed class MapReduceOptions { // fields private bool? _bypassDocumentValidation; private Collation _collation; private FilterDefinition _filter; private BsonJavaScript _finalize; private bool? _javaScriptMode; private long? _limit; private TimeSpan? _maxTime; private MapReduceOutputOptions _outputOptions; private IBsonSerializer _resultSerializer; private BsonDocument _scope; private SortDefinition _sort; private bool? _verbose; // properties /// /// Gets or sets a value indicating whether to bypass document validation. /// public bool? BypassDocumentValidation { get { return _bypassDocumentValidation; } set { _bypassDocumentValidation = value; } } /// /// Gets or sets the collation. /// public Collation Collation { get { return _collation; } set { _collation = value; } } /// /// Gets or sets the filter. /// public FilterDefinition Filter { get { return _filter; } set { _filter = value; } } /// /// Gets or sets the finalize function. /// public BsonJavaScript Finalize { get { return _finalize; } set { _finalize = value; } } /// /// Gets or sets the java script mode. /// public bool? JavaScriptMode { get { return _javaScriptMode; } set { _javaScriptMode = value; } } /// /// Gets or sets the limit. /// public long? Limit { get { return _limit; } set { _limit = value; } } /// /// Gets or sets the maximum time. /// public TimeSpan? MaxTime { get { return _maxTime; } set { _maxTime = Ensure.IsNullOrInfiniteOrGreaterThanOrEqualToZero(value, nameof(value)); } } /// /// Gets or sets the output options. /// public MapReduceOutputOptions OutputOptions { get { return _outputOptions; } set { _outputOptions = value; } } /// /// Gets or sets the result serializer. /// public IBsonSerializer ResultSerializer { get { return _resultSerializer; } set { _resultSerializer = value; } } /// /// Gets or sets the scope. /// public BsonDocument Scope { get { return _scope; } set { _scope = value; } } /// /// Gets or sets the sort. /// public SortDefinition Sort { get { return _sort; } set { _sort = value; } } /// /// Gets or sets whether to include timing information. /// public bool? Verbose { get { return _verbose; } set { _verbose = value; } } } /// /// Represents the output options for a map-reduce operation. /// public abstract class MapReduceOutputOptions { private static MapReduceOutputOptions __inline = new InlineOutput(); private MapReduceOutputOptions() { } /// /// An inline map-reduce output options. /// public static MapReduceOutputOptions Inline { get { return __inline; } } /// /// A merge map-reduce output options. /// /// The name of the collection. /// The name of the database. /// Whether the output collection should be sharded. /// Whether the server should not lock the database for the duration of the merge. /// A merge map-reduce output options. public static MapReduceOutputOptions Merge(string collectionName, string databaseName = null, bool? sharded = null, bool? nonAtomic = null) { Ensure.IsNotNull(collectionName, nameof(collectionName)); return new CollectionOutput(collectionName, Core.Operations.MapReduceOutputMode.Merge, databaseName, sharded, nonAtomic); } /// /// A reduce map-reduce output options. /// /// The name of the collection. /// The name of the database. /// Whether the output collection should be sharded. /// Whether the server should not lock the database for the duration of the reduce. /// A reduce map-reduce output options. public static MapReduceOutputOptions Reduce(string collectionName, string databaseName = null, bool? sharded = null, bool? nonAtomic = null) { Ensure.IsNotNull(collectionName, nameof(collectionName)); return new CollectionOutput(collectionName, Core.Operations.MapReduceOutputMode.Reduce, databaseName, sharded, nonAtomic); } /// /// A replace map-reduce output options. /// /// The name of the collection. /// Name of the database. /// Whether the output collection should be sharded. /// A replace map-reduce output options. public static MapReduceOutputOptions Replace(string collectionName, string databaseName = null, bool? sharded = null) { Ensure.IsNotNull(collectionName, nameof(collectionName)); return new CollectionOutput(collectionName, Core.Operations.MapReduceOutputMode.Replace, databaseName, sharded, null); } internal sealed class InlineOutput : MapReduceOutputOptions { internal InlineOutput() { } } internal sealed class CollectionOutput : MapReduceOutputOptions { private readonly string _collectionName; private readonly string _databaseName; private readonly bool? _nonAtomic; private readonly Core.Operations.MapReduceOutputMode _outputMode; private readonly bool? _sharded; internal CollectionOutput(string collectionName, Core.Operations.MapReduceOutputMode outputMode, string databaseName = null, bool? sharded = null, bool? nonAtomic = null) { _collectionName = collectionName; _outputMode = outputMode; _databaseName = databaseName; _sharded = sharded; _nonAtomic = nonAtomic; } public string CollectionName { get { return _collectionName; } } public string DatabaseName { get { return _databaseName; } } public bool? NonAtomic { get { return _nonAtomic; } } public Core.Operations.MapReduceOutputMode OutputMode { get { return _outputMode; } } public bool? Sharded { get { return _sharded; } } } } }