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));
        }
Пример #3
0
 /// <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"));
 }
Пример #4
0
        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));
        }
Пример #5
0
        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);
        }
Пример #6
0
 /// <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);
 }