query.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package clause
  2. import "strings"
  3. ////////////////////////////////////////////////////////////////////////////////
  4. // Query Expressions
  5. ////////////////////////////////////////////////////////////////////////////////
  6. func Add(exprs ...Expression) AddConditions {
  7. return AddConditions(exprs)
  8. }
  9. func Or(exprs ...Expression) OrConditions {
  10. return OrConditions(exprs)
  11. }
  12. type AddConditions []Expression
  13. func (cs AddConditions) Build(builder Builder) {
  14. for idx, c := range cs {
  15. if idx > 0 {
  16. builder.Write(" AND ")
  17. }
  18. c.Build(builder)
  19. }
  20. }
  21. type OrConditions []Expression
  22. func (cs OrConditions) Build(builder Builder) {
  23. for idx, c := range cs {
  24. if idx > 0 {
  25. builder.Write(" OR ")
  26. }
  27. c.Build(builder)
  28. }
  29. }
  30. type NotConditions []Expression
  31. func (cs NotConditions) Build(builder Builder) {
  32. for idx, c := range cs {
  33. if idx > 0 {
  34. builder.Write(" AND ")
  35. }
  36. if negationBuilder, ok := c.(NegationExpressionBuilder); ok {
  37. negationBuilder.NegationBuild(builder)
  38. } else {
  39. builder.Write(" NOT ")
  40. c.Build(builder)
  41. }
  42. }
  43. }
  44. // String raw sql for where
  45. type String struct {
  46. SQL string
  47. Values []interface{}
  48. }
  49. func (str String) Build(builder Builder) {
  50. sql := str.SQL
  51. for _, v := range str.Values {
  52. sql = strings.Replace(sql, " ? ", " "+builder.AddVar(v)+" ", 1)
  53. }
  54. builder.Write(sql)
  55. }
  56. // IN Whether a value is within a set of values
  57. type IN struct {
  58. Column interface{}
  59. Values []interface{}
  60. }
  61. func (in IN) Build(builder Builder) {
  62. builder.WriteQuoted(in.Column)
  63. switch len(in.Values) {
  64. case 0:
  65. builder.Write(" IN (NULL)")
  66. case 1:
  67. builder.Write(" = ", builder.AddVar(in.Values...))
  68. default:
  69. builder.Write(" IN (", builder.AddVar(in.Values...), ")")
  70. }
  71. }
  72. func (in IN) NegationBuild(builder Builder) {
  73. switch len(in.Values) {
  74. case 0:
  75. case 1:
  76. builder.Write(" <> ", builder.AddVar(in.Values...))
  77. default:
  78. builder.Write(" NOT IN (", builder.AddVar(in.Values...), ")")
  79. }
  80. }
  81. // Eq equal to for where
  82. type Eq struct {
  83. Column interface{}
  84. Value interface{}
  85. }
  86. func (eq Eq) Build(builder Builder) {
  87. builder.WriteQuoted(eq.Column)
  88. if eq.Value == nil {
  89. builder.Write(" IS NULL")
  90. } else {
  91. builder.Write(" = ", builder.AddVar(eq.Value))
  92. }
  93. }
  94. func (eq Eq) NegationBuild(builder Builder) {
  95. Neq{eq.Column, eq.Value}.Build(builder)
  96. }
  97. // Neq not equal to for where
  98. type Neq struct {
  99. Column interface{}
  100. Value interface{}
  101. }
  102. func (neq Neq) Build(builder Builder) {
  103. builder.WriteQuoted(neq.Column)
  104. if neq.Value == nil {
  105. builder.Write(" IS NOT NULL")
  106. } else {
  107. builder.Write(" <> ", builder.AddVar(neq.Value))
  108. }
  109. }
  110. func (neq Neq) NegationBuild(builder Builder) {
  111. Eq{neq.Column, neq.Value}.Build(builder)
  112. }
  113. // Gt greater than for where
  114. type Gt struct {
  115. Column interface{}
  116. Value interface{}
  117. }
  118. func (gt Gt) Build(builder Builder) {
  119. builder.WriteQuoted(gt.Column)
  120. builder.Write(" > ", builder.AddVar(gt.Value))
  121. }
  122. func (gt Gt) NegationBuild(builder Builder) {
  123. Lte{gt.Column, gt.Value}.Build(builder)
  124. }
  125. // Gte greater than or equal to for where
  126. type Gte struct {
  127. Column interface{}
  128. Value interface{}
  129. }
  130. func (gte Gte) Build(builder Builder) {
  131. builder.WriteQuoted(gte.Column)
  132. builder.Write(" >= ", builder.AddVar(gte.Value))
  133. }
  134. func (gte Gte) NegationBuild(builder Builder) {
  135. Lt{gte.Column, gte.Value}.Build(builder)
  136. }
  137. // Lt less than for where
  138. type Lt struct {
  139. Column interface{}
  140. Value interface{}
  141. }
  142. func (lt Lt) Build(builder Builder) {
  143. builder.WriteQuoted(lt.Column)
  144. builder.Write(" < ", builder.AddVar(lt.Value))
  145. }
  146. func (lt Lt) NegationBuild(builder Builder) {
  147. Gte{lt.Column, lt.Value}.Build(builder)
  148. }
  149. // Lte less than or equal to for where
  150. type Lte struct {
  151. Column interface{}
  152. Value interface{}
  153. }
  154. func (lte Lte) Build(builder Builder) {
  155. builder.WriteQuoted(lte.Column)
  156. builder.Write(" <= ", builder.AddVar(lte.Value))
  157. }
  158. func (lte Lte) NegationBuild(builder Builder) {
  159. Gt{lte.Column, lte.Value}.Build(builder)
  160. }
  161. // Like whether string matches regular expression
  162. type Like struct {
  163. Column interface{}
  164. Value interface{}
  165. }
  166. func (like Like) Build(builder Builder) {
  167. builder.WriteQuoted(like.Column)
  168. builder.Write(" LIKE ", builder.AddVar(like.Value))
  169. }
  170. func (like Like) NegationBuild(builder Builder) {
  171. builder.WriteQuoted(like.Column)
  172. builder.Write(" NOT LIKE ", builder.AddVar(like.Value))
  173. }
  174. // Map
  175. type Map map[interface{}]interface{}
  176. func (m Map) Build(builder Builder) {
  177. // TODO
  178. }
  179. func (m Map) NegationBuild(builder Builder) {
  180. // TODO
  181. }
  182. // Attrs
  183. type Attrs struct {
  184. Value interface{}
  185. Select []string
  186. Omit []string
  187. }
  188. func (attrs Attrs) Build(builder Builder) {
  189. // TODO
  190. // builder.WriteQuoted(like.Column)
  191. // builder.Write(" LIKE ", builder.AddVar(like.Value))
  192. }
  193. func (attrs Attrs) NegationBuild(builder Builder) {
  194. // TODO
  195. }
  196. // ID
  197. type ID struct {
  198. Value []interface{}
  199. }
  200. func (id ID) Build(builder Builder) {
  201. if len(id.Value) == 1 {
  202. }
  203. // TODO
  204. // builder.WriteQuoted(like.Column)
  205. // builder.Write(" LIKE ", builder.AddVar(like.Value))
  206. }
  207. func (id ID) NegationBuild(builder Builder) {
  208. // TODO
  209. }