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)); }
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)); }