Skip to content

Commit 3d14ba8

Browse files
Implement as-keyword support for all aggregates.
1 parent a6ae753 commit 3d14ba8

File tree

2 files changed

+140
-20
lines changed

2 files changed

+140
-20
lines changed

QueryBuilder.Tests/AggregateTests.cs

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

16+
[Fact]
17+
public void AsAggregate()
18+
{
19+
var query = new Query("A").AsAggregate("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 AsAggregateAlias()
31+
{
32+
var query = new Query("A").AsAggregate("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 AsAggregateMultipleColumns()
44+
{
45+
var query = new Query("A").AsAggregate("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 AsAggregateMultipleColumnsAlias()
57+
{
58+
var query = new Query("A").AsAggregate("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 Count()
1870
{
@@ -119,6 +171,16 @@ public void Average()
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").AsAverageAs("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
{
@@ -129,6 +191,16 @@ public void Sum()
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").AsSumAs("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
{
@@ -139,6 +211,16 @@ public void Max()
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").AsMaxAs("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
{
@@ -148,5 +230,15 @@ public void Min()
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").AsMinAs("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/Query.Aggregate.cs

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ namespace SqlKata
55
{
66
public partial class Query
77
{
8+
/**********************************************************************
9+
** Generic aggregate **
10+
**********************************************************************/
811
public Query AsAggregate(string type, IEnumerable<string> columns, string alias = null)
912
{
1013
if (columns.Count() == 0)
@@ -25,6 +28,9 @@ public Query AsAggregate(string type, IEnumerable<string> columns, string alias
2528
return this;
2629
}
2730

31+
/**********************************************************************
32+
** Count **
33+
**********************************************************************/
2834
public Query AsCount(params string[] columns)
2935
{
3036
var cols = columns.ToList();
@@ -43,28 +49,50 @@ public Query AsCountAs(string column, string alias) =>
4349
public Query AsCountAs(IEnumerable<string> columns, string alias) =>
4450
AsAggregate("count", columns, alias);
4551

46-
public Query AsAvg(string column)
47-
{
48-
return AsAggregate("avg", new string[] { column });
49-
}
50-
public Query AsAverage(string column)
51-
{
52-
return AsAvg(column);
53-
}
5452

55-
public Query AsSum(string column)
56-
{
57-
return AsAggregate("sum", new[] { column });
58-
}
53+
/**********************************************************************
54+
** Average **
55+
**********************************************************************/
56+
public Query AsAvg(string column) =>
57+
AsAverage(column);
5958

60-
public Query AsMax(string column)
61-
{
62-
return AsAggregate("max", new[] { column });
63-
}
59+
public Query AsAverage(string column) =>
60+
AsAggregate("avg", new[] { column }, null);
6461

65-
public Query AsMin(string column)
66-
{
67-
return AsAggregate("min", new[] { column });
68-
}
62+
public Query AsAvgAs(string column, string alias) =>
63+
AsAverageAs(column, alias);
64+
65+
public Query AsAverageAs(string column, string alias) =>
66+
AsAggregate("avg", new[] { column }, alias);
67+
68+
69+
/**********************************************************************
70+
** Sum **
71+
**********************************************************************/
72+
public Query AsSum(string column) =>
73+
AsAggregate("sum", new[] { column }, null);
74+
75+
public Query AsSumAs(string column, string alias = null) =>
76+
AsAggregate("sum", new[] { column }, alias);
77+
78+
79+
/**********************************************************************
80+
** Maximum **
81+
**********************************************************************/
82+
public Query AsMax(string column) =>
83+
AsAggregate("max", new[] { column }, null);
84+
85+
public Query AsMaxAs(string column, string alias = null) =>
86+
AsAggregate("max", new[] { column }, alias);
87+
88+
89+
/**********************************************************************
90+
** Minimum **
91+
**********************************************************************/
92+
public Query AsMin(string column) =>
93+
AsAggregate("min", new[] { column }, null);
94+
95+
public Query AsMinAs(string column, string alias = null) =>
96+
AsAggregate("min", new[] { column }, alias);
6997
}
7098
}

0 commit comments

Comments
 (0)