Skip to content

Commit b4922d0

Browse files
committed
add automatic SubQueries for performance in DQM
1 parent 8ab8940 commit b4922d0

8 files changed

Lines changed: 1754 additions & 1487 deletions

File tree

Signum.Engine/DynamicQuery/AutoDynamicQuery.cs

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public override ResultTable ExecuteQuery(QueryRequest request)
2727

2828
var result = query.TryPaginate(request.Pagination, request.SystemTime);
2929

30+
result = result.SelectManySubQueries();
31+
3032
if (inMemoryOrders != null)
3133
{
3234
result = result.OrderBy(inMemoryOrders);
@@ -44,7 +46,9 @@ public override async Task<ResultTable> ExecuteQueryAsync(QueryRequest request,
4446

4547
var result = await query.TryPaginateAsync(request.Pagination, request.SystemTime, token);
4648

47-
if(inMemoryOrders != null)
49+
result = result.SelectManySubQueries();
50+
51+
if (inMemoryOrders != null)
4852
{
4953
result = result.OrderBy(inMemoryOrders);
5054
}
@@ -92,29 +96,48 @@ private DQueryable<T> GetDQueryable(QueryRequest request, out List<Order>? inMem
9296
if (!request.Columns.Where(c => c is _EntityColumn).Any())
9397
request.Columns.Insert(0, new _EntityColumn(EntityColumnFactory().BuildColumnDescription(), QueryName));
9498

95-
var query = Query
96-
.ToDQueryable(GetQueryDescription())
97-
.SelectMany(request.Multiplications())
98-
.Where(request.Filters);
99-
100-
if (request.Pagination is Pagination.All)
99+
if (request.MultiplicationsInSubQueries())
101100
{
102-
var allColumns = request.Columns.Select(a => a.Token)
103-
.Concat(request.Orders.Select(a => a.Token))
104-
.Distinct()
105-
.Select(t => new Column(t, null)).ToList();
101+
var columnAndOrderTokens = request.Columns.Select(a => a.Token)
102+
.Concat(request.Orders.Select(a => a.Token))
103+
.Distinct()
104+
.ToHashSet();
106105

107-
inMemoryOrders = request.Orders.ToList();
106+
inMemoryOrders = request.Orders;
107+
108+
var query = Query
109+
.ToDQueryable(GetQueryDescription())
110+
.Where(request.Filters)
111+
.SelectWithSubQueries(columnAndOrderTokens);
108112

109-
return query.Select(allColumns);
113+
return query;
110114
}
111115
else
112116
{
113-
inMemoryOrders = null;
117+
var query = Query
118+
.ToDQueryable(GetQueryDescription())
119+
.SelectMany(request.Multiplications())
120+
.Where(request.Filters);
121+
122+
if (request.Pagination is Pagination.All)
123+
{
124+
var allColumns = request.Columns.Select(a => a.Token)
125+
.Concat(request.Orders.Select(a => a.Token))
126+
.Distinct()
127+
.Select(t => new Column(t, null)).ToList();
128+
129+
inMemoryOrders = request.Orders.ToList();
114130

115-
return query
116-
.OrderBy(request.Orders)
117-
.Select(request.Columns);
131+
return query.Select(allColumns);
132+
}
133+
else
134+
{
135+
inMemoryOrders = null;
136+
137+
return query
138+
.OrderBy(request.Orders)
139+
.Select(request.Columns);
140+
}
118141
}
119142
}
120143

0 commit comments

Comments
 (0)