示例#1
0
        public override IAggregateFluent <TNewResult> Bucket <TValue, TNewResult>(
            AggregateExpressionDefinition <TResult, TValue> groupBy,
            IEnumerable <TValue> boundaries,
            ProjectionDefinition <TResult, TNewResult> output,
            Optional <TValue> defaultBucket = default(Optional <TValue>))
        {
            const string operatorName = "$bucket";
            var          stage        = new DelegatedPipelineStageDefinition <TResult, TNewResult>(
                operatorName,
                (s, sr) =>
            {
                var valueSerializer         = sr.GetSerializer <TValue>();
                var newResultSerializer     = sr.GetSerializer <TNewResult>();
                var renderedGroupBy         = groupBy.Render(s, sr);
                var serializedBoundaries    = boundaries.Select(b => valueSerializer.ToBsonValue(b));
                var serializedDefaultBucket = defaultBucket.HasValue ? valueSerializer.ToBsonValue(defaultBucket.Value) : null;
                var renderedOutput          = output.Render(s, sr);
                var document = new BsonDocument
                {
                    { operatorName, new BsonDocument
                      {
                          { "groupBy", renderedGroupBy },
                          { "boundaries", new BsonArray(serializedBoundaries) },
                          { "default", serializedDefaultBucket, serializedDefaultBucket != null },
                          { "output", renderedOutput.Document }
                      } }
                };
                return(new RenderedPipelineStageDefinition <TNewResult>(
                           operatorName,
                           document,
                           newResultSerializer));
            });

            return(AppendStage(stage));
        }
        public override RenderedProjectionDefinition <TProjection> Render(IBsonSerializer <TSource> sourceSerializer, IBsonSerializerRegistry serializerRegistry)
        {
            var document = _projection.Render(sourceSerializer, serializerRegistry);

            return(new RenderedProjectionDefinition <TProjection>(
                       document,
                       _projectionSerializer ?? (sourceSerializer as IBsonSerializer <TProjection>) ?? serializerRegistry.GetSerializer <TProjection>()));
        }
        public override IAggregateFluent <TNewResult> Group <TNewResult>(ProjectionDefinition <TResult, TNewResult> group)
        {
            const string operatorName = "$group";
            var          stage        = new DelegatedPipelineStageDefinition <TResult, TNewResult>(
                operatorName,
                (s, sr) =>
            {
                var renderedProjection = group.Render(s, sr);
                return(new RenderedPipelineStageDefinition <TNewResult>(operatorName, new BsonDocument(operatorName, renderedProjection.Document), renderedProjection.ProjectionSerializer));
            });

            return(AppendStage <TNewResult>(stage));
        }
        public override IAggregateFluent <TNewResult> Project <TNewResult>(ProjectionDefinition <TResult, TNewResult> projection)
        {
            const string operatorName = "$project";
            var          stage        = new DelegatedPipelineStageDefinition <TResult, TNewResult>(
                operatorName,
                (s, sr) =>
            {
                var renderedProjection = projection.Render(s, sr);
                BsonDocument document;
                if (renderedProjection.Document == null)
                {
                    document = new BsonDocument();
                }
                else
                {
                    document = new BsonDocument(operatorName, renderedProjection.Document);
                }
                return(new RenderedPipelineStageDefinition <TNewResult>(operatorName, document, renderedProjection.ProjectionSerializer));
            });

            return(AppendStage <TNewResult>(stage));
        }
示例#5
0
        public override IAggregateFluent <TNewResult> BucketAuto <TValue, TNewResult>(
            AggregateExpressionDefinition <TResult, TValue> groupBy,
            int buckets,
            ProjectionDefinition <TResult, TNewResult> output,
            AggregateBucketAutoOptions options = null)
        {
            Ensure.IsNotNull(groupBy, nameof(groupBy));
            Ensure.IsGreaterThanZero(buckets, nameof(buckets));
            Ensure.IsNotNull(output, nameof(output));

            const string operatorName = "$bucketAuto";
            var          stage        = new DelegatedPipelineStageDefinition <TResult, TNewResult>(
                operatorName,
                (s, sr) =>
            {
                var newResultSerializer = sr.GetSerializer <TNewResult>();
                var renderedGroupBy     = groupBy.Render(s, sr);
                var renderedOutput      = output.Render(s, sr);
                var document            = new BsonDocument
                {
                    { operatorName, new BsonDocument
                      {
                          { "groupBy", renderedGroupBy },
                          { "buckets", buckets },
                          { "output", renderedOutput.Document },
                          { "granularity", () => options.Granularity.Value.Value, options != null && options.Granularity.HasValue }
                      } }
                };
                return(new RenderedPipelineStageDefinition <TNewResult>(
                           operatorName,
                           document,
                           newResultSerializer));
            });

            return(AppendStage(stage));
        }