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