Skip to content

Commit 5991a60

Browse files
Implement as-keyword support for all aggregates.
1 parent ae2bcb2 commit 5991a60

File tree

5 files changed

+135
-28
lines changed

5 files changed

+135
-28
lines changed

QueryBuilder.Tests/AggregateTests.cs

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,58 @@ public void AggregateAsEmpty()
1313
Assert.Throws<ArgumentException>(() => new Query("A").AggregateAs("aggregate", new string[] { }));
1414
}
1515

16+
[Fact]
17+
public void AggregateAs()
18+
{
19+
var query = new Query("A").AggregateAs("aggregate", new[] { "Column" });
20+
21+
var c = Compile(query);
22+
23+
Assert.Equal("SELECT AGGREGATE([Column]) AS [aggregate] FROM [A]", c[EngineCodes.SqlServer]);
24+
Assert.Equal("SELECT AGGREGATE(`Column`) AS `aggregate` FROM `A`", c[EngineCodes.MySql]);
25+
Assert.Equal("SELECT AGGREGATE(\"Column\") AS \"aggregate\" FROM \"A\"", c[EngineCodes.PostgreSql]);
26+
Assert.Equal("SELECT AGGREGATE(\"COLUMN\") AS \"AGGREGATE\" FROM \"A\"", c[EngineCodes.Firebird]);
27+
}
28+
29+
[Fact]
30+
public void AggregateAsAlias()
31+
{
32+
var query = new Query("A").AggregateAs("aggregate", new[] { "Column" }, "Alias");
33+
34+
var c = Compile(query);
35+
36+
Assert.Equal("SELECT AGGREGATE([Column]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
37+
Assert.Equal("SELECT AGGREGATE(`Column`) AS `Alias` FROM `A`", c[EngineCodes.MySql]);
38+
Assert.Equal("SELECT AGGREGATE(\"Column\") AS \"Alias\" FROM \"A\"", c[EngineCodes.PostgreSql]);
39+
Assert.Equal("SELECT AGGREGATE(\"COLUMN\") AS \"ALIAS\" FROM \"A\"", c[EngineCodes.Firebird]);
40+
}
41+
42+
[Fact]
43+
public void AggregateAsMultipleColumns()
44+
{
45+
var query = new Query("A").AggregateAs("aggregate", new[] { "Column1", "Column2" });
46+
47+
var c = Compile(query);
48+
49+
Assert.Equal("SELECT AGGREGATE(*) AS [aggregate] FROM (SELECT 1 FROM [A] WHERE [Column1] IS NOT NULL AND [Column2] IS NOT NULL) AS [AggregateQuery]", c[EngineCodes.SqlServer]);
50+
Assert.Equal("SELECT AGGREGATE(*) AS `aggregate` FROM (SELECT 1 FROM `A` WHERE `Column1` IS NOT NULL AND `Column2` IS NOT NULL) AS `AggregateQuery`", c[EngineCodes.MySql]);
51+
Assert.Equal("SELECT AGGREGATE(*) AS \"AGGREGATE\" FROM (SELECT 1 FROM \"A\" WHERE \"COLUMN1\" IS NOT NULL AND \"COLUMN2\" IS NOT NULL) AS \"AGGREGATEQUERY\"", c[EngineCodes.Firebird]);
52+
Assert.Equal("SELECT AGGREGATE(*) AS \"aggregate\" FROM (SELECT 1 FROM \"A\" WHERE \"Column1\" IS NOT NULL AND \"Column2\" IS NOT NULL) AS \"AggregateQuery\"", c[EngineCodes.PostgreSql]);
53+
}
54+
55+
[Fact]
56+
public void AggregateAsMultipleColumnsAlias()
57+
{
58+
var query = new Query("A").AggregateAs("aggregate", new[] { "Column1", "Column2" }, "Alias");
59+
60+
var c = Compile(query);
61+
62+
Assert.Equal("SELECT AGGREGATE(*) AS [Alias] FROM (SELECT 1 FROM [A] WHERE [Column1] IS NOT NULL AND [Column2] IS NOT NULL) AS [AliasAggregateQuery]", c[EngineCodes.SqlServer]);
63+
Assert.Equal("SELECT AGGREGATE(*) AS `Alias` FROM (SELECT 1 FROM `A` WHERE `Column1` IS NOT NULL AND `Column2` IS NOT NULL) AS `AliasAggregateQuery`", c[EngineCodes.MySql]);
64+
Assert.Equal("SELECT AGGREGATE(*) AS \"ALIAS\" FROM (SELECT 1 FROM \"A\" WHERE \"COLUMN1\" IS NOT NULL AND \"COLUMN2\" IS NOT NULL) AS \"ALIASAGGREGATEQUERY\"", c[EngineCodes.Firebird]);
65+
Assert.Equal("SELECT AGGREGATE(*) AS \"Alias\" FROM (SELECT 1 FROM \"A\" WHERE \"Column1\" IS NOT NULL AND \"Column2\" IS NOT NULL) AS \"AliasAggregateQuery\"", c[EngineCodes.PostgreSql]);
66+
}
67+
1668
[Fact]
1769
public void CountAs()
1870
{
@@ -112,41 +164,81 @@ public void DistinctCountMultipleColumns()
112164
[Fact]
113165
public void Average()
114166
{
115-
var query = new Query("A").AsAverage("TTL");
167+
var query = new Query("A").AverageAs("TTL");
116168

117169
var c = Compile(query);
118170

119171
Assert.Equal("SELECT AVG([TTL]) AS [avg] FROM [A]", c[EngineCodes.SqlServer]);
120172
}
121173

174+
[Fact]
175+
public void AverageAlias()
176+
{
177+
var query = new Query("A").AverageAs("TTL", "Alias");
178+
179+
var c = Compile(query);
180+
181+
Assert.Equal("SELECT AVG([TTL]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
182+
}
183+
122184
[Fact]
123185
public void Sum()
124186
{
125-
var query = new Query("A").AsSum("PacketsDropped");
187+
var query = new Query("A").SumAs("PacketsDropped");
126188

127189
var c = Compile(query);
128190

129191
Assert.Equal("SELECT SUM([PacketsDropped]) AS [sum] FROM [A]", c[EngineCodes.SqlServer]);
130192
}
131193

194+
[Fact]
195+
public void SumAlias()
196+
{
197+
var query = new Query("A").SumAs("PacketsDropped", "Alias");
198+
199+
var c = Compile(query);
200+
201+
Assert.Equal("SELECT SUM([PacketsDropped]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
202+
}
203+
132204
[Fact]
133205
public void Max()
134206
{
135-
var query = new Query("A").AsMax("LatencyMs");
207+
var query = new Query("A").MaxAs("LatencyMs");
136208

137209
var c = Compile(query);
138210

139211
Assert.Equal("SELECT MAX([LatencyMs]) AS [max] FROM [A]", c[EngineCodes.SqlServer]);
140212
}
141213

214+
[Fact]
215+
public void MaxAlias()
216+
{
217+
var query = new Query("A").MaxAs("LatencyMs", "Alias");
218+
219+
var c = Compile(query);
220+
221+
Assert.Equal("SELECT MAX([LatencyMs]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
222+
}
223+
142224
[Fact]
143225
public void Min()
144226
{
145-
var query = new Query("A").AsMin("LatencyMs");
227+
var query = new Query("A").MinAs("LatencyMs");
146228

147229
var c = Compile(query);
148230

149231
Assert.Equal("SELECT MIN([LatencyMs]) AS [min] FROM [A]", c[EngineCodes.SqlServer]);
150232
}
233+
234+
[Fact]
235+
public void MinAlias()
236+
{
237+
var query = new Query("A").MinAs("LatencyMs", "Alias");
238+
239+
var c = Compile(query);
240+
241+
Assert.Equal("SELECT MIN([LatencyMs]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
242+
}
151243
}
152244
}

QueryBuilder.Tests/DefineTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void Test_Define_SubQuery()
2929
{
3030

3131
var subquery = new Query("Products")
32-
.AsAverage("unitprice")
32+
.AverageAs("unitprice")
3333
.Define("@UnitsInSt", 10)
3434
.Where("UnitsInStock", ">", Variable("@UnitsInSt"));
3535

QueryBuilder/Query.Aggregate.cs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,9 @@ namespace SqlKata
55
{
66
public partial class Query
77
{
8-
public Query AsAggregate(string type, string[] columns = null)
9-
{
10-
return AggregateAs(
11-
type,
12-
columns ?? new string[] { },
13-
null // old interface always uses 'type' as alias name
14-
);
15-
}
16-
8+
/**********************************************************************
9+
** Generic aggregate **
10+
**********************************************************************/
1711
public Query AggregateAs(string type, IEnumerable<string> columns, string alias = null)
1812
{
1913
if (columns.Count() == 0)
@@ -34,6 +28,10 @@ public Query AggregateAs(string type, IEnumerable<string> columns, string alias
3428
return this;
3529
}
3630

31+
32+
/**********************************************************************
33+
** Count **
34+
**********************************************************************/
3735
public Query CountAs(string column = null, string alias = null)
3836
{
3937
return CountAs(column != null ? new[] { column } : new string[] { }, alias);
@@ -44,28 +42,45 @@ public Query CountAs(IEnumerable<string> columns, string alias = null)
4442
return AggregateAs("count", columns.Count() == 0 ? new[] { "*" } : columns, alias);
4543
}
4644

47-
public Query AsAvg(string column)
45+
46+
/**********************************************************************
47+
** Average **
48+
**********************************************************************/
49+
public Query AvgAs(string column, string alias = null)
4850
{
49-
return AsAggregate("avg", new string[] { column });
51+
return AggregateAs("avg", new[] { column }, alias);
5052
}
51-
public Query AsAverage(string column)
53+
54+
public Query AverageAs(string column, string alias = null)
5255
{
53-
return AsAvg(column);
56+
return AvgAs(column, alias);
5457
}
5558

56-
public Query AsSum(string column)
59+
60+
/**********************************************************************
61+
** Sum **
62+
**********************************************************************/
63+
public Query SumAs(string column, string alias = null)
5764
{
58-
return AsAggregate("sum", new[] { column });
65+
return AggregateAs("sum", new[] { column }, alias);
5966
}
6067

61-
public Query AsMax(string column)
68+
69+
/**********************************************************************
70+
** Maximum **
71+
**********************************************************************/
72+
public Query MaxAs(string column, string alias = null)
6273
{
63-
return AsAggregate("max", new[] { column });
74+
return AggregateAs("max", new[] { column }, alias);
6475
}
6576

66-
public Query AsMin(string column)
77+
78+
/**********************************************************************
79+
** Minimum **
80+
**********************************************************************/
81+
public Query MinAs(string column, string alias = null)
6782
{
68-
return AsAggregate("min", new[] { column });
83+
return AggregateAs("min", new[] { column }, alias);
6984
}
7085
}
7186
}

SqlKata.Execution/Query.Extensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,13 @@ public static T Aggregate<T>(this Query query, string aggregateOperation, string
279279
{
280280
var db = CreateQueryFactory(query);
281281

282-
return db.ExecuteScalar<T>(query.AsAggregate(aggregateOperation, columns), transaction, timeout);
282+
return db.ExecuteScalar<T>(query.AggregateAs(aggregateOperation, columns), transaction, timeout);
283283
}
284284

285285
public static async Task<T> AggregateAsync<T>(this Query query, string aggregateOperation, string[] columns, IDbTransaction transaction = null, int? timeout = null, CancellationToken cancellationToken = default)
286286
{
287287
var db = CreateQueryFactory(query);
288-
return await db.ExecuteScalarAsync<T>(query.AsAggregate(aggregateOperation, columns), transaction, timeout, cancellationToken);
288+
return await db.ExecuteScalarAsync<T>(query.AggregateAs(aggregateOperation, columns), transaction, timeout, cancellationToken);
289289
}
290290

291291
public static T Count<T>(this Query query, string[] columns = null, IDbTransaction transaction = null, int? timeout = null)

SqlKata.Execution/QueryFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ public T Aggregate<T>(
380380
int? timeout = null
381381
)
382382
{
383-
return this.ExecuteScalar<T>(query.AsAggregate(aggregateOperation, columns), transaction, timeout ?? this.QueryTimeout);
383+
return this.ExecuteScalar<T>(query.AggregateAs(aggregateOperation, columns), transaction, timeout ?? this.QueryTimeout);
384384
}
385385

386386
public async Task<T> AggregateAsync<T>(
@@ -393,7 +393,7 @@ public async Task<T> AggregateAsync<T>(
393393
)
394394
{
395395
return await this.ExecuteScalarAsync<T>(
396-
query.AsAggregate(aggregateOperation, columns),
396+
query.AggregateAs(aggregateOperation, columns),
397397
transaction,
398398
timeout,
399399
cancellationToken

0 commit comments

Comments
 (0)