Skip to content

Commit

Permalink
Implement as-keyword support for all aggregates.
Browse files Browse the repository at this point in the history
  • Loading branch information
dgeelen-uipath committed Jul 2, 2021
1 parent a6ae753 commit 3d14ba8
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 20 deletions.
92 changes: 92 additions & 0 deletions QueryBuilder.Tests/AggregateTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,58 @@ public void AsAggregateEmpty()
Assert.Throws<ArgumentException>(() => new Query("A").AsAggregate("aggregate", new string[] { }));
}

[Fact]
public void AsAggregate()
{
var query = new Query("A").AsAggregate("aggregate", new[] { "Column" });

var c = Compile(query);

Assert.Equal("SELECT AGGREGATE([Column]) AS [aggregate] FROM [A]", c[EngineCodes.SqlServer]);
Assert.Equal("SELECT AGGREGATE(`Column`) AS `aggregate` FROM `A`", c[EngineCodes.MySql]);
Assert.Equal("SELECT AGGREGATE(\"Column\") AS \"aggregate\" FROM \"A\"", c[EngineCodes.PostgreSql]);
Assert.Equal("SELECT AGGREGATE(\"COLUMN\") AS \"AGGREGATE\" FROM \"A\"", c[EngineCodes.Firebird]);
}

[Fact]
public void AsAggregateAlias()
{
var query = new Query("A").AsAggregate("aggregate", new[] { "Column" }, "Alias");

var c = Compile(query);

Assert.Equal("SELECT AGGREGATE([Column]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
Assert.Equal("SELECT AGGREGATE(`Column`) AS `Alias` FROM `A`", c[EngineCodes.MySql]);
Assert.Equal("SELECT AGGREGATE(\"Column\") AS \"Alias\" FROM \"A\"", c[EngineCodes.PostgreSql]);
Assert.Equal("SELECT AGGREGATE(\"COLUMN\") AS \"ALIAS\" FROM \"A\"", c[EngineCodes.Firebird]);
}

[Fact]
public void AsAggregateMultipleColumns()
{
var query = new Query("A").AsAggregate("aggregate", new[] { "Column1", "Column2" });

var c = Compile(query);

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]);
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]);
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]);
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]);
}

[Fact]
public void AsAggregateMultipleColumnsAlias()
{
var query = new Query("A").AsAggregate("aggregate", new[] { "Column1", "Column2" }, "Alias");

var c = Compile(query);

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]);
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]);
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]);
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]);
}

[Fact]
public void Count()
{
Expand Down Expand Up @@ -119,6 +171,16 @@ public void Average()
Assert.Equal("SELECT AVG([TTL]) AS [avg] FROM [A]", c[EngineCodes.SqlServer]);
}

[Fact]
public void AverageAlias()
{
var query = new Query("A").AsAverageAs("TTL", "Alias");

var c = Compile(query);

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

[Fact]
public void Sum()
{
Expand All @@ -129,6 +191,16 @@ public void Sum()
Assert.Equal("SELECT SUM([PacketsDropped]) AS [sum] FROM [A]", c[EngineCodes.SqlServer]);
}

[Fact]
public void SumAlias()
{
var query = new Query("A").AsSumAs("PacketsDropped", "Alias");

var c = Compile(query);

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

[Fact]
public void Max()
{
Expand All @@ -139,6 +211,16 @@ public void Max()
Assert.Equal("SELECT MAX([LatencyMs]) AS [max] FROM [A]", c[EngineCodes.SqlServer]);
}

[Fact]
public void MaxAlias()
{
var query = new Query("A").AsMaxAs("LatencyMs", "Alias");

var c = Compile(query);

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

[Fact]
public void Min()
{
Expand All @@ -148,5 +230,15 @@ public void Min()

Assert.Equal("SELECT MIN([LatencyMs]) AS [min] FROM [A]", c[EngineCodes.SqlServer]);
}

[Fact]
public void MinAlias()
{
var query = new Query("A").AsMinAs("LatencyMs", "Alias");

var c = Compile(query);

Assert.Equal("SELECT MIN([LatencyMs]) AS [Alias] FROM [A]", c[EngineCodes.SqlServer]);
}
}
}
68 changes: 48 additions & 20 deletions QueryBuilder/Query.Aggregate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ namespace SqlKata
{
public partial class Query
{
/**********************************************************************
** Generic aggregate **
**********************************************************************/
public Query AsAggregate(string type, IEnumerable<string> columns, string alias = null)
{
if (columns.Count() == 0)
Expand All @@ -25,6 +28,9 @@ public Query AsAggregate(string type, IEnumerable<string> columns, string alias
return this;
}

/**********************************************************************
** Count **
**********************************************************************/
public Query AsCount(params string[] columns)
{
var cols = columns.ToList();
Expand All @@ -43,28 +49,50 @@ public Query AsCountAs(string column, string alias) =>
public Query AsCountAs(IEnumerable<string> columns, string alias) =>
AsAggregate("count", columns, alias);

public Query AsAvg(string column)
{
return AsAggregate("avg", new string[] { column });
}
public Query AsAverage(string column)
{
return AsAvg(column);
}

public Query AsSum(string column)
{
return AsAggregate("sum", new[] { column });
}
/**********************************************************************
** Average **
**********************************************************************/
public Query AsAvg(string column) =>
AsAverage(column);

public Query AsMax(string column)
{
return AsAggregate("max", new[] { column });
}
public Query AsAverage(string column) =>
AsAggregate("avg", new[] { column }, null);

public Query AsMin(string column)
{
return AsAggregate("min", new[] { column });
}
public Query AsAvgAs(string column, string alias) =>
AsAverageAs(column, alias);

public Query AsAverageAs(string column, string alias) =>
AsAggregate("avg", new[] { column }, alias);


/**********************************************************************
** Sum **
**********************************************************************/
public Query AsSum(string column) =>
AsAggregate("sum", new[] { column }, null);

public Query AsSumAs(string column, string alias = null) =>
AsAggregate("sum", new[] { column }, alias);


/**********************************************************************
** Maximum **
**********************************************************************/
public Query AsMax(string column) =>
AsAggregate("max", new[] { column }, null);

public Query AsMaxAs(string column, string alias = null) =>
AsAggregate("max", new[] { column }, alias);


/**********************************************************************
** Minimum **
**********************************************************************/
public Query AsMin(string column) =>
AsAggregate("min", new[] { column }, null);

public Query AsMinAs(string column, string alias = null) =>
AsAggregate("min", new[] { column }, alias);
}
}

0 comments on commit 3d14ba8

Please sign in to comment.