Skip to content

Commit

Permalink
chore: grouped listings performance
Browse files Browse the repository at this point in the history
  • Loading branch information
ychung-mot committed Sep 20, 2024
1 parent 086294e commit 2d4373c
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 19 deletions.
2 changes: 1 addition & 1 deletion server/StrDss.Data/Repositories/RentalListingRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public async Task<PagedDto<RentalListingGroupDto>> GetGroupedRentalListings(stri
var extraSort = "";


var groupedListings = await Page<RentalListingGroupDto, RentalListingGroupDto>(groupedQuery, pageSize, pageNumber, orderBy, direction, extraSort);
var groupedListings = await Page<RentalListingGroupDto, RentalListingGroupDto>(groupedQuery, pageSize, pageNumber, orderBy, direction, extraSort, false);


foreach (var group in groupedListings.SourceList)
Expand Down
57 changes: 39 additions & 18 deletions server/StrDss.Data/Repositories/RepositoryBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace StrDss.Data.Repositories
public interface IRepositoryBase<TEntity>
where TEntity : class
{
Task<PagedDto<TOutput>> Page<TInput, TOutput>(IQueryable<TInput> list, int pageSize, int pageNumber, string orderBy, string direction, string extraSort = "");
Task<PagedDto<TOutput>> Page<TInput, TOutput>(IQueryable<TInput> list, int pageSize, int pageNumber, string orderBy, string direction, string extraSort = "", bool count = true);
}
public class RepositoryBase<TEntity> : IRepositoryBase<TEntity>
where TEntity : class
Expand All @@ -34,44 +34,60 @@ public RepositoryBase(DssDbContext dbContext, IMapper mapper, ICurrentUser curre
_logger = logger;
}

public async Task<PagedDto<TOutput>> Page<TInput, TOutput>(IQueryable<TInput> list, int pageSize, int pageNumber, string orderBy, string direction = "", string extraSort = "")
public async Task<PagedDto<TOutput>> Page<TInput, TOutput>(IQueryable<TInput> list, int pageSize, int pageNumber, string orderBy, string direction = "", string extraSort = "", bool count = true)
{
var stopwatch = Stopwatch.StartNew();

var sort = string.IsNullOrEmpty(extraSort)
? $"{orderBy} {direction}"
: $"{orderBy} {direction}, {extraSort}";
var totalRecords = await list.CountAsync();

var pagedList = list.DynamicOrderBy(sort) as IQueryable<TInput>;
if (pageNumber <= 0) pageNumber = 1;

var sort = "";

if (extraSort.IsEmpty())
{
sort = $"{orderBy} {direction}";
}
else if (orderBy.IsNotEmpty())
{
sort = $"{orderBy} {direction}, {extraSort}";
}
else
{
sort = $"{extraSort}";
}

var pagedList = list.DynamicOrderBy($"{sort}") as IQueryable<TInput>;

if (pageSize > 0)
{
var skipRecordCount = (pageNumber - 1) * pageSize;
pagedList = pagedList.Skip(skipRecordCount).Take(pageSize);
pagedList = pagedList.Skip(skipRecordCount)
.Take(pageSize);
}

// Run the counting and fetching data in parallel
var countTask = list.CountAsync();
var fetchTask = pagedList.ToListAsync();
stopwatch.Stop();

_logger.LogDebug($"Get Grouped Listings (group) - Counting groups. Page Size: {pageSize}, Page Number: {pageNumber}, Time: {stopwatch.Elapsed.TotalSeconds} seconds");

// Await both tasks in parallel
await Task.WhenAll(countTask, fetchTask);
stopwatch.Restart();

var totalRecords = countTask.Result;
var result = fetchTask.Result;
var result = await pagedList.ToListAsync();

stopwatch.Stop();
_logger.LogDebug($"Mapping groups to DTO. Time: {stopwatch.Elapsed.TotalSeconds} seconds");

_logger.LogDebug($"Get Grouped Listings (group) - Getting groups. Time: {stopwatch.Elapsed.TotalSeconds} seconds");

stopwatch.Restart();

IEnumerable<TOutput> outputList;

// Map the result if necessary
if (typeof(TOutput) != typeof(TInput))
outputList = _mapper.Map<IEnumerable<TInput>, IEnumerable<TOutput>>(result);
else
outputList = (IEnumerable<TOutput>)result;

return new PagedDto<TOutput>
var pagedDTO = new PagedDto<TOutput>
{
SourceList = outputList,
PageInfo = new PageInfo
Expand All @@ -84,7 +100,12 @@ public async Task<PagedDto<TOutput>> Page<TInput, TOutput>(IQueryable<TInput> li
ItemCount = outputList.Count()
}
};
}

stopwatch.Stop();

_logger.LogDebug($"Get Grouped Listings (group) - Mapping groups to DTO. Time: {stopwatch.Elapsed.TotalSeconds} seconds");

return pagedDTO;
}
}
}

0 comments on commit 2d4373c

Please sign in to comment.