From 3d14ba81210d17d5da6a9da582f1467cf54cab87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Geelen?= Date: Fri, 2 Jul 2021 14:24:37 +0200 Subject: [PATCH] Implement as-keyword support for all aggregates. --- QueryBuilder.Tests/AggregateTests.cs | 92 ++++++++++++++++++++++++++++ QueryBuilder/Query.Aggregate.cs | 68 ++++++++++++++------ 2 files changed, 140 insertions(+), 20 deletions(-) diff --git a/QueryBuilder.Tests/AggregateTests.cs b/QueryBuilder.Tests/AggregateTests.cs index 22c2f1e1..5414547c 100644 --- a/QueryBuilder.Tests/AggregateTests.cs +++ b/QueryBuilder.Tests/AggregateTests.cs @@ -13,6 +13,58 @@ public void AsAggregateEmpty() Assert.Throws(() => 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() { @@ -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() { @@ -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() { @@ -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() { @@ -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]); + } } } diff --git a/QueryBuilder/Query.Aggregate.cs b/QueryBuilder/Query.Aggregate.cs index 15ea9a31..6d881102 100644 --- a/QueryBuilder/Query.Aggregate.cs +++ b/QueryBuilder/Query.Aggregate.cs @@ -5,6 +5,9 @@ namespace SqlKata { public partial class Query { + /********************************************************************** + ** Generic aggregate ** + **********************************************************************/ public Query AsAggregate(string type, IEnumerable columns, string alias = null) { if (columns.Count() == 0) @@ -25,6 +28,9 @@ public Query AsAggregate(string type, IEnumerable columns, string alias return this; } + /********************************************************************** + ** Count ** + **********************************************************************/ public Query AsCount(params string[] columns) { var cols = columns.ToList(); @@ -43,28 +49,50 @@ public Query AsCountAs(string column, string alias) => public Query AsCountAs(IEnumerable 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); } }