from.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package clause
  2. // From from clause
  3. type From struct {
  4. Tables []Table
  5. Joins []Join
  6. }
  7. type JoinType string
  8. const (
  9. CrossJoin JoinType = "CROSS"
  10. InnerJoin = "INNER"
  11. LeftJoin = "LEFT"
  12. RightJoin = "RIGHT"
  13. )
  14. // Join join clause for from
  15. type Join struct {
  16. Type JoinType
  17. Table Table
  18. ON Where
  19. Using []string
  20. }
  21. // Name from clause name
  22. func (from From) Name() string {
  23. return "FROM"
  24. }
  25. // Build build from clause
  26. func (from From) Build(builder Builder) {
  27. if len(from.Tables) > 0 {
  28. for idx, table := range from.Tables {
  29. if idx > 0 {
  30. builder.WriteByte(',')
  31. }
  32. builder.WriteQuoted(table)
  33. }
  34. } else {
  35. builder.WriteQuoted(currentTable)
  36. }
  37. for _, join := range from.Joins {
  38. builder.WriteByte(' ')
  39. join.Build(builder)
  40. }
  41. }
  42. func (join Join) Build(builder Builder) {
  43. if join.Type != "" {
  44. builder.Write(string(join.Type))
  45. builder.WriteByte(' ')
  46. }
  47. builder.Write("JOIN ")
  48. builder.WriteQuoted(join.Table)
  49. if len(join.ON.Exprs) > 0 {
  50. builder.Write(" ON ")
  51. join.ON.Build(builder)
  52. } else if len(join.Using) > 0 {
  53. builder.Write(" USING (")
  54. for idx, c := range join.Using {
  55. if idx > 0 {
  56. builder.WriteByte(',')
  57. }
  58. builder.WriteQuoted(c)
  59. }
  60. builder.WriteByte(')')
  61. }
  62. }
  63. // MergeClause merge from clause
  64. func (from From) MergeClause(clause *Clause) {
  65. if v, ok := clause.Expression.(From); ok {
  66. from.Tables = append(v.Tables, from.Tables...)
  67. from.Joins = append(v.Joins, from.Joins...)
  68. }
  69. clause.Expression = from
  70. }