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)); }
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)); }
/// <summary> /// Compiles <see cref="RowNumberProvider"/>. /// </summary> /// <param name="provider">Row number provider.</param> protected abstract TResult VisitRowNumber(RowNumberProvider provider);