Skip to content

Commit b7df27a

Browse files
committed
Merge remote-tracking branch 'origin/development' into development
2 parents 0faa58f + ed3e4af commit b7df27a

File tree

7 files changed

+52
-32
lines changed

7 files changed

+52
-32
lines changed

Readme.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ var pagedResponse = await dbContext.Books
105105

106106
Use ColumnDistinctValuesAsync to get distinct values of a specific column:
107107
```csharp
108-
public static async Task<PagedResponse<object>> ColumnDistinctValuesAsync<TEntity>(
109-
this IQueryable<TEntity> query, ColumnDistinctValueQueryModel model,
108+
public static async Task<CursoredResponse<object>> ColumnDistinctValuesAsync<TEntity>(
109+
this IQueryable<TEntity> query, ColumnDistinctValueCursoredQueryModel model,
110110
Func<byte[], string>? decryptor = default, CancellationToken cancellationToken = default)
111111

112112
```
113113
Example Usage:
114114
```csharp
115115
var distinctValues = await dbContext.Books
116-
.ColumnDistinctValuesAsync(new ColumnDistinctValueQueryModel { PropertyName = "Title" }, cancellationToken);
116+
.ColumnDistinctValuesAsync(new ColumnDistinctValueCursoredQueryModel { PropertyName = "Title", PageSize=50, Filter="Title>abc" }, cancellationToken);
117117
```
118118

119119
Use AggregateAsync to perform aggregation operations on your data:

src/GridifyExtensions/Extensions/QueryableExtensions.cs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
using Gridify;
1+
using BaseConverter;
2+
using Gridify;
23
using GridifyExtensions.Enums;
34
using GridifyExtensions.Models;
45
using Microsoft.EntityFrameworkCore;
5-
using System.Collections;
66
using System.Linq.Expressions;
77

