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  }