protected internal override Expression VisitCorrelated(CorrelatedExpression node) { if (node.CorrelationId == _correlationId && node.Expression is AccumulatorExpression) { return Visit(node.Expression); } return base.VisitCorrelated(node); }
private Expression VisitCorrelatedAccumulator(CorrelatedExpression node) { Expression mapped; if (_accumulatorReplacementMap.TryGetValue(node, out mapped)) { return mapped; } return base.VisitCorrelated(node); }
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); }
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 virtual Expression VisitCorrelated(CorrelatedExpression node) { return(node.Update(Visit(node.Expression))); }
protected internal virtual Expression VisitCorrelated(CorrelatedExpression node) { return node.Update(Visit(node.Expression)); }
protected internal override Expression VisitCorrelated(CorrelatedExpression node) { if (node.Expression is AccumulatorExpression) { _accumulators.Add(node); return node; } return base.VisitCorrelated(node); }