Esempio n. 1
0
        public void CreateCommand_should_create_the_correct_command(
            [Values(false, true)] bool isUpsert,
            [Values(null, 10)] int?maxTimeMS,
            [Values(null, "{a: 1}")] string projection,
            [Values(ReturnDocument.Before, ReturnDocument.After)] ReturnDocument returnDocument,
            [Values(null, "{b: 1}")] string sort)
        {
            var projectionDoc = projection == null ? (BsonDocument)null : BsonDocument.Parse(projection);
            var sortDoc       = sort == null ? (BsonDocument)null : BsonDocument.Parse(sort);
            var subject       = new FindOneAndUpdateOperation <BsonDocument>(_collectionNamespace, _filter, _update, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                IsUpsert       = isUpsert,
                MaxTime        = maxTimeMS.HasValue ? TimeSpan.FromMilliseconds(maxTimeMS.Value) : (TimeSpan?)null,
                Projection     = projectionDoc,
                ReturnDocument = returnDocument,
                Sort           = sortDoc
            };

            var expectedResult = new BsonDocument
            {
                { "findAndModify", _collectionNamespace.CollectionName },
                { "query", _filter },
                { "sort", sortDoc, sortDoc != null },
                { "update", _update, _update != null },
                { "new", returnDocument == ReturnDocument.After },
                { "fields", projectionDoc, projectionDoc != null },
                { "upsert", isUpsert },
                { "maxTimeMS", () => maxTimeMS.Value, maxTimeMS.HasValue }
            };

            var result = subject.CreateCommand();

            result.Should().Be(expectedResult);
        }
