public override Task <TProjection> FindOneAndUpdateAsync <TProjection>(FilterDefinition <TDocument> filter, UpdateDefinition <TDocument> update, FindOneAndUpdateOptions <TDocument, TProjection> options, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(filter, "filter");
            Ensure.IsNotNull(update, "update");

            options = options ?? new FindOneAndUpdateOptions <TDocument, TProjection>();
            var projection         = options.Projection ?? new EntireDocumentProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            var operation = new FindOneAndUpdateOperation <TProjection>(
                _collectionNamespace,
                filter.Render(_documentSerializer, _settings.SerializerRegistry),
                update.Render(_documentSerializer, _settings.SerializerRegistry),
                new FindAndModifyValueDeserializer <TProjection>(renderedProjection.ProjectionSerializer),
                _messageEncoderSettings)
            {
                IsUpsert       = options.IsUpsert,
                MaxTime        = options.MaxTime,
                Projection     = renderedProjection.Document,
                ReturnDocument = options.ReturnDocument.ToCore(),
                Sort           = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry)
            };

            return(ExecuteWriteOperation(operation, cancellationToken));
        }
        public override Task <IAsyncCursor <TProjection> > FindAsync <TProjection>(FilterDefinition <TDocument> filter, FindOptions <TDocument, TProjection> options, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(filter, "filter");

            options = options ?? new FindOptions <TDocument, TProjection>();
            var projection         = options.Projection ?? new EntireDocumentProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            var operation = new FindOperation <TProjection>(
                _collectionNamespace,
                renderedProjection.ProjectionSerializer,
                _messageEncoderSettings)
            {
                AllowPartialResults = options.AllowPartialResults,
                BatchSize           = options.BatchSize,
                Comment             = options.Comment,
                CursorType          = options.CursorType.ToCore(),
                Filter          = filter.Render(_documentSerializer, _settings.SerializerRegistry),
                Limit           = options.Limit,
                MaxTime         = options.MaxTime,
                Modifiers       = options.Modifiers,
                NoCursorTimeout = options.NoCursorTimeout,
                Projection      = renderedProjection.Document,
                Skip            = options.Skip,
                Sort            = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry)
            };

            return(ExecuteReadOperation(operation, cancellationToken));
        }
        public override Task <TProjection> FindOneAndReplaceAsync <TProjection>(FilterDefinition <TDocument> filter, TDocument replacement, FindOneAndReplaceOptions <TDocument, TProjection> options, CancellationToken cancellationToken)
        {
            var replacementObject = (object)replacement; // only box once if it's a struct

            Ensure.IsNotNull(filter, "filter");
            Ensure.IsNotNull(replacementObject, "replacement");

            options = options ?? new FindOneAndReplaceOptions <TDocument, TProjection>();
            var projection         = options.Projection ?? new EntireDocumentProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            var operation = new FindOneAndReplaceOperation <TProjection>(
                _collectionNamespace,
                filter.Render(_documentSerializer, _settings.SerializerRegistry),
                new BsonDocumentWrapper(replacementObject, _documentSerializer),
                new FindAndModifyValueDeserializer <TProjection>(renderedProjection.ProjectionSerializer),
                _messageEncoderSettings)
            {
                IsUpsert       = options.IsUpsert,
                MaxTime        = options.MaxTime,
                Projection     = renderedProjection.Document,
                ReturnDocument = options.ReturnDocument.ToCore(),
                Sort           = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry)
            };

            return(ExecuteWriteOperation(operation, cancellationToken));
        }
Ejemplo n.º 4
0
        private FindOperation <TProjection> CreateFindOperation <TProjection>(FilterDefinition <TDocument> filter, FindOptions <TDocument, TProjection> options)
        {
            var projection         = options.Projection ?? new ClientSideDeserializationProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            return(new FindOperation <TProjection>(
                       _collectionNamespace,
                       renderedProjection.ProjectionSerializer,
                       _messageEncoderSettings)
            {
                AllowPartialResults = options.AllowPartialResults,
                BatchSize = options.BatchSize,
                Collation = options.Collation,
                Comment = options.Comment,
                CursorType = options.CursorType.ToCore(),
                Filter = filter.Render(_documentSerializer, _settings.SerializerRegistry),
                Limit = options.Limit,
                MaxAwaitTime = options.MaxAwaitTime,
                MaxTime = options.MaxTime,
                Modifiers = options.Modifiers,
                NoCursorTimeout = options.NoCursorTimeout,
                OplogReplay = options.OplogReplay,
                Projection = renderedProjection.Document,
                ReadConcern = _settings.ReadConcern,
                Skip = options.Skip,
                Sort = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry)
            });
        }
