Skip to content

Commit b1c24fb

Browse files
authored
feat: support negative indexing (#336)
* feat: support negative indexing * fix: ensure db deleted before creating new db context * fix: split in memory db name
1 parent ae42344 commit b1c24fb

File tree

22 files changed

+399
-59
lines changed

22 files changed

+399
-59
lines changed

src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
<ItemGroup>
1919
<PackageReference Include="Mapster" Version="7.4.0" />
20-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.8" />
21-
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.8" />
20+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.9" />
21+
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.9" />
2222
</ItemGroup>
2323

2424
</Project>

src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/PageableQueryHandlerBase.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions;
2-
32
using Mapster;
43

54
namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions;
@@ -21,15 +20,21 @@ public async Task<PagedList<TView>> Handle(TQuery request, CancellationToken can
2120
request.OrderByString,
2221
out var orderBySegments);
2322

23+
var isNegativeIndexing = request.PagingParams?.PageIndex < 0;
24+
if (isNegativeIndexing && orderBySegments is { Count: > 0 })
25+
{
26+
orderBySegments = orderBySegments.Select(o => o with { IsDesc = !o.IsDesc }).ToList();
27+
}
28+
2429
var ordered = hasOrderBy && orderBySegments is { Count: > 0 }
2530
? queryable.OrderBy(orderBySegments)
26-
: DefaultOrderBy(request, queryable);
31+
: DefaultOrderBy(request, queryable, isNegativeIndexing);
2732

2833
var totalCount = 0;
2934
if (request.PagingParams != null)
3035
{
3136
totalCount = await CountAsync(request, queryable);
32-
if (request.PagingParams.PageSize == 0 || totalCount == 0)
37+
if (request.PagingParams.PageSize <= 0 || totalCount == 0)
3338
{
3439
// need count only or no available item, short circuit here.
3540
return new PagedList<TView>([], request.PagingParams, totalCount);
@@ -60,6 +65,17 @@ public async Task<PagedList<TView>> Handle(TQuery request, CancellationToken can
6065
/// <returns>Ordered <see cref="IQueryable{T}" />.</returns>
6166
protected abstract IQueryable<TEntity> DefaultOrderBy(TQuery query, IQueryable<TEntity> queryable);
6267

68+
/// <summary>
69+
/// The default reverse order by field, used when <see cref="OrderBySegment" /> is not present and pageIndex is negative.
70+
/// </summary>
71+
/// <param name="query">The query parameters.</param>
72+
/// <param name="queryable"><see cref="IQueryable{TEntity}" /> returned by <see cref="Filter" />.</param>
73+
/// <returns>Ordered <see cref="IQueryable{T}" />.</returns>
74+
protected virtual IQueryable<TEntity> DefaultReverseOrderBy(TQuery query, IQueryable<TEntity> queryable)
75+
{
76+
return DefaultOrderBy(query, queryable);
77+
}
78+
6379
/// <summary>
6480
/// Create queryable and apply filter, return filtered <see cref="IQueryable{T}" />.
6581
/// </summary>
@@ -95,4 +111,12 @@ protected virtual IQueryable<TView> ProjectToView(TQuery query, IQueryable<TEnti
95111
/// <param name="queryable">Projected <see cref="IQueryable{T}" />.</param>
96112
/// <returns>The query result.</returns>
97113
protected abstract Task<List<TView>> ToListAsync(TQuery query, IQueryable<TView> queryable);
114+
115+
private IQueryable<TEntity> DefaultOrderBy(
116+
TQuery query,
117+
IQueryable<TEntity> queryable,
118+
bool isNegativeIndexing)
119+
{
120+
return isNegativeIndexing ? DefaultReverseOrderBy(query, queryable) : DefaultOrderBy(query, queryable);
121+
}
98122
}

src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/PagingParamsModelBinder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ public Task BindModelAsync(ModelBindingContext bindingContext)
2929
}
3030

3131
var pageIndexSuccess = int.TryParse(pageIndexString, out var pageIndexNumber);
32-
if (pageIndexSuccess == false || pageIndexNumber <= 0)
32+
if (pageIndexSuccess == false)
3333
{
34-
bindingContext.ModelState.TryAddModelError(modelName, "PageIndex must be a positive number");
34+
bindingContext.ModelState.TryAddModelError(modelName, "PageIndex must be a number");
3535
bindingContext.Result = ModelBindingResult.Failed();
3636
return Task.CompletedTask;
3737
}
3838

3939
var pageSizeSuccess = int.TryParse(pageSizeString, out var pageSizeNumber);
4040
if (pageSizeSuccess == false || pageSizeNumber < 0)
4141
{
42-
bindingContext.ModelState.TryAddModelError(modelName, "PageIndex must be a positive number or 0");
42+
bindingContext.ModelState.TryAddModelError(modelName, "PageSize must be a positive number or 0");
4343
bindingContext.Result = ModelBindingResult.Failed();
4444
return Task.CompletedTask;
4545
}

src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
</ItemGroup>
1313

1414
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
15-
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.8" />
15+
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.9" />
1616
</ItemGroup>
1717

1818
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
19-
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.8" />
19+
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.9" />
2020
</ItemGroup>
2121

2222
<ItemGroup>

src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/PagingParams.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.ComponentModel.DataAnnotations;
1+
using System.ComponentModel.DataAnnotations;
22

33
using Microsoft.AspNetCore.Http;
44
using Microsoft.AspNetCore.Routing;
@@ -10,7 +10,7 @@ namespace Cnblogs.Architecture.Ddd.Infrastructure.Abstractions;
1010
/// </summary>
1111
/// <param name="PageIndex">页码。</param>
1212
/// <param name="PageSize">每页元素数。</param>
13-
public record PagingParams([Range(1, int.MaxValue)] int PageIndex, [Range(0, int.MaxValue)] int PageSize)
13+
public record PagingParams(int PageIndex, [Range(0, int.MaxValue)] int PageSize)
1414
{
1515
/// <inheritdoc />
1616
public override string ToString()

src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryPager.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static class QueryPager
1818
public static IQueryable<T> Paging<T>(this IQueryable<T> queryable, PagingParams pagingParams)
1919
{
2020
var (pageIndex, pageSize) = pagingParams;
21-
return queryable.Paging(pageIndex, pageSize);
21+
return queryable.Paging(pageIndex < 0 ? -pageIndex : pageIndex, pageSize < 0 ? -pageSize : pageSize);
2222
}
2323

2424
/// <summary>
@@ -53,4 +53,4 @@ public static IQueryable<T> Paging<T>(this IQueryable<T> queryable, int pageInde
5353
? queryable.Take(pageSize)
5454
: queryable.Skip((pageIndex - 1) * pageSize).Take(pageSize);
5555
}
56-
}
56+
}

src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryStringBuilder.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ public QueryStringBuilder(
4545
/// </summary>
4646
/// <param name="pagingParams">分页参数。</param>
4747
/// <returns></returns>
48-
public QueryStringBuilder AddPaging(PagingParams pagingParams)
49-
=> AddPaging(pagingParams.PageIndex, pagingParams.PageSize);
48+
public QueryStringBuilder AddPaging(PagingParams? pagingParams)
49+
=> AddPaging(pagingParams?.PageIndex, pagingParams?.PageSize);
5050

5151
/// <summary>
5252
/// 添加分页参数。
5353
/// </summary>
5454
/// <param name="pageIndex">页码。</param>
5555
/// <param name="pageSize">分页大小。</param>
56-
public QueryStringBuilder AddPaging(int pageIndex, int pageSize)
56+
public QueryStringBuilder AddPaging(int? pageIndex, int? pageSize)
5757
=> Add(nameof(pageIndex), pageIndex).Add(nameof(pageSize), pageSize);
5858

5959
/// <summary>
@@ -170,4 +170,4 @@ public override string ToString()
170170
{
171171
return Build();
172172
}
173-
}
173+
}

src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<ItemGroup>
1010
<ProjectReference Include="..\Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection\Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection.csproj"/>
1111
<ProjectReference Include="..\Cnblogs.Architecture.Ddd.Infrastructure.Abstractions\Cnblogs.Architecture.Ddd.Infrastructure.Abstractions.csproj"/>
12-
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.8" />
12+
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.9" />
1313
</ItemGroup>
1414

1515
</Project>

src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.Redis.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</ItemGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="StackExchange.Redis" Version="2.9.11" />
15+
<PackageReference Include="StackExchange.Redis" Version="2.9.25" />
1616
</ItemGroup>
1717

1818
</Project>

src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<ItemGroup>
1212
<PackageReference Include="Dapper" Version="2.1.66" />
13-
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.8" />
13+
<PackageReference Include="Microsoft.Extensions.Options" Version="9.0.9" />
1414
</ItemGroup>
1515

1616
</Project>

0 commit comments

Comments
 (0)