protected override Provider VisitPaging(PagingProvider provider) { State.IsSkipTakeChain = true; var visitedSource = VisitCompilable(provider.Source); State.AddSkip(provider.Skip); State.AddTake(provider.Take); return(visitedSource); }
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)); }
/// <inheritdoc/> protected override SqlProvider VisitPaging(PagingProvider provider) { if (providerInfo.Supports(ProviderFeatures.NativePaging)) { return(VisitPagingNative(provider, provider.Take, provider.Skip)); } if (providerInfo.Supports(ProviderFeatures.RowNumber)) { return(VisitPagingRowNumber(provider)); } throw new NotSupportedException(string.Format(Strings.ExXIsNotSupported, "Take/Skip")); }
private SqlProvider VisitPagingRowNumber(PagingProvider provider) { var fromParameterBinding = CreateLimitOffsetParameterBinding(provider.From); var toParameterBinding = CreateLimitOffsetParameterBinding(provider.To); var bindings = new List <QueryParameterBinding> { fromParameterBinding, toParameterBinding }; var compiledSource = Compile(provider.Source); var source = compiledSource.Request.Statement; var queryRef = SqlDml.QueryRef(source); var query = SqlDml.Select(queryRef); var rowNumberColumn = queryRef.Columns.Last(); query.Columns.AddRange(queryRef.Columns.Cast <SqlColumn>()); query.Where = SqlDml.Between(rowNumberColumn, fromParameterBinding.ParameterReference, toParameterBinding.ParameterReference); return(CreateProvider(query, bindings, provider, compiledSource)); }
public async override Task <QueryResponse <string> > Query(PostQueryRequest query, CancellationToken cancellationToken = default) { query.Pagination ??= new Pagination(); var paging = PagingProvider; if (query.Type != null) { switch (query.Type) { case PostType.Article: paging = new PagingProvider <string>(Path.Join(RootPath, "articles"), FileProvider); break; case PostType.Slides: paging = new PagingProvider <string>(Path.Join(RootPath, "slides"), FileProvider); break; case PostType.Note: paging = new PagingProvider <string>(Path.Join(RootPath, "notes"), FileProvider); break; } } else if (query.Category != null && query.Category.Items.Any()) { var catRoot = Path.Join(RootPath, "categories"); catRoot = Path.Join(catRoot, Path.Combine(query.Category.Items.Select(NameUtility.Encode).ToArray())); paging = new PagingProvider <string>(catRoot, FileProvider); } else if (query.Keywords != null && query.Keywords.Items.Any()) { var catRoot = Path.Join(RootPath, "keywords"); paging = new PagingProvider <string>(Path.Join(catRoot, query.Keywords.Items.Select(NameUtility.Encode).First()), FileProvider); } await paging.FillPagination(query.Pagination); var res = new QueryResponse <string>( await paging.GetPaging(query.Pagination), query.Pagination); return(res); }
/// <summary> /// Compiles <see cref="PagingProvider"/>. /// </summary> /// <param name="provider">Paging provider.</param> protected abstract TResult VisitPaging(PagingProvider provider);
protected RecordFSReaderBase(string rootPath, IFileProvider fileProvider) : base(rootPath, fileProvider) { PagingProvider = new PagingProvider <TId>(Path.Join(RootPath, "pages"), FileProvider); }