clause.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 customize how to build clause
  9. type ClauseBuilder func(Clause, Builder)
  10. type Writer interface {
  11. WriteByte(byte) error
  12. WriteString(string) (int, error)
  13. }
  14. // Builder builder interface
  15. type Builder interface {
  16. Writer
  17. WriteQuoted(field interface{})
  18. AddVar(Writer, ...interface{})
  19. AddError(error) error
  20. }
  21. // Clause
  22. type Clause struct {
  23. Name string // WHERE
  24. BeforeExpression Expression
  25. AfterNameExpression Expression
  26. AfterExpression 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(c, builder)
  34. } else if c.Expression != nil {
  35. if c.BeforeExpression != nil {
  36. c.BeforeExpression.Build(builder)
  37. builder.WriteByte(' ')
  38. }
  39. if c.Name != "" {
  40. builder.WriteString(c.Name)
  41. builder.WriteByte(' ')
  42. }
  43. if c.AfterNameExpression != nil {
  44. c.AfterNameExpression.Build(builder)
  45. builder.WriteByte(' ')
  46. }
  47. c.Expression.Build(builder)
  48. if c.AfterExpression != nil {
  49. builder.WriteByte(' ')
  50. c.AfterExpression.Build(builder)
  51. }
  52. }
  53. }
  54. const (
  55. PrimaryKey string = "~~~py~~~" // primary key
  56. CurrentTable string = "~~~ct~~~" // current table
  57. Associations string = "~~~as~~~" // associations
  58. )
  59. var (
  60. currentTable = Table{Name: CurrentTable}
  61. PrimaryColumn = Column{Table: CurrentTable, Name: PrimaryKey}
  62. )
  63. // Column quote with name
  64. type Column struct {
  65. Table string
  66. Name string
  67. Alias string
  68. Raw bool
  69. }
  70. // Table quote with name
  71. type Table struct {
  72. Name string
  73. Alias string
  74. Raw bool
  75. }