operators.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package clause
  2. import "strings"
  3. type AddConditions []Interface
  4. func (cs AddConditions) Build(builder BuilderInterface) {
  5. for idx, c := range cs {
  6. if idx > 0 {
  7. builder.Write(" AND ")
  8. }
  9. c.Build(builder)
  10. }
  11. }
  12. type ORConditions []Interface
  13. func (cs ORConditions) Build(builder BuilderInterface) {
  14. for idx, c := range cs {
  15. if idx > 0 {
  16. builder.Write(" OR ")
  17. }
  18. c.Build(builder)
  19. }
  20. }
  21. type NotConditions []Interface
  22. func (cs NotConditions) Build(builder BuilderInterface) {
  23. for idx, c := range cs {
  24. if idx > 0 {
  25. builder.Write(" AND ")
  26. }
  27. if negationBuilder, ok := c.(NegationBuilder); ok {
  28. negationBuilder.NegationBuild(builder)
  29. } else {
  30. builder.Write(" NOT ")
  31. c.Build(builder)
  32. }
  33. }
  34. }
  35. // Raw raw sql for where
  36. type Raw struct {
  37. SQL string
  38. Values []interface{}
  39. }
  40. func (raw Raw) Build(builder BuilderInterface) {
  41. sql := raw.SQL
  42. for _, v := range raw.Values {
  43. sql = strings.Replace(sql, " ? ", " "+builder.AddVar(v)+" ", 1)
  44. }
  45. builder.Write(sql)
  46. }
  47. // IN Whether a value is within a set of values
  48. type IN struct {
  49. Column interface{}
  50. Values []interface{}
  51. }
  52. func (in IN) Build(builder BuilderInterface) {
  53. builder.WriteQuoted(in.Column)
  54. if len(in.Values) == 0 {
  55. builder.Write(" IN (NULL)")
  56. } else {
  57. builder.Write(" IN (", builder.AddVar(in.Values...), ")")
  58. }
  59. }
  60. func (in IN) NegationBuild(builder BuilderInterface) {
  61. if len(in.Values) != 0 {
  62. builder.WriteQuoted(in.Column)
  63. builder.Write(" NOT IN (", builder.AddVar(in.Values...), ")")
  64. }
  65. }
  66. // Eq equal to for where
  67. type Eq struct {
  68. Column interface{}
  69. Value interface{}
  70. }
  71. func (eq Eq) Build(builder BuilderInterface) {
  72. builder.WriteQuoted(eq.Column)
  73. if eq.Value == nil {
  74. builder.Write(" IS NULL")
  75. } else {
  76. builder.Write(" = ", builder.AddVar(eq.Value))
  77. }
  78. }
  79. func (eq Eq) NegationBuild(builder BuilderInterface) {
  80. Neq{eq.Column, eq.Value}.Build(builder)
  81. }
  82. // Neq not equal to for where
  83. type Neq struct {
  84. Column interface{}
  85. Value interface{}
  86. }
  87. func (neq Neq) Build(builder BuilderInterface) {
  88. builder.WriteQuoted(neq.Column)
  89. if neq.Value == nil {
  90. builder.Write(" IS NOT NULL")
  91. } else {
  92. builder.Write(" <> ", builder.AddVar(neq.Value))
  93. }
  94. }
  95. func (neq Neq) NegationBuild(builder BuilderInterface) {
  96. Eq{neq.Column, neq.Value}.Build(builder)
  97. }
  98. // Gt greater than for where
  99. type Gt struct {
  100. Column interface{}
  101. Value interface{}
  102. }
  103. func (gt Gt) Build(builder BuilderInterface) {
  104. builder.WriteQuoted(gt.Column)
  105. builder.Write(" > ", builder.AddVar(gt.Value))
  106. }
  107. func (gt Gt) NegationBuild(builder BuilderInterface) {
  108. Lte{gt.Column, gt.Value}.Build(builder)
  109. }
  110. // Gte greater than or equal to for where
  111. type Gte struct {
  112. Column interface{}
  113. Value interface{}
  114. }
  115. func (gte Gte) Build(builder BuilderInterface) {
  116. builder.WriteQuoted(gte.Column)
  117. builder.Write(" >= ", builder.AddVar(gte.Value))
  118. }
  119. func (gte Gte) NegationBuild(builder BuilderInterface) {
  120. Lt{gte.Column, gte.Value}.Build(builder)
  121. }
  122. // Lt less than for where
  123. type Lt struct {
  124. Column interface{}
  125. Value interface{}
  126. }
  127. func (lt Lt) Build(builder BuilderInterface) {
  128. builder.WriteQuoted(lt.Column)
  129. builder.Write(" < ", builder.AddVar(lt.Value))
  130. }
  131. func (lt Lt) NegationBuild(builder BuilderInterface) {
  132. Gte{lt.Column, lt.Value}.Build(builder)
  133. }
  134. // Lte less than or equal to for where
  135. type Lte struct {
  136. Column interface{}
  137. Value interface{}
  138. }
  139. func (lte Lte) Build(builder BuilderInterface) {
  140. builder.WriteQuoted(lte.Column)
  141. builder.Write(" <= ", builder.AddVar(lte.Value))
  142. }
  143. func (lte Lte) NegationBuild(builder BuilderInterface) {
  144. Gt{lte.Column, lte.Value}.Build(builder)
  145. }
  146. // Like whether string matches regular expression
  147. type Like struct {
  148. Column interface{}
  149. Value interface{}
  150. }
  151. func (like Like) Build(builder BuilderInterface) {
  152. builder.WriteQuoted(like.Column)
  153. builder.Write(" LIKE ", builder.AddVar(like.Value))
  154. }
  155. func (like Like) NegationBuild(builder BuilderInterface) {
  156. builder.WriteQuoted(like.Column)
  157. builder.Write(" NOT LIKE ", builder.AddVar(like.Value))
  158. }