github.com/systematiccaos/gorm@v1.22.6/clause/group_by.go (about) 1 package clause 2 3 // GroupBy group by clause 4 type GroupBy struct { 5 Columns []Column 6 Having []Expression 7 } 8 9 // Name from clause name 10 func (groupBy GroupBy) Name() string { 11 return "GROUP BY" 12 } 13 14 // Build build group by clause 15 func (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 31 func (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 }