clause.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package clause
  2. // Interface clause interface
  3. type Interface interface {
  4. Name() string
  5. Build(Builder)
  6. MergeClause(*Clause)
  7. }
  8. // ClauseBuilder clause builder, allows to custmize how to build clause
  9. type ClauseBuilder interface {
  10. Build(Clause, Builder)
  11. }
  12. // Builder builder interface
  13. type Builder interface {
  14. WriteByte(byte) error
  15. Write(sql ...string) error
  16. WriteQuoted(field interface{}) error
  17. AddVar(vars ...interface{}) string
  18. Quote(field interface{}) string
  19. }
  20. // Clause
  21. type Clause struct {
  22. Name string // WHERE
  23. Priority float64
  24. BeforeExpressions []Expression
  25. AfterNameExpressions []Expression
  26. AfterExpressions []Expression
  27. Expression Expression
  28. Builder ClauseBuilder
  29. }
  30. // Build build clause
  31. func (c Clause) Build(builder Builder) {
  32. if c.Builder != nil {
  33. c.Builder.Build(c, builder)
  34. } else {
  35. builders := c.BeforeExpressions
  36. if c.Name != "" {
  37. builders = append(builders, Expr{SQL: c.Name})
  38. }
  39. builders = append(builders, c.AfterNameExpressions...)
  40. if c.Expression != nil {
  41. builders = append(builders, c.Expression)
  42. }
  43. for idx, expr := range append(builders, c.AfterExpressions...) {
  44. if idx != 0 {
  45. builder.WriteByte(' ')
  46. }
  47. expr.Build(builder)
  48. }
  49. }
  50. }
  51. const (
  52. PrimaryKey string = "@@@priamry_key@@@"
  53. CurrentTable string = "@@@table@@@"
  54. )
  55. var (
  56. currentTable = Table{Name: CurrentTable}
  57. PrimaryColumn = Column{Table: CurrentTable, Name: PrimaryKey}
  58. )
  59. // Column quote with name
  60. type Column struct {
  61. Table string
  62. Name string
  63. Alias string
  64. Raw bool
  65. }
  66. // Table quote with name
  67. type Table struct {
  68. Name string
  69. Alias string
  70. Raw bool
  71. }