/// <inheritdoc/>
        protected override Provider VisitAggregate(AggregateProvider provider)
        {
            OnRecursionEntrance(provider);
            var source           = VisitCompilable(provider.Source);
            var resultParameters = OnRecursionExit(provider);

            if (source == provider.Source)
            {
                return(provider);
            }
            if (resultParameters == null)
            {
                var acd = new List <AggregateColumnDescriptor>(provider.AggregateColumns.Length);
                acd.AddRange(provider.AggregateColumns.Select(ac => new AggregateColumnDescriptor(ac.Name, ac.SourceIndex, ac.AggregateType)));
                return(new AggregateProvider(source, provider.GroupColumnIndexes, acd.ToArray()));
            }
            var result = (Pair <int[], AggregateColumnDescriptor[]>)resultParameters;

            return(new AggregateProvider(source, result.First, result.Second));
        }
 /// <summary>
 /// Visits <see cref="AggregateProvider"/>.
 /// </summary>
 /// <param name="provider">Aggregate provider.</param>
 /// <returns></returns>
 protected abstract Provider VisitAggregate(AggregateProvider provider);