88
namespace GridifyExtensions.Extensions;
@@ -17,7 +17,7 @@ public static async Task<PagedResponse<TDto>> FilterOrderAndGetPagedAsync<TEntit
1717
where TEntity : class
1818
{
1919
var mapper = EntityGridifyMapperByType[typeof(TEntity)] as FilterMapper<TEntity>;
20-
20+
2121
model.OrderBy ??= mapper!.GetDefaultOrderExpression();
2222

2323
query = query.ApplyFilteringAndOrdering(model, mapper);
@@ -75,13 +75,24 @@ public static async Task<PagedResponse<object>> ColumnDistinctValuesAsync<TEntit
7575

7676
if (!mapper!.IsEncrypted(model.PropertyName))
7777
{
78-
79-
return await query
78+
var result = await query
8079
.ApplyFiltering(model, mapper)
8180
.ApplySelect(model.PropertyName, mapper)
8281
.Distinct()
83-
.OrderBy(x => x ?? 0)
82+
.OrderBy(x => x)
8483
.GetPagedAsync(model, cancellationToken);
84+
85+
if (mapper!.NeedBase36Conversion(model.PropertyName))
86+
{
87+
return result with
88+
{
89+
Data = result.Data
90+
.Select(x => PandaBaseConverter.Base10ToBase36((long)x) as object)
91+
.ToList()
92+
};
93+
}
94+
95+
return result;
8596
}
8697

8798
var item = await query
@@ -97,25 +108,31 @@ public static async Task<PagedResponse<object>> ColumnDistinctValuesAsync<TEntit
97108
var decryptedItem = decryptor!((byte[])item);
98109
return new PagedResponse<object>([decryptedItem], 1, 1, 1);
99110
}
100-
111+
101112
public static async Task<CursoredResponse<object>> ColumnDistinctValuesAsync<TEntity>(this IQueryable<TEntity> query,
102113
ColumnDistinctValueCursoredQueryModel model, Func<byte[], string>? decryptor = default,
103114
CancellationToken cancellationToken = default)
104115
{
105116
var mapper = EntityGridifyMapperByType[typeof(TEntity)] as FilterMapper<TEntity>;
106117

107-
var gridifyModel = ColumnDistinctValueCursoredQueryModel.ToGridifyQueryModel(model);
118+
var gridifyModel = model.ToGridifyQueryModel();
108119

109120
if (!mapper!.IsEncrypted(model.PropertyName))
110121
{
111-
112122
var result = await query
113123
.ApplyFiltering(gridifyModel, mapper)
114124
.ApplySelect(model.PropertyName, mapper)
115125
.Distinct()
116-
.OrderBy(x => x ?? 0)
126+
.OrderBy(x => x)
127+
.Take(model.PageSize)
117128
.ToListAsync(cancellationToken: cancellationToken);
118-
129+
130+
if (mapper!.NeedBase36Conversion(model.PropertyName))
131+
{
132+
result = result.Select(x => PandaBaseConverter.Base10ToBase36((long)x) as object)
133+
.ToList();
134+
}
135+
119136
return new CursoredResponse<object>(result, model.PageSize);
120137
}
121138

src/GridifyExtensions/Extensions/WebApplicationBuilderExtensions.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Gridify;
1+
using BaseConverter;
2+
using Gridify;
23
using GridifyExtensions.Models;
34
using Microsoft.AspNetCore.Builder;
45
using System.Reflection;
@@ -7,8 +8,10 @@ namespace GridifyExtensions.Extensions;
78

89
public static class WebApplicationBuilderExtensions
910
{
10-
public static WebApplicationBuilder AddGridify(this WebApplicationBuilder builder, params Assembly[] assemblies)
11+
public static WebApplicationBuilder AddGridify(this WebApplicationBuilder builder, string base36Chars, params Assembly[] assemblies)
1112
{
13+
PandaBaseConverter.Base36Chars = base36Chars;
14+
1215
if (assemblies.Length == 0)
1316
{
1417
assemblies = [Assembly.GetCallingAssembly()];

src/GridifyExtensions/GridifyExtensions.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
<PackageReadmeFile>Readme.md</PackageReadmeFile>
99
<Authors>Pandatech</Authors>
1010
<Copyright>MIT</Copyright>
11-
<Version>1.3.2</Version>
11+
<Version>1.3.7</Version>
1212
<PackageId>Pandatech.GridifyExtensions</PackageId>
1313
<Title>Pandatech.Gridify.Extensions</Title>
1414
<PackageTags>Pandatech, library, Gridify, Pagination, Filters</PackageTags>
1515
<Description>Pandatech.Gridify.Extensions simplifies and extends the functionality of the Gridify NuGet package. It provides additional extension methods and functionality to streamline data filtering and pagination, making it more intuitive and powerful to use in .NET applications. Our enhancements ensure more flexibility, reduce boilerplate code, and improve overall developer productivity when working with Gridify.</Description>
1616
<RepositoryUrl>https://github.com/PandaTechAM/be-lib-gridify-extensions</RepositoryUrl>
17-
<PackageReleaseNotes>Cursored implementation for column distinct values</PackageReleaseNotes>
17+
<PackageReleaseNotes>Readme updated</PackageReleaseNotes>
1818
</PropertyGroup>
1919

2020
<ItemGroup>

src/GridifyExtensions/Models/ColumnDistinctValueCursoredQueryModel.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ public required int PageSize
2323
}
2424

2525
public required string PropertyName { get; set; }
26-
public string Filter { get; set; } = null!;
26+
public string? Filter { get; set; }
2727

28-
public static GridifyQueryModel ToGridifyQueryModel(ColumnDistinctValueCursoredQueryModel model)
28+
public GridifyQueryModel ToGridifyQueryModel()
2929
{
3030
return new GridifyQueryModel
3131
{
3232
Page = 1,
33-
PageSize = model.PageSize,
34-
Filter = model.Filter
33+
PageSize = PageSize,
34+
Filter = Filter
3535
};
3636
}
3737
}

src/GridifyExtensions/Models/FilterMapper.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@
44

55
namespace GridifyExtensions.Models;
66

7-
87
public class FilterMapper<T> : GridifyMapper<T>, IOrderThenBy
98
{
109
internal const string Desc = " desc";
1110
internal const string Separator = ", ";
1211

1312
private string _defaultOrderExpression = string.Empty;
1413
private readonly HashSet<string> _encryptedColumns = [];
15-
private readonly HashSet<string> _arrayColumns = [];
14+
private readonly HashSet<string> _needBase36ConversionColumns = [];
1615

17-
internal bool IsArray(string column) => _arrayColumns.Contains(column);
16+
internal bool NeedBase36Conversion(string column) => _needBase36ConversionColumns.Contains(column);
1817
internal bool IsEncrypted(string column) => _encryptedColumns.Contains(column);
1918

2019
internal string GetDefaultOrderExpression() => _defaultOrderExpression;
@@ -50,16 +49,16 @@ public IGridifyMapper<T> AddMap(string from,
5049
Func<string, object>? convertor = null,
5150
bool overrideIfExists = true,
5251
bool isEncrypted = false,
53-
bool isArray = false)
52+
bool needBase36Conversion = false)
5453
{
5554
if (isEncrypted)
5655
{
5756
_encryptedColumns.Add(from);
5857
}
5958

60-
if (isArray)
59+
if (needBase36Conversion)
6160
{
62-
_arrayColumns.Add(from);
61+
_needBase36ConversionColumns.Add(from);
6362
}
6463

6564
return base.AddMap(from, to, convertor, overrideIfExists);
@@ -70,16 +69,16 @@ public IGridifyMapper<T> AddMap(string from,
7069
Func<string, object>? convertor = null,
7170
bool overrideIfExists = true,
7271
bool isEncrypted = false,
73-
bool isArray = false)
72+
bool needBase36Conversion = false)
7473
{
7574
if (isEncrypted)
7675
{
7776
_encryptedColumns.Add(from);
7877
}
7978

80-
if (isArray)
79+
if (needBase36Conversion)
8180
{
82-
_arrayColumns.Add(from);
81+
_needBase36ConversionColumns.Add(from);
8382
}
8483

8584
return base.AddMap(from, to, convertor, overrideIfExists);

test/GridifyExtensions.Demo/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Reflection;
33
using GridifyExtensions.Models;
44
using Microsoft.AspNetCore.Mvc;
5+
using BaseConverter;
56

67
var builder = WebApplication.CreateBuilder(args);
78

@@ -10,7 +11,7 @@
1011
builder.Services.AddSwaggerGen();
1112
builder.Services.AddControllers();
1213

13-
builder.AddGridify(Assembly.GetExecutingAssembly());
14+
builder.AddGridify(PandaBaseConverter.Base36Chars, Assembly.GetExecutingAssembly());
1415

1516
var app = builder.Build();
1617

0 commit comments

Comments
 (0)