From e84603b3fc0f337f3a211faac284baa6dc6577b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net> Date: Thu, 7 Aug 2014 10:26:10 -0500 Subject: [PATCH] sqlgen: Adding GROUP BY clause support. --- util/sqlgen/default.go | 12 ++++++++++ util/sqlgen/group_by.go | 19 ++++++++++++++++ util/sqlgen/main_test.go | 47 ++++++++++++++++++++++++++++++++++++++++ util/sqlgen/statement.go | 3 +++ util/sqlgen/template.go | 2 ++ 5 files changed, 83 insertions(+) create mode 100644 util/sqlgen/group_by.go diff --git a/util/sqlgen/default.go b/util/sqlgen/default.go index 116f9c8c..bd42b57e 100644 --- a/util/sqlgen/default.go +++ b/util/sqlgen/default.go @@ -44,6 +44,8 @@ const ( {{.Where}} + {{.GroupBy}} + {{.OrderBy}} {{if .Limit}} @@ -100,6 +102,14 @@ const ( defaultDropTableLayout = ` DROP TABLE {{.Table}} ` + + defaultGroupByColumnLayout = `{{.Column}}` + + defaultGroupByLayout = ` + {{if .GroupColumns}} + GROUP BY {{.GroupColumns}} + {{end}} + ` ) var defaultTemplate = &Template{ @@ -130,4 +140,6 @@ var defaultTemplate = &Template{ defaultDropDatabaseLayout, defaultDropTableLayout, defaultSelectCountLayout, + defaultGroupByColumnLayout, + defaultGroupByLayout, } diff --git a/util/sqlgen/group_by.go b/util/sqlgen/group_by.go new file mode 100644 index 00000000..54e7f03f --- /dev/null +++ b/util/sqlgen/group_by.go @@ -0,0 +1,19 @@ +package sqlgen + +type GroupBy Columns + +type groupBy_s struct { + GroupColumns string +} + +func (self GroupBy) Compile(layout *Template) string { + if len(self) > 0 { + + data := groupBy_s{ + GroupColumns: Columns(self).Compile(layout), + } + + return mustParse(layout.GroupByLayout, data) + } + return "" +} diff --git a/util/sqlgen/main_test.go b/util/sqlgen/main_test.go index 53b8669f..c30c851c 100644 --- a/util/sqlgen/main_test.go +++ b/util/sqlgen/main_test.go @@ -322,6 +322,53 @@ func TestSelectFieldsFromWithLimitOffset(t *testing.T) { } } +func TestGroupBy(t *testing.T) { + var s, e string + var stmt Statement + + // Simple GROUP BY + stmt = Statement{ + Type: SqlSelect, + Columns: Columns{ + {"foo"}, + {"bar"}, + {"baz"}, + }, + GroupBy: GroupBy{ + Column{"foo"}, + }, + Table: Table{"table_name"}, + } + + s = trim(stmt.Compile(defaultTemplate)) + e = `SELECT "foo", "bar", "baz" FROM "table_name" GROUP BY "foo"` + + if s != e { + t.Fatalf("Got: %s, Expecting: %s", s, e) + } + + stmt = Statement{ + Type: SqlSelect, + Columns: Columns{ + {"foo"}, + {"bar"}, + {"baz"}, + }, + GroupBy: GroupBy{ + Column{"foo"}, + Column{"bar"}, + }, + Table: Table{"table_name"}, + } + + s = trim(stmt.Compile(defaultTemplate)) + e = `SELECT "foo", "bar", "baz" FROM "table_name" GROUP BY "foo", "bar"` + + if s != e { + t.Fatalf("Got: %s, Expecting: %s", s, e) + } +} + func TestSelectFieldsFromWithOrderBy(t *testing.T) { var s, e string var stmt Statement diff --git a/util/sqlgen/statement.go b/util/sqlgen/statement.go index 71652a7f..a7a8fea4 100644 --- a/util/sqlgen/statement.go +++ b/util/sqlgen/statement.go @@ -10,6 +10,7 @@ type Statement struct { Values ColumnValues OrderBy + GroupBy Extra Where } @@ -23,6 +24,7 @@ type statement_s struct { Values string ColumnValues string OrderBy string + GroupBy string Extra string Where string } @@ -38,6 +40,7 @@ func (self *Statement) Compile(layout *Template) string { Values: self.Values.Compile(layout), ColumnValues: self.ColumnValues.Compile(layout), OrderBy: self.OrderBy.Compile(layout), + GroupBy: self.GroupBy.Compile(layout), Extra: string(self.Extra), Where: self.Where.Compile(layout), } diff --git a/util/sqlgen/template.go b/util/sqlgen/template.go index 25c7200f..4c5b6a85 100644 --- a/util/sqlgen/template.go +++ b/util/sqlgen/template.go @@ -28,4 +28,6 @@ type Template struct { DropDatabaseLayout string DropTableLayout string SelectCountLayout string + GroupByColumnLayout string + GroupByLayout string } -- GitLab