Esempio n. 2
0
 // constructors
 /// <summary>
 /// Initializes a new instance of the <see cref="FindOneAndUpdateOperation{TResult}"/> class.
 /// </summary>
 /// <param name="collectionNamespace">The collection namespace.</param>
 /// <param name="filter">The filter.</param>
 /// <param name="update">The update.</param>
 /// <param name="resultSerializer">The result serializer.</param>
 /// <param name="messageEncoderSettings">The message encoder settings.</param>
 public FindOneAndUpdateOperation(CollectionNamespace collectionNamespace, BsonDocument filter, BsonValue update, IBsonSerializer <TResult> resultSerializer, MessageEncoderSettings messageEncoderSettings)
     : base(collectionNamespace, resultSerializer, messageEncoderSettings)
 {
     _filter         = Ensure.IsNotNull(filter, nameof(filter));
     _update         = EnsureUpdateIsValid(update);
     _returnDocument = ReturnDocument.Before;
 }
 // constructors
 /// <summary>
 /// Initializes a new instance of the <see cref="FindOneAndReplaceOperation{TResult}"/> class.
 /// </summary>
 /// <param name="collectionNamespace">The collection namespace.</param>
 /// <param name="filter">The filter.</param>
 /// <param name="replacement">The replacement.</param>
 /// <param name="resultSerializer">The result serializer.</param>
 /// <param name="messageEncoderSettings">The message encoder settings.</param>
 public FindOneAndReplaceOperation(CollectionNamespace collectionNamespace, BsonDocument filter, BsonDocument replacement, IBsonSerializer <TResult> resultSerializer, MessageEncoderSettings messageEncoderSettings)
     : base(collectionNamespace, resultSerializer, messageEncoderSettings)
 {
     _filter         = Ensure.IsNotNull(filter, nameof(filter));
     _replacement    = Ensure.IsNotNull(replacement, nameof(replacement));
     _returnDocument = ReturnDocument.Before;
 }
        public void ReturnDocument_get_and_set_should_work(
            [Values(ReturnDocument.After, ReturnDocument.Before)]
            ReturnDocument value)
        {
            var subject = new FindOneAndUpdateOperation <BsonDocument>(_collectionNamespace, _filter, _update, BsonDocumentSerializer.Instance, _messageEncoderSettings);

            subject.ReturnDocument = value;
            var result = subject.ReturnDocument;

            result.Should().Be(value);
        }
 // constructors
 /// <summary>
 /// Initializes a new instance of the <see cref="FindOneAndUpdateOperation{TResult}"/> class.
 /// </summary>
 /// <param name="collectionNamespace">The collection namespace.</param>
 /// <param name="filter">The filter.</param>
 /// <param name="update">The update.</param>
 /// <param name="resultSerializer">The result serializer.</param>
 /// <param name="messageEncoderSettings">The message encoder settings.</param>
 public FindOneAndUpdateOperation(CollectionNamespace collectionNamespace, BsonDocument filter, BsonDocument update, IBsonSerializer <TResult> resultSerializer, MessageEncoderSettings messageEncoderSettings)
     : base(collectionNamespace, resultSerializer, messageEncoderSettings)
 {
     _filter = Ensure.IsNotNull(filter, nameof(filter));
     _update = Ensure.IsNotNull(update, nameof(update));
     if (_update.ElementCount == 0)
     {
         throw new ArgumentException("Updates must have at least 1 update operator.", nameof(update));
     }
     _returnDocument = ReturnDocument.Before;
 }
        public virtual Task <T> FindOneAndUpdate(Expression <Func <T, bool> > filterConditions, Updates <T> updates,
                                                 ReturnDocument returnDocument = ReturnDocument.Before, CancellationToken token = default)
        {
            FilterDefinition <T> filter           = ToFilter(filterConditions);
            UpdateDefinition <T> updateDefinition = ToUpdateDefinition(updates);
            var options = new FindOneAndUpdateOptions <T>
            {
                ReturnDocument = returnDocument
            };

            return(_collection.FindOneAndUpdateAsync(filter, updateDefinition, options, cancellationToken: token));
        }
        public static Core.Operations.ReturnDocument ToCore(this ReturnDocument returnDocument)
        {
            switch (returnDocument)
            {
            case ReturnDocument.Before:
                return(Core.Operations.ReturnDocument.Before);

            case ReturnDocument.After:
                return(Core.Operations.ReturnDocument.After);

            default:
                throw new ArgumentException("Unrecognized ReturnDocument.", "returnDocument");
            }
        }
        public virtual Task <T> FindOneAndReplace(T entity, bool isUpsert, ReturnDocument returnDocument = ReturnDocument.Before, CancellationToken token = default)
        {
            Func <object, object> idGetter = FieldDefinitions.GetIdFieldGetter(typeof(T));
            ObjectId entityId = (ObjectId)idGetter.Invoke(entity);
            var      filter   = Builders <T> .Filter.Eq("_id", entityId);

            var options = new FindOneAndReplaceOptions <T>
            {
                ReturnDocument = returnDocument,
                IsUpsert       = isUpsert
            };

            return(_collection.FindOneAndReplaceAsync(filter, entity, options, cancellationToken: token));
        }
        public virtual Task <T> FindOneAndUpdate(Expression <Func <T, bool> > filterConditions, Updates <T> updates,
                                                 ReturnDocument returnDocument = ReturnDocument.Before, CancellationToken token = default)
        {
            T entity = Collection.Where(x => filterConditions.Compile().Invoke(x)).FirstOrDefault();

            T returnedEntity = entity;

            if (returnDocument == ReturnDocument.Before)
            {
                //Could clone it here if required with AutoMapper or BinarySerializer.
                //However BinarySerializer does not serialize ObjectId.
                returnedEntity = entity;
            }

            UpdateField(updates, entity, false);
            return(Task.FromResult(returnedEntity));
        }
        public void CreateCommand_should_create_the_correct_command(
            [Values(null, false, true)] bool?bypassDocumentValidation,
            [Values(false, true)] bool isUpsert,
            [Values(null, 10)] int?maxTimeMS,
            [Values(null, "{a: 1}")] string projection,
            [Values(ReturnDocument.Before, ReturnDocument.After)] ReturnDocument returnDocument,
            [Values(null, "{b: 1}")] string sort,
            [Values(null, "{ w : 2 }")] string writeConcernString,
            [Values("3.0.0", "3.1.1")] string serverVersionString)
        {
            var projectionDoc = projection == null ? (BsonDocument)null : BsonDocument.Parse(projection);
            var sortDoc       = sort == null ? (BsonDocument)null : BsonDocument.Parse(sort);
            var writeConcern  = writeConcernString == null ? null : WriteConcern.FromBsonDocument(BsonDocument.Parse(writeConcernString));
            var serverVersion = SemanticVersion.Parse(serverVersionString);
            var subject       = new FindOneAndUpdateOperation <BsonDocument>(_collectionNamespace, _filter, _update, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                BypassDocumentValidation = bypassDocumentValidation,
                IsUpsert       = isUpsert,
                MaxTime        = maxTimeMS.HasValue ? TimeSpan.FromMilliseconds(maxTimeMS.Value) : (TimeSpan?)null,
                Projection     = projectionDoc,
                ReturnDocument = returnDocument,
                Sort           = sortDoc,
                WriteConcern   = writeConcern
            };

            var expectedResult = new BsonDocument
            {
                { "findAndModify", _collectionNamespace.CollectionName },
                { "query", _filter },
                { "sort", sortDoc, sortDoc != null },
                { "update", _update, _update != null },
                { "new", returnDocument == ReturnDocument.After },
                { "fields", projectionDoc, projectionDoc != null },
                { "upsert", isUpsert },
                { "maxTimeMS", () => maxTimeMS.Value, maxTimeMS.HasValue },
                { "writeConcern", () => writeConcern.ToBsonDocument(), writeConcern != null && SupportedFeatures.IsFindAndModifyWriteConcernSupported(serverVersion) },
                { "bypassDocumentValidation", () => bypassDocumentValidation.Value, bypassDocumentValidation.HasValue&& SupportedFeatures.IsBypassDocumentValidationSupported(serverVersion) }
            };

            var result = subject.CreateCommand(serverVersion);

            result.Should().Be(expectedResult);
        }
        public void CreateCommand_should_return_expected_result_when_ReturnDocument_is_set(
            [Values(ReturnDocument.After, ReturnDocument.Before)]
            ReturnDocument value)
        {
            var subject = new FindOneAndUpdateOperation <BsonDocument>(_collectionNamespace, _filter, _update, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                ReturnDocument = value
            };

            var result = subject.CreateCommand(null);

            var expectedResult = new BsonDocument
            {
                { "findAndModify", _collectionNamespace.CollectionName },
                { "query", _filter },
                { "update", _update },
                { "new", true, value == ReturnDocument.After }
            };

            result.Should().Be(expectedResult);
        }
        public async Task <T> FindOneAndReplace(T entity, bool isUpsert, ReturnDocument returnDocument = ReturnDocument.Before, CancellationToken token = default)
        {
            Func <object, object> idGetter = FieldDefinitions.GetIdFieldGetter(typeof(T));
            ObjectId entityId         = (ObjectId)idGetter.Invoke(entity);
            T        collectionEntity = Collection
                                        .Where(x => (ObjectId)idGetter.Invoke(x) == entityId)
                                        .FirstOrDefault();

            T returnedEntity = collectionEntity;

            if (returnDocument == ReturnDocument.Before)
            {
                //Could clone it here if required with AutoMapper or BinarySerializer.
                //However BinarySerializer does not serialize ObjectId.
                returnedEntity = collectionEntity;
            }

            await ReplaceOne(entity, isUpsert, token);

            return(returnedEntity);
        }
        public async Task FindOneAndUpdate_should_execute_the_FindOneAndReplaceOperation(bool isUpsert, ReturnDocument returnDocument)
        {
            var filter     = BsonDocument.Parse("{x: 1}");
            var update     = BsonDocument.Parse("{$set: {a: 2}}");
            var projection = BsonDocument.Parse("{x: 1}");
            var sort       = BsonDocument.Parse("{a: -1}");
            var options    = new FindOneAndUpdateOptions <BsonDocument>()
            {
                IsUpsert       = isUpsert,
                Projection     = projection,
                ReturnDocument = returnDocument,
                Sort           = sort,
                MaxTime        = TimeSpan.FromSeconds(2)
            };

            await _subject.FindOneAndUpdateAsync <BsonDocument>(filter, update, options, CancellationToken.None);

            var call = _operationExecutor.GetWriteCall <BsonDocument>();

            call.Operation.Should().BeOfType <FindOneAndUpdateOperation <BsonDocument> >();
            var operation = (FindOneAndUpdateOperation <BsonDocument>)call.Operation;

            operation.CollectionNamespace.FullName.Should().Be("foo.bar");
            operation.Filter.Should().Be(filter);
            operation.Update.Should().Be(update);
            operation.IsUpsert.Should().Be(isUpsert);
            operation.ReturnDocument.Should().Be((Core.Operations.ReturnDocument)returnDocument);
            operation.Projection.Should().Be(projection);
            operation.Sort.Should().Be(sort);
            operation.MaxTime.Should().Be(options.MaxTime);
        }
 // constructors
 /// <summary>
 /// Initializes a new instance of the <see cref="FindOneAndReplaceOptions{TResult}"/> class.
 /// </summary>
 public FindOneAndReplaceOptions()
 {
     _returnDocument = ReturnDocument.Before;
 }
Esempio n. 15
0
 // constructors
 /// <summary>
 /// Initializes a new instance of the <see cref="FindOneAndUpdateOptions{TDocument, TProjection}"/> class.
 /// </summary>
 public FindOneAndUpdateOptions()
 {
     _returnDocument = ReturnDocument.Before;
 }