Пример #1
0
        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)));
        }
Пример #2
0
 private BsonValue TranslateSerializedConstant(SerializedConstantExpression node)
 {
     return(node.SerializeValue(node.Type, node.Value));
 }