1package clause
2
3// GroupBy group by clause
4type GroupBy struct {
5	Columns []Column
6	Having  []Expression
7}
8
9// Name from clause name
10func (groupBy GroupBy) Name() string {
11	return "GROUP BY"
12}
13
14// Build build group by clause
15func (groupBy GroupBy) Build(builder Builder) {
16	for idx, column := range groupBy.Columns {
17		if idx > 0 {
18			builder.WriteByte(',')
19		}
20
21		builder.WriteQuoted(column)
22	}
23
24	if len(groupBy.Having) > 0 {
25		builder.WriteString(" HAVING ")
26		Where{Exprs: groupBy.Having}.Build(builder)
27	}
28}
29
30// MergeClause merge group by clause
31func (groupBy GroupBy) MergeClause(clause *Clause) {
32	if v, ok := clause.Expression.(GroupBy); ok {
33		copiedColumns := make([]Column, len(v.Columns))
34		copy(copiedColumns, v.Columns)
35		groupBy.Columns = append(copiedColumns, groupBy.Columns...)
36
37		copiedHaving := make([]Expression, len(v.Having))
38		copy(copiedHaving, v.Having)
39		groupBy.Having = append(copiedHaving, groupBy.Having...)
40	}
41	clause.Expression = groupBy
42
43	if len(groupBy.Columns) == 0 {
44		clause.Name = ""
45	} else {
46		clause.Name = groupBy.Name()
47	}
48}
49