private void SetCosmosEndOfDataMarker(IPagingData pagingData)
        {
            var cosmosPagingData = (CosmosPagingData)pagingData;

            cosmosPagingData.ContinuationToken = CosmosPages.Count > 1 ? Guid.NewGuid().ToString() : null;
            cosmosPagingData.CurrentPageSize   = CosmosPages.Count > 0 ? CosmosPages[CosmosPages.Count - 1].Length : 0;
        }
示例#2
0
        /// <summary>
        /// 获取分页器的最大页数
        /// </summary>
        /// <param name="pagingData">数据分页器</param>
        /// <returns></returns>
        public static int MaxPages(this IPagingData pagingData)
        {
            int count    = pagingData.Count();
            int pageSize = pagingData.PageSize;

            return(count / pageSize + ((count % pageSize) == 0 ? 0 : 1));
        }
示例#3
0
        public static Pager Pager(this HtmlHelper htmlHelper, IPagingData pagingData)
        {
            var pager = htmlHelper.Pager(pagingData.ItemsBase.PageSize, pagingData.ItemsBase.PageNumber, pagingData.ItemsBase.TotalItemCount,
                                         new AjaxOptions {
                UpdateTargetId = pagingData.ContainerName
            });

            var routeValues = pagingData.RouteValues ?? new RouteValueDictionary();

            // Because of a bug in MVCPaging 2.0.1 the action parameter needs to be specified in routevalues as well
            if (!string.IsNullOrEmpty(pagingData.Action) && !routeValues.ContainsKey("action"))
            {
                routeValues.Add("action", pagingData.Action);
            }

            if (pagingData.Id != null && !routeValues.ContainsKey("id"))
            {
                routeValues.Add("id", pagingData.Id);
            }

            if (pagingData.AddTotalCount && !routeValues.ContainsKey("totalCount"))
            {
                routeValues.Add("totalCount", pagingData.ItemsBase.TotalItemCount);
            }

            pager = pager.Options(o => o.RouteValues(routeValues));

            return(pager);
        }
示例#4
0
        public async Task <Activity[]> GetActivitiesAsync(IPagingData pagingData)
        {
            if (!(pagingData is ElasticPagingData elasticPagingData))
            {
                throw new InvalidQueryPagingData(
                          $"paging data supplied to {nameof(ElasticActivityDocumentRepository)} is not a {nameof(ElasticPagingData)}");
            }

            // See https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html
            // for a description of deep paging issues

            var dbQuery = await _client.SearchAsync <Activity>(s => s
                                                               .From(elasticPagingData.FromIndex)
                                                               .Size(pagingData.RequiredPageSize)
                                                               .Sort(srt => srt.Ascending(a => a.Id))
                                                               .Query(q => q.MatchAll()));

            var activities = dbQuery.Documents.ToArray();

            elasticPagingData.FromIndex      += activities.Length;
            elasticPagingData.CurrentPageSize = activities.Length;
            activities.AssertInIdOrder();

            return(activities);
        }
        public async Task <Activity[]> GetActivitiesAsync(IPagingData pagingData)
        {
            if (!(pagingData is CosmosPagingData cosmosPagingData))
            {
                throw new InvalidQueryPagingData(
                          $"paging data supplied to {nameof(CosmosActivityDocumentRepository)} is not a {nameof(CosmosPagingData)}");
            }

            var cosmosResults = await _cosmosClient.GetPageAsync <CosmosActivity, Guid>(_config.CosmosCollectionName, cosmosPagingData.ContinuationToken, documentType => documentType.MessageId, pagingData.RequiredPageSize);

            cosmosPagingData.ContinuationToken = cosmosResults.ContinuationToken;

            var activities = cosmosResults.Items.Select(ca => ca.Activity).ToArray();

            cosmosPagingData.CurrentPageSize = activities.Length;

            activities.AssertInIdOrder();

            return(activities);
        }
        private async Task <IEnumerable <Activity> > FetchNextPageOfActivities(IPagingData pagingData)
        {
            var thisFetchId = Interlocked.Increment(ref _fetchId);

            _logger.Debug($"Fetch id:{thisFetchId} request-page-size:{pagingData.RequiredPageSize} repo:{pagingData.Repository.GetType().Name}");

            var haveReachedLimit = !pagingData.MoreDataAvailable || (
                pagingData.MaximumInspections.HasValue &&
                pagingData.MaximumInspections <= pagingData.Inspections);

            if (haveReachedLimit)
            {
                _logger.Debug($"Fetch id:{thisFetchId} terminating MoreDataAvailable:{pagingData.MoreDataAvailable} TotalInspections:{pagingData.Inspections} MaximumInspections:{pagingData.MaximumInspections??-1}");
                pagingData.CurrentPageSize = 0;
                return(new Activity[0]);
            }

            var page = await pagingData.Repository.GetActivitiesAsync(pagingData);

            pagingData.Inspections = pagingData.Inspections + page.Length;

            _logger.Debug($"Fetch id:{thisFetchId} actual-page-size:{page.Length} inspections-so-far:{pagingData.Inspections} max-inspections:{pagingData.MaximumInspections} has-more-data:{pagingData.MoreDataAvailable}");
            return(page);
        }
示例#7
0
 public PagingSelector(IPagingData <TSource> source, Func <IEnumerable <TSource>, IEnumerable <TResult> > pageConverter)
 {
     _dataSource   = source;
     _pageSelector = pageConverter;
 }
示例#8
0
 public PagingSelector(IPagingData <TSource> source, Func <TSource, TResult> selector)
 {
     _dataSource = source;
     _selector   = selector;
 }
示例#9
0
 /// <summary>
 /// 对分页数据中的每一页进行指定映射操作,得到一个新的分页数据
 /// </summary>
 /// <typeparam name="TSource">源分页数据类型</typeparam>
 /// <typeparam name="TResult">映射后的类型</typeparam>
 /// <param name="source">数据源</param>
 /// <param name="pageSelector">映射函数</param>
 /// <returns>执行映射操作后的分页数据</returns>
 public static IPagingData <TResult> PageSelect <TSource, TResult>(this IPagingData <TSource> source, Func <IEnumerable <TSource>, IEnumerable <TResult> > pageSelector)
 {
     return(new PagingSelector <TSource, TResult>(source, pageSelector));
 }
示例#10
0
 /// <summary>
 /// 对分页数据中的每一项进行指定映射操作,得到一个新的分页数据
 /// </summary>
 /// <typeparam name="TSource">源分页数据类型</typeparam>
 /// <typeparam name="TResult">映射后的类型</typeparam>
 /// <param name="source">数据源</param>
 /// <param name="selector">映射函数</param>
 /// <returns>执行映射操作后的分页数据</returns>
 public static IPagingData <TResult> Select <TSource, TResult>(this IPagingData <TSource> source, Func <TSource, TResult> selector)
 {
     return(new PagingSelector <TSource, TResult>(source, selector));
 }
 public ActivityPageResult(Activity[] activities, IPagingData pagingData)
 {
     Activities = activities;
     PagingData = pagingData;
 }
        private void SetElasticEndOfDataMarker(IPagingData pagingData)
        {
            var elasticPagingData = (ElasticPagingData)pagingData;

            elasticPagingData.CurrentPageSize = ElasticPages.Count > 0 ? ElasticPages[0].Length : 0;
        }