protected override Provider Visit(CompilableProvider cp)
        {
            var isPagingProvider = cp.Type.In(ProviderType.Take, ProviderType.Skip, ProviderType.Paging);

            if (isPagingProvider && !State.IsSkipTakeChain)
            {
                var visitedProvider = (CompilableProvider)base.Visit(cp);

                var requiresRowNumber = (State.Take != null && !takeSupported) || (State.Skip != null && !skipSupported);

                // add rownumber column (if needed)
                if (requiresRowNumber)
                {
                    // Arrray to avoid access to modified closure
                    string[] columnName = { String.Format(Strings.RowNumberX, rowNumberCount++) };
                    while (visitedProvider.Header.Columns.Any(column => column.Name == columnName[0]))
                    {
                        columnName[0] = String.Format(Strings.RowNumberX, rowNumberCount++);
                    }
                    visitedProvider = new RowNumberProvider(visitedProvider, columnName[0]);
                }

                if (State.Take != null && State.Skip != null)
                {
                    visitedProvider = new PagingProvider(visitedProvider, State.Skip, State.Take);
                }
                else if (State.Take != null)
                {
                    visitedProvider = new TakeProvider(visitedProvider, State.Take);
                }
                else
                {
                    visitedProvider = new SkipProvider(visitedProvider, State.Skip);
                }

                // add select removing RowNumber column
                if (requiresRowNumber)
                {
                    visitedProvider = new SelectProvider(
                        visitedProvider,
                        Enumerable.Range(0, visitedProvider.Header.Length - 1).ToArray());
                }

                return(visitedProvider);
            }

            if (!isPagingProvider && State.IsSkipTakeChain)
            {
                using (State.CreateScope())
                    return(base.Visit(cp));
            }

            return(base.Visit(cp));
        }
Example #2
0
        protected override Provider VisitRowNumber(RowNumberProvider provider)
        {
            var sourceLength = provider.Source.Header.Length;

            mappings[provider.Source] = mappings[provider].Where(i => i < sourceLength).ToList();
            var newSource       = VisitCompilable(provider.Source);
            var currentMapping  = mappings[provider.Source];
            var rowNumberColumn = provider.Header.Columns.Last();

            mappings[provider] = Merge(currentMapping, EnumerableUtils.One(rowNumberColumn.Index));
            return(newSource == provider.Source
        ? provider
        : new RowNumberProvider(newSource, rowNumberColumn.Name));
        }
        protected override SqlProvider VisitRowNumber(RowNumberProvider provider)
        {
            var directionCollection = provider.Header.Order;

            if (directionCollection.Count == 0)
            {
                directionCollection = new DirectionCollection <int>(1);
            }
            var source = Compile(provider.Source);

            var query     = ExtractSqlSelect(provider, source);
            var rowNumber = SqlDml.RowNumber();

            query.Columns.Add(rowNumber, provider.Header.Columns.Last().Name);
            var columns = ExtractColumnExpressions(query);

            foreach (var order in directionCollection)
            {
                rowNumber.OrderBy.Add(columns[order.Key], order.Value == Direction.Positive);
            }
            return(CreateProvider(query, provider, source));
        }
Example #4
0
 /// <summary>
 /// Compiles <see cref="RowNumberProvider"/>.
 /// </summary>
 /// <param name="provider">Row number provider.</param>
 protected abstract TResult VisitRowNumber(RowNumberProvider provider);