예제 #1
0
        public async Task <IEnumerable <UserInfo> > GetProjectLikersSequenceAsync(string projectId, DataQueryOptions filter)
        {
            var result = new List <UserInfo>();
            IEnumerable <DomainItemSignal> data = await _cassandraStatisticsService.GetItemLikesSequenceAsync(StatisticsSpaces.Projects, projectId, MemoryPageSize);

            var pageData = new List <DomainItemSignal>();
            int count    = 0;
            int skip     = filter != null && filter.Skip.HasValue ? filter.Skip.Value : 0;

            foreach (DomainItemSignal user in data)
            {
                if (result.Count >= MemoryPageSize || count > MemoryPageSize * MaxScanPages)
                {
                    // memory limit reached
                    break;
                }

                if (filter != null && filter.Take.HasValue && result.Count >= filter.Take.Value + skip)
                {
                    // all items loaded
                    break;
                }

                // adding to page
                pageData.Add(user);

                // checking limits
                if ((count > 0 && count % MemoryPageSize == 0) ||
                    (filter != null && filter.Take.HasValue && pageData.Count >= filter.Take.Value))
                {
                    // loading and filtering items
                    List <UserInfo> page = await LoadUserPageDataAsync(pageData);

                    result.AddRange(page);
                    pageData.Clear();
                }

                count++;
            }

            if (pageData.Count > 0)
            {
                // loading last page
                List <UserInfo> page = await LoadUserPageDataAsync(pageData);

                result.AddRange(page);
                pageData.Clear();
            }

            // Skip
            result = result.Skip(skip).ToList();

            // Take
            if (filter != null && filter.Take.HasValue)
            {
                result = result.Take(filter.Take.Value).ToList();
            }

            return(result);
        }