Ejemplo n.º 5
0
        public override BsonDocument Render(IBsonSerializer <TSource> sourceSerializer, IBsonSerializerRegistry serializerRegistry)
        {
            var renderedField = _field.Render(sourceSerializer, serializerRegistry);

            IBsonSerializer <TItem> itemSerializer;

            if (renderedField.FieldSerializer != null)
            {
                var arraySerializer = renderedField.FieldSerializer as IBsonArraySerializer;
                BsonSerializationInfo itemSerializationInfo;
                if (arraySerializer == null || !arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
                {
                    var message = string.Format("The serializer for field '{0}' must implement IBsonArraySerializer and provide item serialization info.", renderedField.FieldName);
                    throw new InvalidOperationException(message);
                }
                itemSerializer = (IBsonSerializer <TItem>)itemSerializationInfo.Serializer;
            }
            else
            {
                itemSerializer = serializerRegistry.GetSerializer <TItem>();
            }

            var renderedFilter = _filter.Render(itemSerializer, serializerRegistry);

            return(new BsonDocument(renderedField.FieldName, new BsonDocument("$elemMatch", renderedFilter)));
        }
Ejemplo n.º 6
0
 private CountOperation CreateCountOperation(FilterDefinition <TDocument> filter, CountOptions options)
 {
     return(new CountOperation(_collectionNamespace, _messageEncoderSettings)
     {
         Filter = filter.Render(_documentSerializer, _settings.SerializerRegistry),
         Hint = options.Hint,
         Limit = options.Limit,
         MaxTime = options.MaxTime,
         ReadConcern = _settings.ReadConcern,
         Skip = options.Skip
     });
 }
Ejemplo n.º 7
0
        private DistinctOperation <TField> CreateDistinctOperation <TField>(FieldDefinition <TDocument, TField> field, FilterDefinition <TDocument> filter, DistinctOptions options)
        {
            var renderedField = field.Render(_documentSerializer, _settings.SerializerRegistry);

            return(new DistinctOperation <TField>(
                       _collectionNamespace,
                       renderedField.FieldSerializer,
                       renderedField.FieldName,
                       _messageEncoderSettings)
            {
                Filter = filter.Render(_documentSerializer, _settings.SerializerRegistry),
                MaxTime = options.MaxTime,
                ReadConcern = _settings.ReadConcern
            });
        }
        public override Task <long> CountAsync(FilterDefinition <TDocument> filter, CountOptions options, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(filter, "filter");

            options = options ?? new CountOptions();

            var operation = new CountOperation(_collectionNamespace, _messageEncoderSettings)
            {
                Filter  = filter.Render(_documentSerializer, _settings.SerializerRegistry),
                Hint    = options.Hint,
                Limit   = options.Limit,
                MaxTime = options.MaxTime,
                Skip    = options.Skip
            };

            return(ExecuteReadOperation(operation, cancellationToken));
        }
Ejemplo n.º 9
0
        private FindOneAndDeleteOperation <TProjection> CreateFindOneAndDeleteOperation <TProjection>(FilterDefinition <TDocument> filter, FindOneAndDeleteOptions <TDocument, TProjection> options)
        {
            var projection         = options.Projection ?? new ClientSideDeserializationProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            return(new FindOneAndDeleteOperation <TProjection>(
                       _collectionNamespace,
                       filter.Render(_documentSerializer, _settings.SerializerRegistry),
                       new FindAndModifyValueDeserializer <TProjection>(renderedProjection.ProjectionSerializer),
                       _messageEncoderSettings)
            {
                MaxTime = options.MaxTime,
                Projection = renderedProjection.Document,
                Sort = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry),
                WriteConcern = _settings.WriteConcern
            });
        }
        private PipelineDefinition <TDocument, TResult> CreateFilteredPipeline <TResult>(PipelineDefinition <TDocument, TResult> pipeline)
        {
            const string matchOperatorName = "$match";

            var filterStage = new DelegatedPipelineStageDefinition <TDocument, TDocument>(
                matchOperatorName,
                (s, sr) =>
            {
                var renderedFilter = _filter.Render(s, sr);
                return(new RenderedPipelineStageDefinition <TDocument>(matchOperatorName, new BsonDocument(matchOperatorName, renderedFilter), s));
            });

            var filterPipeline   = new PipelineStagePipelineDefinition <TDocument, TDocument>(new[] { filterStage });
            var combinedPipeline = new CombinedPipelineDefinition <TDocument, TDocument, TResult>(
                filterPipeline,
                pipeline);

            return(new OptimizingPipelineDefinition <TDocument, TResult>(combinedPipeline));
        }
        public override Task <IAsyncCursor <TField> > DistinctAsync <TField>(FieldDefinition <TDocument, TField> field, FilterDefinition <TDocument> filter, DistinctOptions options, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(field, "field");
            Ensure.IsNotNull(filter, "filter");

            options = options ?? new DistinctOptions();
            var renderedField = field.Render(_documentSerializer, _settings.SerializerRegistry);

            var operation = new DistinctOperation <TField>(
                _collectionNamespace,
                renderedField.FieldSerializer,
                renderedField.FieldName,
                _messageEncoderSettings)
            {
                Filter  = filter.Render(_documentSerializer, _settings.SerializerRegistry),
                MaxTime = options.MaxTime
            };

            return(ExecuteReadOperation(operation, cancellationToken));
        }
