Skip to content

Commit

Permalink
Merge pull request #7 from davewalker5/service-todos
Browse files Browse the repository at this point in the history
Add pagination to data retrieval "list" methods
  • Loading branch information
davewalker5 committed Apr 16, 2020
2 parents f126b30 + 7f366c6 commit 4e648aa
Show file tree
Hide file tree
Showing 24 changed files with 308 additions and 172 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<PackageId>FlightRecorder.BusinessLogic</PackageId>
<PackageVersion>1.0.0.2</PackageVersion>
<PackageVersion>1.0.0.3</PackageVersion>
<Authors>Dave Walker</Authors>
<Copyright>Copyright (c) Dave Walker 2020</Copyright>
<Owners>Dave Walker</Owners>
Expand Down
54 changes: 39 additions & 15 deletions src/FlightRecorder.BusinessLogic/Logic/AircraftManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ namespace FlightRecorder.BusinessLogic.Logic
{
internal class AircraftManager : IAircraftManager
{
private const int AllModelsPageSize = 1000000;

private FlightRecorderFactory _factory;

internal AircraftManager(FlightRecorderFactory factory)
Expand All @@ -26,7 +28,7 @@ internal AircraftManager(FlightRecorderFactory factory)
/// <param name="predicate"></param>
/// <returns></returns>
public Aircraft Get(Expression<Func<Aircraft, bool>> predicate)
=> List(predicate).FirstOrDefault();
=> List(predicate, 1, 1).FirstOrDefault();

/// <summary>
/// Get the first aircraft matching the specified criteria along with the associated model
Expand All @@ -45,23 +47,29 @@ public async Task<Aircraft> GetAsync(Expression<Func<Aircraft, bool>> predicate)
/// Get the aircraft matching the specified criteria along with the associated models
/// </summary>
/// <param name="predicate"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IEnumerable<Aircraft> List(Expression<Func<Aircraft, bool>> predicate = null)
public IEnumerable<Aircraft> List(Expression<Func<Aircraft, bool>> predicate, int pageNumber, int pageSize)
{
IEnumerable<Aircraft> aircraft;

if (predicate == null)
{
aircraft = _factory.Context.Aircraft
.Include(a => a.Model)
.ThenInclude(m => m.Manufacturer);
.ThenInclude(m => m.Manufacturer)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
}
else
{
aircraft = _factory.Context.Aircraft
.Include(a => a.Model)
.ThenInclude(m => m.Manufacturer)
.Where(predicate);
.Where(predicate)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
}

return aircraft;
Expand All @@ -71,8 +79,10 @@ public IEnumerable<Aircraft> List(Expression<Func<Aircraft, bool>> predicate = n
/// Get the aircraft matching the specified criteria along with the associated models
/// </summary>
/// <param name="predicate"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IAsyncEnumerable<Aircraft> ListAsync(Expression<Func<Aircraft, bool>> predicate = null)
public IAsyncEnumerable<Aircraft> ListAsync(Expression<Func<Aircraft, bool>> predicate, int pageNumber, int pageSize)
{
IAsyncEnumerable<Aircraft> aircraft;

Expand All @@ -81,6 +91,8 @@ public IAsyncEnumerable<Aircraft> ListAsync(Expression<Func<Aircraft, bool>> pre
aircraft = _factory.Context.Aircraft
.Include(a => a.Model)
.ThenInclude(m => m.Manufacturer)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.AsAsyncEnumerable();
}
else
Expand All @@ -89,6 +101,8 @@ public IAsyncEnumerable<Aircraft> ListAsync(Expression<Func<Aircraft, bool>> pre
.Include(a => a.Model)
.ThenInclude(m => m.Manufacturer)
.Where(predicate)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.AsAsyncEnumerable();
}

Expand All @@ -99,16 +113,18 @@ public IAsyncEnumerable<Aircraft> ListAsync(Expression<Func<Aircraft, bool>> pre
/// Get the aircraft of a specified model
/// </summary>
/// <param name="modelName"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IEnumerable<Aircraft> ListByModel(string modelName)
public IEnumerable<Aircraft> ListByModel(string modelName, int pageNumber, int pageSize)
{
IEnumerable<Aircraft> matches = null;

modelName = modelName.CleanString();
Model model = _factory.Models.Get(m => m.Name == modelName);
if (model != null)
{
matches = List(m => m.ModelId == model.Id);
matches = List(m => m.ModelId == model.Id, pageNumber, pageSize);
}

return matches;
Expand All @@ -118,16 +134,18 @@ public IEnumerable<Aircraft> ListByModel(string modelName)
/// Get the aircraft of a specified model
/// </summary>
/// <param name="modelName"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<IAsyncEnumerable<Aircraft>> ListByModelAsync(string modelName)
public async Task<IAsyncEnumerable<Aircraft>> ListByModelAsync(string modelName, int pageNumber, int pageSize)
{
IAsyncEnumerable<Aircraft> matches = null;

modelName = modelName.CleanString();
Model model = await _factory.Models.GetAsync(m => m.Name == modelName);
if (model != null)
{
matches = ListAsync(m => m.ModelId == model.Id);
matches = ListAsync(m => m.ModelId == model.Id, pageNumber, pageSize);
}

return matches;
Expand All @@ -137,8 +155,10 @@ public async Task<IAsyncEnumerable<Aircraft>> ListByModelAsync(string modelName)
/// Get the aircraft manufactured by a given manufacturer
/// </summary>
/// <param name="manufacturerName"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IEnumerable<Aircraft> ListByManufacturer(string manufacturerName)
public IEnumerable<Aircraft> ListByManufacturer(string manufacturerName, int pageNumber, int pageSize)
{
IEnumerable<Aircraft> matches = null;

Expand All @@ -147,12 +167,13 @@ public IEnumerable<Aircraft> ListByManufacturer(string manufacturerName)
.Get(m => m.Name == manufacturerName);
if (manufacturer != null)
{
// Model retrieval uses an arbitrarily large page size to retrieve all models
IEnumerable<long> modelIds = _factory.Models
.List(m => m.ManufacturerId == manufacturer.Id)
.List(m => m.ManufacturerId == manufacturer.Id, 1, AllModelsPageSize)
.Select(m => m.Id);
if (modelIds.Any())
{
matches = List(a => modelIds.Contains(a.ModelId));
matches = List(a => modelIds.Contains(a.ModelId), pageNumber, pageSize);
}
}

Expand All @@ -163,8 +184,10 @@ public IEnumerable<Aircraft> ListByManufacturer(string manufacturerName)
/// Get the aircraft manufactured by a given manufacturer
/// </summary>
/// <param name="manufacturerName"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<IAsyncEnumerable<Aircraft>> ListByManufacturerAsync(string manufacturerName)
public async Task<IAsyncEnumerable<Aircraft>> ListByManufacturerAsync(string manufacturerName, int pageNumber, int pageSize)
{
IAsyncEnumerable<Aircraft> matches = null;

Expand All @@ -173,13 +196,14 @@ public async Task<IAsyncEnumerable<Aircraft>> ListByManufacturerAsync(string man
.GetAsync(m => m.Name == manufacturerName);
if (manufacturer != null)
{
// Model retrieval uses an arbitrarily large page size to retrieve all models
List<long> modelIds = await _factory.Models
.ListAsync(m => m.ManufacturerId == manufacturer.Id)
.ListAsync(m => m.ManufacturerId == manufacturer.Id, 1, AllModelsPageSize)
.Select(m => m.Id)
.ToListAsync();
if (modelIds.Any())
{
matches = ListAsync(a => modelIds.Contains(a.ModelId));
matches = ListAsync(a => modelIds.Contains(a.ModelId), pageNumber, pageSize);
}
}

Expand Down
22 changes: 17 additions & 5 deletions src/FlightRecorder.BusinessLogic/Logic/AirlineManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ internal AirlineManager(FlightRecorderDbContext context)
/// <param name="predicate"></param>
/// <returns></returns>
public Airline Get(Expression<Func<Airline, bool>> predicate)
=> List(predicate).FirstOrDefault();
=> List(predicate, 1, 1).FirstOrDefault();

/// <summary>
/// Get the first airline matching the specified criteria
Expand All @@ -45,17 +45,24 @@ public async Task<Airline> GetAsync(Expression<Func<Airline, bool>> predicate)
/// Return all entities matching the specified criteria
/// </summary>
/// <param name="predicate"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IEnumerable<Airline> List(Expression<Func<Airline, bool>> predicate = null)
public IEnumerable<Airline> List(Expression<Func<Airline, bool>> predicate, int pageNumber, int pageSize)
{
IEnumerable<Airline> results;
if (predicate == null)
{
results = _context.Airlines;
results = results.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
}
else
{
results = _context.Airlines.Where(predicate);
results = _context.Airlines
.Where(predicate)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize); ;
}

return results;
Expand All @@ -65,13 +72,18 @@ public IEnumerable<Airline> List(Expression<Func<Airline, bool>> predicate = nul
/// Return all entities matching the specified criteria
/// </summary>
/// <param name="predicate"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IAsyncEnumerable<Airline> ListAsync(Expression<Func<Airline, bool>> predicate = null)
public IAsyncEnumerable<Airline> ListAsync(Expression<Func<Airline, bool>> predicate, int pageNumber, int pageSize)
{
IAsyncEnumerable<Airline> results;
if (predicate == null)
{
results = _context.Airlines.AsAsyncEnumerable();
results = _context.Airlines;
results = results.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.AsAsyncEnumerable();
}
else
{
Expand Down
34 changes: 25 additions & 9 deletions src/FlightRecorder.BusinessLogic/Logic/FlightManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ internal FlightManager(FlightRecorderFactory factory)
/// <param name="predicate"></param>
/// <returns></returns>
public Flight Get(Expression<Func<Flight, bool>> predicate)
=> List(predicate).FirstOrDefault();
=> List(predicate, 1, 1).FirstOrDefault();

/// <summary>
/// Get the first flight matching the specified criteria along with the associated airline
Expand All @@ -45,21 +45,27 @@ public async Task<Flight> GetAsync(Expression<Func<Flight, bool>> predicate)
/// Get the flights matching the specified criteria along with the associated airlines
/// </summary>
/// <param name="predicate"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IEnumerable<Flight> List(Expression<Func<Flight, bool>> predicate = null)
public IEnumerable<Flight> List(Expression<Func<Flight, bool>> predicate, int pageNumber, int pageSize)
{
IEnumerable<Flight> flights;

if (predicate == null)
{
flights = _factory.Context.Flights
.Include(m => m.Airline);
.Include(m => m.Airline)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
}
else
{
flights = _factory.Context.Flights
.Include(m => m.Airline)
.Where(predicate);
.Where(predicate)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
}

return flights;
Expand All @@ -69,22 +75,28 @@ public IEnumerable<Flight> List(Expression<Func<Flight, bool>> predicate = null)
/// Get the flights matching the specified criteria along with the associated airlines
/// </summary>
/// <param name="predicate"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IAsyncEnumerable<Flight> ListAsync(Expression<Func<Flight, bool>> predicate = null)
public IAsyncEnumerable<Flight> ListAsync(Expression<Func<Flight, bool>> predicate, int pageNumber, int pageSize)
{
IAsyncEnumerable<Flight> flights;

if (predicate == null)
{
flights = _factory.Context.Flights
.Include(m => m.Airline)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.AsAsyncEnumerable();
}
else
{
flights = _factory.Context.Flights
.Include(m => m.Airline)
.Where(predicate)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.AsAsyncEnumerable();
}

Expand All @@ -95,16 +107,18 @@ public IAsyncEnumerable<Flight> ListAsync(Expression<Func<Flight, bool>> predica
/// Get the flights for a named airline
/// </summary>
/// <param name="airlineName"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public IEnumerable<Flight> ListByAirline(string airlineName)
public IEnumerable<Flight> ListByAirline(string airlineName, int pageNumber, int pageSize)
{
IEnumerable<Flight> matches = null;

airlineName = airlineName.CleanString();
Airline airline = _factory.Airlines.Get(m => m.Name == airlineName);
if (airline != null)
{
matches = List(m => m.AirlineId == airline.Id);
matches = List(m => m.AirlineId == airline.Id, pageNumber, pageSize);
}

return matches;
Expand All @@ -114,8 +128,10 @@ public IEnumerable<Flight> ListByAirline(string airlineName)
/// Get the flights for a named airline
/// </summary>
/// <param name="airlineName"></param>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public async Task<IAsyncEnumerable<Flight>> ListByAirlineAsync(string airlineName)
public async Task<IAsyncEnumerable<Flight>> ListByAirlineAsync(string airlineName, int pageNumber, int pageSize)
{
IAsyncEnumerable<Flight> matches = null;

Expand All @@ -124,7 +140,7 @@ public async Task<IAsyncEnumerable<Flight>> ListByAirlineAsync(string airlineNam
.GetAsync(m => m.Name == airlineName);
if (airline != null)
{
matches = ListAsync(m => m.AirlineId == airline.Id);
matches = ListAsync(m => m.AirlineId == airline.Id, pageNumber, pageSize);
}

return matches;
Expand Down
Loading

0 comments on commit 4e648aa

Please sign in to comment.