protected internal override Expression VisitCorrelated(CorrelatedExpression node) { if (node.CorrelationId == _correlationId && node.Expression is AccumulatorExpression) { return(Visit(node.Expression)); } return(base.VisitCorrelated(node)); }
protected internal override Expression VisitCorrelated(CorrelatedExpression node) { if (node.Expression is AccumulatorExpression) { _accumulators.Add(node); return(node); } return(base.VisitCorrelated(node)); }
private Expression VisitCorrelatedAccumulator(CorrelatedExpression node) { Expression mapped; if (_accumulatorReplacementMap.TryGetValue(node, out mapped)) { return(mapped); } return(base.VisitCorrelated(node)); }
private Expression VisitCorrelatedGroup(CorrelatedExpression node) { var groupExpression = (GroupByExpression)node.Expression; if (_accumulatorLookup != null && _accumulatorLookup.Contains(node.CorrelationId)) { var oldAccumulatorLookup = _accumulatorLookup; var source = Visit(groupExpression.Source); _accumulatorLookup = oldAccumulatorLookup; var accumulators = new List <AccumulatorExpression>(); var fieldExpressions = new List <FieldExpression>(); var comparer = new ExpressionComparer(); foreach (var correlatedAccumulator in _accumulatorLookup[node.CorrelationId]) { var index = accumulators.FindIndex(x => comparer.Compare((Expression)x, correlatedAccumulator.Expression)); FieldExpression fieldExpression; if (index == -1) { var accumulator = (AccumulatorExpression)correlatedAccumulator.Expression; // TODO: might not need to do any renames... accumulator = new AccumulatorExpression( accumulator.Type, "__agg" + accumulators.Count, accumulator.Serializer, accumulator.AccumulatorType, accumulator.Argument); accumulators.Add(accumulator); fieldExpression = new FieldExpression(accumulator.FieldName, accumulator.Serializer); fieldExpressions.Add(fieldExpression); } else { fieldExpression = fieldExpressions[index]; } _accumulatorReplacementMap[correlatedAccumulator] = fieldExpression; } groupExpression = new GroupByExpression( groupExpression.Type, source, groupExpression.KeySelector, accumulators.AsReadOnly()); } return(Visit(groupExpression)); }
protected internal override Expression VisitCorrelated(CorrelatedExpression node) { if (node.Expression is AccumulatorExpression) { return(VisitCorrelatedAccumulator(node)); } if (node.Expression is GroupByExpression) { return(VisitCorrelatedGroup(node)); } return(base.VisitCorrelated(node)); }