group_by.go 1.0 KB

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