/// <inheritdoc/>
        protected override Provider VisitCalculate(CalculateProvider provider)
        {
            OnRecursionEntrance(provider);
            var source = VisitCompilable(provider.Source);

            OnRecursionExit(provider);
            var translated  = false;
            var descriptors = new List <CalculatedColumnDescriptor>(provider.CalculatedColumns.Length);

            foreach (var column in provider.CalculatedColumns)
            {
                var expression = translate(provider, column.Expression);
                if (expression != column.Expression)
                {
                    translated = true;
                }
                var ccd = new CalculatedColumnDescriptor(column.Name, column.Type, (Expression <Func <Tuple, object> >)expression);
                descriptors.Add(ccd);
            }
            if (!translated && source == provider.Source)
            {
                return(provider);
            }
            return(new CalculateProvider(source, descriptors.ToArray()));
        }
 /// <summary>
 /// Visits <see cref="CalculateProvider"/>.
 /// </summary>
 /// <param name="provider">Calculate provider.</param>
 protected abstract Provider VisitCalculate(CalculateProvider provider);