Esempio n. 1
0
        private bool TryBindAccumulatorExpression(MethodCallExpression node, out Expression accumulator)
        {
            AccumulatorType accumulatorType;

            if (TryGetAccumulatorType(node.Method.Name, out accumulatorType))
            {
                Guid correlationId = Guid.Empty;
                if (_groupMap == null || TryGetCorrelatedGroup(node.Arguments[0], out correlationId))
                {
                    accumulator = new AccumulatorExpression(node.Type,
                                                            accumulatorType,
                                                            GetAccumulatorArgument(node));

                    if (_groupMap != null)
                    {
                        accumulator = new CorrelatedAccumulatorExpression(
                            correlationId,
                            (AccumulatorExpression)accumulator);
                    }

                    return(true);
                }
            }

            accumulator = null;
            return(false);
        }
Esempio n. 2
0
        protected override Expression VisitNew(NewExpression node)
        {
            var newNode = (NewExpression)base.VisitNew(node);

            if (newNode.Type.IsGenericType &&
                newNode.Type.GetGenericTypeDefinition() == typeof(HashSet <>) &&
                newNode.Arguments.Count == 1 &&
                newNode.Arguments[0] is AccumulatorExpression &&
                ((AccumulatorExpression)newNode.Arguments[0]).AccumulatorType == AccumulatorType.Push)
            {
                Guid correlationId = Guid.Empty;
                if (_groupMap == null || TryGetCorrelatedGroup(node.Arguments[0], out correlationId))
                {
                    Expression accumulator = new AccumulatorExpression(
                        newNode.Type,
                        AccumulatorType.AddToSet,
                        ((AccumulatorExpression)newNode.Arguments[0]).Argument);

                    if (_groupMap != null)
                    {
                        accumulator = new CorrelatedAccumulatorExpression(
                            correlationId,
                            (AccumulatorExpression)accumulator);
                    }

                    return(accumulator);
                }
            }

            return(newNode);
        }
Esempio n. 3
0
            protected internal override Expression VisitCorrelatedAccumulator(CorrelatedAccumulatorExpression node)
            {
                _accumulators.Add(node);

                // there could be nested accumulators we need to get...
                return(base.VisitCorrelatedAccumulator(node));
            }
Esempio n. 4
0
            protected internal override Expression VisitCorrelatedAccumulator(CorrelatedAccumulatorExpression node)
            {
                if (node.CorrelationId == _correlationId)
                {
                    return(Visit(node.Accumulator));
                }

                return(base.VisitCorrelatedAccumulator(node));
            }
Esempio n. 5
0
        protected internal override Expression VisitCorrelatedAccumulator(CorrelatedAccumulatorExpression node)
        {
            Expression mapped;

            if (_map.TryGetValue(node, out mapped))
            {
                return(mapped);
            }

            return(base.VisitCorrelatedAccumulator(node));
        }