cond_in.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. // Copyright 2016 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package builder
  5. import (
  6. "fmt"
  7. "reflect"
  8. "strings"
  9. )
  10. type condIn struct {
  11. col string
  12. vals []interface{}
  13. }
  14. var _ Cond = condIn{}
  15. // In generates IN condition
  16. func In(col string, values ...interface{}) Cond {
  17. return condIn{col, values}
  18. }
  19. func (condIn condIn) handleBlank(w Writer) error {
  20. if _, err := fmt.Fprintf(w, "%s IN ()", condIn.col); err != nil {
  21. return err
  22. }
  23. return nil
  24. }
  25. func (condIn condIn) WriteTo(w Writer) error {
  26. if len(condIn.vals) <= 0 {
  27. return condIn.handleBlank(w)
  28. }
  29. switch condIn.vals[0].(type) {
  30. case []int8:
  31. vals := condIn.vals[0].([]int8)
  32. if len(vals) <= 0 {
  33. return condIn.handleBlank(w)
  34. }
  35. questionMark := strings.Repeat("?,", len(vals))
  36. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  37. return err
  38. }
  39. for _, val := range vals {
  40. w.Append(val)
  41. }
  42. case []int16:
  43. vals := condIn.vals[0].([]int16)
  44. if len(vals) <= 0 {
  45. return condIn.handleBlank(w)
  46. }
  47. questionMark := strings.Repeat("?,", len(vals))
  48. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  49. return err
  50. }
  51. for _, val := range vals {
  52. w.Append(val)
  53. }
  54. case []int:
  55. vals := condIn.vals[0].([]int)
  56. if len(vals) <= 0 {
  57. return condIn.handleBlank(w)
  58. }
  59. questionMark := strings.Repeat("?,", len(vals))
  60. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  61. return err
  62. }
  63. for _, val := range vals {
  64. w.Append(val)
  65. }
  66. case []int32:
  67. vals := condIn.vals[0].([]int32)
  68. if len(vals) <= 0 {
  69. return condIn.handleBlank(w)
  70. }
  71. questionMark := strings.Repeat("?,", len(vals))
  72. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  73. return err
  74. }
  75. for _, val := range vals {
  76. w.Append(val)
  77. }
  78. case []int64:
  79. vals := condIn.vals[0].([]int64)
  80. if len(vals) <= 0 {
  81. return condIn.handleBlank(w)
  82. }
  83. questionMark := strings.Repeat("?,", len(vals))
  84. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  85. return err
  86. }
  87. for _, val := range vals {
  88. w.Append(val)
  89. }
  90. case []uint8:
  91. vals := condIn.vals[0].([]uint8)
  92. if len(vals) <= 0 {
  93. return condIn.handleBlank(w)
  94. }
  95. questionMark := strings.Repeat("?,", len(vals))
  96. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  97. return err
  98. }
  99. for _, val := range vals {
  100. w.Append(val)
  101. }
  102. case []uint16:
  103. vals := condIn.vals[0].([]uint16)
  104. if len(vals) <= 0 {
  105. return condIn.handleBlank(w)
  106. }
  107. questionMark := strings.Repeat("?,", len(vals))
  108. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  109. return err
  110. }
  111. for _, val := range vals {
  112. w.Append(val)
  113. }
  114. case []uint:
  115. vals := condIn.vals[0].([]uint)
  116. if len(vals) <= 0 {
  117. return condIn.handleBlank(w)
  118. }
  119. questionMark := strings.Repeat("?,", len(vals))
  120. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  121. return err
  122. }
  123. for _, val := range vals {
  124. w.Append(val)
  125. }
  126. case []uint32:
  127. vals := condIn.vals[0].([]uint32)
  128. if len(vals) <= 0 {
  129. return condIn.handleBlank(w)
  130. }
  131. questionMark := strings.Repeat("?,", len(vals))
  132. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  133. return err
  134. }
  135. for _, val := range vals {
  136. w.Append(val)
  137. }
  138. case []uint64:
  139. vals := condIn.vals[0].([]uint64)
  140. if len(vals) <= 0 {
  141. return condIn.handleBlank(w)
  142. }
  143. questionMark := strings.Repeat("?,", len(vals))
  144. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  145. return err
  146. }
  147. for _, val := range vals {
  148. w.Append(val)
  149. }
  150. case []string:
  151. vals := condIn.vals[0].([]string)
  152. if len(vals) <= 0 {
  153. return condIn.handleBlank(w)
  154. }
  155. questionMark := strings.Repeat("?,", len(vals))
  156. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  157. return err
  158. }
  159. for _, val := range vals {
  160. w.Append(val)
  161. }
  162. case []interface{}:
  163. vals := condIn.vals[0].([]interface{})
  164. if len(vals) <= 0 {
  165. return condIn.handleBlank(w)
  166. }
  167. questionMark := strings.Repeat("?,", len(vals))
  168. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  169. return err
  170. }
  171. w.Append(vals...)
  172. case expr:
  173. val := condIn.vals[0].(expr)
  174. if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil {
  175. return err
  176. }
  177. if err := val.WriteTo(w); err != nil {
  178. return err
  179. }
  180. if _, err := fmt.Fprintf(w, ")"); err != nil {
  181. return err
  182. }
  183. case *Builder:
  184. bd := condIn.vals[0].(*Builder)
  185. if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil {
  186. return err
  187. }
  188. if err := bd.WriteTo(w); err != nil {
  189. return err
  190. }
  191. if _, err := fmt.Fprintf(w, ")"); err != nil {
  192. return err
  193. }
  194. default:
  195. v := reflect.ValueOf(condIn.vals[0])
  196. if v.Kind() == reflect.Slice {
  197. l := v.Len()
  198. if l == 0 {
  199. return condIn.handleBlank(w)
  200. }
  201. questionMark := strings.Repeat("?,", l)
  202. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  203. return err
  204. }
  205. for i := 0; i < l; i++ {
  206. w.Append(v.Index(i).Interface())
  207. }
  208. } else {
  209. questionMark := strings.Repeat("?,", len(condIn.vals))
  210. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  211. return err
  212. }
  213. w.Append(condIn.vals...)
  214. }
  215. }
  216. return nil
  217. }
  218. func (condIn condIn) And(conds ...Cond) Cond {
  219. return And(condIn, And(conds...))
  220. }
  221. func (condIn condIn) Or(conds ...Cond) Cond {
  222. return Or(condIn, Or(conds...))
  223. }
  224. func (condIn condIn) IsValid() bool {
  225. return len(condIn.col) > 0 && len(condIn.vals) > 0
  226. }