order_by.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package clause
  2. type OrderByColumn struct {
  3. Column Column
  4. Desc bool
  5. Reorder bool
  6. }
  7. type OrderBy struct {
  8. Columns []OrderByColumn
  9. Expression Expression
  10. }
  11. // Name where clause name
  12. func (orderBy OrderBy) Name() string {
  13. return "ORDER BY"
  14. }
  15. // Build build where clause
  16. func (orderBy OrderBy) Build(builder Builder) {
  17. if orderBy.Expression != nil {
  18. orderBy.Expression.Build(builder)
  19. } else {
  20. for idx, column := range orderBy.Columns {
  21. if idx > 0 {
  22. builder.WriteByte(',')
  23. }
  24. builder.WriteQuoted(column.Column)
  25. if column.Desc {
  26. builder.WriteString(" DESC")
  27. }
  28. }
  29. }
  30. }
  31. // MergeClause merge order by clauses
  32. func (orderBy OrderBy) MergeClause(clause *Clause) {
  33. if v, ok := clause.Expression.(OrderBy); ok {
  34. for i := len(orderBy.Columns) - 1; i >= 0; i-- {
  35. if orderBy.Columns[i].Reorder {
  36. orderBy.Columns = orderBy.Columns[i:]
  37. clause.Expression = orderBy
  38. return
  39. }
  40. }
  41. copiedColumns := make([]OrderByColumn, len(v.Columns))
  42. copy(copiedColumns, v.Columns)
  43. orderBy.Columns = append(copiedColumns, orderBy.Columns...)
  44. }
  45. clause.Expression = orderBy
  46. }