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