Ejemplo n.º 12
0
        // public methods
        public override Task <IAsyncCursor <TResult> > AggregateAsync <TResult>(PipelineDefinition <TDocument, TResult> pipeline, AggregateOptions options = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            const string matchOperatorName = "$match";

            var filterStage = new DelegatedPipelineStageDefinition <TDocument, TDocument>(
                matchOperatorName,
                (s, sr) =>
            {
                var renderedFilter = _filter.Render(s, sr);
                return(new RenderedPipelineStageDefinition <TDocument>(matchOperatorName, new BsonDocument(matchOperatorName, renderedFilter), s));
            });

            var filterPipeline   = new PipelineStagePipelineDefinition <TDocument, TDocument>(new[] { filterStage });
            var combinedPipeline = new CombinedPipelineDefinition <TDocument, TDocument, TResult>(
                filterPipeline,
                pipeline);

            var optimizedPipeline = new OptimizingPipelineDefinition <TDocument, TResult>(combinedPipeline);

            return(_wrappedCollection.AggregateAsync(optimizedPipeline, options, cancellationToken));
        }
Ejemplo n.º 13
0
        private FindOneAndReplaceOperation <TProjection> CreateFindOneAndReplaceOperation <TProjection>(FilterDefinition <TDocument> filter, object replacementObject, FindOneAndReplaceOptions <TDocument, TProjection> options)
        {
            var projection         = options.Projection ?? new ClientSideDeserializationProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            return(new FindOneAndReplaceOperation <TProjection>(
                       _collectionNamespace,
                       filter.Render(_documentSerializer, _settings.SerializerRegistry),
                       new BsonDocumentWrapper(replacementObject, _documentSerializer),
                       new FindAndModifyValueDeserializer <TProjection>(renderedProjection.ProjectionSerializer),
                       _messageEncoderSettings)
            {
                BypassDocumentValidation = options.BypassDocumentValidation,
                IsUpsert = options.IsUpsert,
                MaxTime = options.MaxTime,
                Projection = renderedProjection.Document,
                ReturnDocument = options.ReturnDocument.ToCore(),
                Sort = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry),
                WriteConcern = _settings.WriteConcern
            });
        }
Ejemplo n.º 14
0
        public override Task <TProjection> FindOneAndDeleteAsync <TProjection>(FilterDefinition <TDocument> filter, FindOneAndDeleteOptions <TDocument, TProjection> options, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(filter, nameof(filter));

            options = options ?? new FindOneAndDeleteOptions <TDocument, TProjection>();
            var projection         = options.Projection ?? new ClientSideDeserializationProjectionDefinition <TDocument, TProjection>();
            var renderedProjection = projection.Render(_documentSerializer, _settings.SerializerRegistry);

            var operation = new FindOneAndDeleteOperation <TProjection>(
                _collectionNamespace,
                filter.Render(_documentSerializer, _settings.SerializerRegistry),
                new FindAndModifyValueDeserializer <TProjection>(renderedProjection.ProjectionSerializer),
                _messageEncoderSettings)
            {
                MaxTime    = options.MaxTime,
                Projection = renderedProjection.Document,
                Sort       = options.Sort == null ? null : options.Sort.Render(_documentSerializer, _settings.SerializerRegistry)
            };

            return(ExecuteWriteOperationAsync(operation, cancellationToken));
        }
        public override IAggregateFluent <TResult> Match(FilterDefinition <TResult> filter)
        {
            const string operatorName = "$match";
            var          stage        = new DelegatedPipelineStageDefinition <TResult, TResult>(
                operatorName,
                (s, sr) => new RenderedPipelineStageDefinition <TResult>(operatorName, new BsonDocument(operatorName, filter.Render(s, sr)), s));

            return(AppendStage <TResult>(stage));
        }