public Expression Bind(PipelineExpression pipeline, EmbeddedPipelineBindingContext bindingContext, MethodCallExpression node, IEnumerable <Expression> arguments) { var sourceSerializer = pipeline.Projector.Serializer; var accumulatorSerializer = sourceSerializer; Expression seed; LambdaExpression lambda; var argumentCount = arguments.Count(); if (argumentCount == 1) { lambda = ExpressionHelper.GetLambda(arguments.Single()); seed = Expression.Constant(accumulatorSerializer.ValueType.GetDefaultValue()); } else { seed = arguments.First(); accumulatorSerializer = bindingContext.GetSerializer(seed.Type, seed); lambda = ExpressionHelper.GetLambda(arguments.ElementAt(1)); } if (seed.NodeType == ExpressionType.Constant) { seed = new SerializedConstantExpression(((ConstantExpression)seed).Value, accumulatorSerializer); } var valueField = new FieldExpression("$value", accumulatorSerializer); var thisField = new FieldExpression("$this", sourceSerializer); bindingContext.AddExpressionMapping(lambda.Parameters[0], valueField); bindingContext.AddExpressionMapping(lambda.Parameters[1], thisField); var reducer = bindingContext.Bind(lambda.Body); var serializer = bindingContext.GetSerializer(reducer.Type, reducer); Expression finalizer = null; string itemName = null; if (argumentCount == 3) { lambda = ExpressionHelper.GetLambda(arguments.Last()); itemName = lambda.Parameters[0].Name; var variable = new FieldExpression("$" + itemName, serializer); bindingContext.AddExpressionMapping(lambda.Parameters[0], variable); finalizer = bindingContext.Bind(lambda.Body); serializer = bindingContext.GetSerializer(finalizer.Type, finalizer); } return(new PipelineExpression( pipeline.Source, new DocumentExpression(serializer), new AggregateResultOperator(seed, reducer, finalizer, itemName, serializer))); }
private BsonValue TranslateSerializedConstant(SerializedConstantExpression node) { return(node.SerializeValue(node.Type, node.Value)); }