package clause

// GroupBy group by clause
type GroupBy struct {
	Columns []Column
	Having  []Expression
}

// Name from clause name
func ( GroupBy) () string {
	return "GROUP BY"
}

// Build build group by clause
func ( GroupBy) ( Builder) {
	for ,  := range .Columns {
		if  > 0 {
			.WriteByte(',')
		}

		.WriteQuoted()
	}

	if len(.Having) > 0 {
		.WriteString(" HAVING ")
		Where{Exprs: .Having}.Build()
	}
}

// MergeClause merge group by clause
func ( GroupBy) ( *Clause) {
	if ,  := .Expression.(GroupBy);  {
		 := make([]Column, len(.Columns))
		copy(, .Columns)
		.Columns = append(, .Columns...)

		 := make([]Expression, len(.Having))
		copy(, .Having)
		.Having = append(, .Having...)
	}
	.Expression = 

	if len(.Columns) == 0 {
		.Name = ""
	} else {
		.Name = .Name()
	}
}