public override RenderedPipelineDefinition <TOutput> Render(IBsonSerializer <TInput> inputSerializer, IBsonSerializerRegistry serializerRegistry)
        {
            var rendered = _wrapped.Render(inputSerializer, serializerRegistry);

            // do some combining of $match documents if possible. This is optimized for the
            // OfType case where we've added a discriminator as a match at the beginning of the pipeline.
            if (rendered.Documents.Count > 1)
            {
                var firstStage  = rendered.Documents[0].GetElement(0);
                var secondStage = rendered.Documents[1].GetElement(0);
                if (firstStage.Name == "$match" && secondStage.Name == "$match")
                {
                    var combinedFilter = Builders <BsonDocument> .Filter.And(
                        (BsonDocument)firstStage.Value,
                        (BsonDocument)secondStage.Value);

                    var combinedStage = new BsonDocument("$match", combinedFilter.Render(BsonDocumentSerializer.Instance, serializerRegistry));

                    rendered.Documents[0] = combinedStage;
                    rendered.Documents.RemoveAt(1);
                }
            }

            return(rendered);
        }
Exemplo n.º 2
0
        // private static methods
        private static RenderedPipelineDefinition <TResult> RenderPipeline <TResult, TDocument>(
            PipelineDefinition <ChangeStreamDocument <TDocument>, TResult> pipeline,
            IBsonSerializer <TDocument> documentSerializer)
        {
            var changeStreamDocumentSerializer = new ChangeStreamDocumentSerializer <TDocument>(documentSerializer);
            var serializerRegistry             = BsonSerializer.SerializerRegistry;

            return(pipeline.Render(changeStreamDocumentSerializer, serializerRegistry));
        }
Exemplo n.º 3
0
        /// <inheritdoc />
        public override RenderedPipelineDefinition <TOutput> Render(IBsonSerializer <TInput> inputSerializer, IBsonSerializerRegistry serializerRegistry)
        {
            var renderedFirst  = _first.Render(inputSerializer, serializerRegistry);
            var renderedSecond = _second.Render(renderedFirst.OutputSerializer, serializerRegistry);

            return(new RenderedPipelineDefinition <TOutput>(
                       renderedFirst.Documents.Concat(renderedSecond.Documents),
                       renderedSecond.OutputSerializer));
        }
Exemplo n.º 4
0
        private CreateViewOperation CreateCreateViewOperation <TDocument, TResult>(string viewName, string viewOn, PipelineDefinition <TDocument, TResult> pipeline, CreateViewOptions <TDocument> options)
        {
            var serializerRegistry = options.SerializerRegistry ?? BsonSerializer.SerializerRegistry;
            var documentSerializer = options.DocumentSerializer ?? serializerRegistry.GetSerializer <TDocument>();
            var pipelineDocuments  = pipeline.Render(documentSerializer, serializerRegistry, _linqProvider).Documents;

            return(new CreateViewOperation(_databaseNamespace, viewName, viewOn, pipelineDocuments, GetMessageEncoderSettings())
            {
                Collation = options.Collation,
                WriteConcern = _settings.WriteConcern
            });
        }
Exemplo n.º 5
0
        /// <summary>
        /// Renders the update to a <see cref="BsonValue"/> that represents <see cref="BsonArray"/>.
        /// </summary>
        /// <param name="documentSerializer">The document serializer.</param>
        /// <param name="serializerRegistry">The serializer registry.</param>
        /// <param name="linqProvider">The LINQ provider.</param>
        /// <returns>A <see cref="BsonValue"/>.</returns>
        public override BsonValue Render(IBsonSerializer <TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry, LinqProvider linqProvider)
        {
            var renderedPipeline = _pipeline.Render(documentSerializer, serializerRegistry, linqProvider);

            return(new BsonArray(renderedPipeline.Documents));
        }