expression.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package clause
  2. import (
  3. "strings"
  4. )
  5. // Expression expression interface
  6. type Expression interface {
  7. Build(builder Builder)
  8. }
  9. // NegationExpressionBuilder negation expression builder
  10. type NegationExpressionBuilder interface {
  11. NegationBuild(builder Builder)
  12. }
  13. // Expr raw expression
  14. type Expr struct {
  15. SQL string
  16. Vars []interface{}
  17. }
  18. // Build build raw expression
  19. func (expr Expr) Build(builder Builder) {
  20. sql := expr.SQL
  21. for _, v := range expr.Vars {
  22. sql = strings.Replace(sql, "?", builder.AddVar(v), 1)
  23. }
  24. builder.Write(sql)
  25. }
  26. // IN Whether a value is within a set of values
  27. type IN struct {
  28. Column interface{}
  29. Values []interface{}
  30. }
  31. func (in IN) Build(builder Builder) {
  32. builder.WriteQuoted(in.Column)
  33. switch len(in.Values) {
  34. case 0:
  35. builder.Write(" IN (NULL)")
  36. case 1:
  37. builder.Write(" = ", builder.AddVar(in.Values...))
  38. default:
  39. builder.Write(" IN (", builder.AddVar(in.Values...), ")")
  40. }
  41. }
  42. func (in IN) NegationBuild(builder Builder) {
  43. switch len(in.Values) {
  44. case 0:
  45. case 1:
  46. builder.Write(" <> ", builder.AddVar(in.Values...))
  47. default:
  48. builder.Write(" NOT IN (", builder.AddVar(in.Values...), ")")
  49. }
  50. }
  51. // Eq equal to for where
  52. type Eq struct {
  53. Column interface{}
  54. Value interface{}
  55. }
  56. func (eq Eq) Build(builder Builder) {
  57. builder.WriteQuoted(eq.Column)
  58. if eq.Value == nil {
  59. builder.Write(" IS NULL")
  60. } else {
  61. builder.Write(" = ", builder.AddVar(eq.Value))
  62. }
  63. }
  64. func (eq Eq) NegationBuild(builder Builder) {
  65. Neq{eq.Column, eq.Value}.Build(builder)
  66. }
  67. // Neq not equal to for where
  68. type Neq Eq
  69. func (neq Neq) Build(builder Builder) {
  70. builder.WriteQuoted(neq.Column)
  71. if neq.Value == nil {
  72. builder.Write(" IS NOT NULL")
  73. } else {
  74. builder.Write(" <> ", builder.AddVar(neq.Value))
  75. }
  76. }
  77. func (neq Neq) NegationBuild(builder Builder) {
  78. Eq{neq.Column, neq.Value}.Build(builder)
  79. }
  80. // Gt greater than for where
  81. type Gt Eq
  82. func (gt Gt) Build(builder Builder) {
  83. builder.WriteQuoted(gt.Column)
  84. builder.Write(" > ", builder.AddVar(gt.Value))
  85. }
  86. func (gt Gt) NegationBuild(builder Builder) {
  87. Lte{gt.Column, gt.Value}.Build(builder)
  88. }
  89. // Gte greater than or equal to for where
  90. type Gte Eq
  91. func (gte Gte) Build(builder Builder) {
  92. builder.WriteQuoted(gte.Column)
  93. builder.Write(" >= ", builder.AddVar(gte.Value))
  94. }
  95. func (gte Gte) NegationBuild(builder Builder) {
  96. Lt{gte.Column, gte.Value}.Build(builder)
  97. }
  98. // Lt less than for where
  99. type Lt Eq
  100. func (lt Lt) Build(builder Builder) {
  101. builder.WriteQuoted(lt.Column)
  102. builder.Write(" < ", builder.AddVar(lt.Value))
  103. }
  104. func (lt Lt) NegationBuild(builder Builder) {
  105. Gte{lt.Column, lt.Value}.Build(builder)
  106. }
  107. // Lte less than or equal to for where
  108. type Lte Eq
  109. func (lte Lte) Build(builder Builder) {
  110. builder.WriteQuoted(lte.Column)
  111. builder.Write(" <= ", builder.AddVar(lte.Value))
  112. }
  113. func (lte Lte) NegationBuild(builder Builder) {
  114. Gt{lte.Column, lte.Value}.Build(builder)
  115. }
  116. // Like whether string matches regular expression
  117. type Like Eq
  118. func (like Like) Build(builder Builder) {
  119. builder.WriteQuoted(like.Column)
  120. builder.Write(" LIKE ", builder.AddVar(like.Value))
  121. }
  122. func (like Like) NegationBuild(builder Builder) {
  123. builder.WriteQuoted(like.Column)
  124. builder.Write(" NOT LIKE ", builder.AddVar(like.Value))
  125. }
  126. // Map
  127. type Map map[interface{}]interface{}
  128. func (m Map) Build(builder Builder) {
  129. // TODO
  130. }
  131. func (m Map) NegationBuild(builder Builder) {
  132. // TODO
  133. }