cond_in.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. "strings"
  8. )
  9. type condIn struct {
  10. col string
  11. vals []interface{}
  12. }
  13. var _ Cond = condIn{}
  14. // In generates IN condition
  15. func In(col string, values ...interface{}) Cond {
  16. return condIn{col, values}
  17. }
  18. func (condIn condIn) WriteTo(w Writer) error {
  19. if len(condIn.vals) <= 0 {
  20. return ErrNoInConditions
  21. }
  22. switch condIn.vals[0].(type) {
  23. case []int8:
  24. vals := condIn.vals[0].([]int8)
  25. if len(vals) <= 0 {
  26. return ErrNoInConditions
  27. }
  28. questionMark := strings.Repeat("?,", len(vals))
  29. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  30. return err
  31. }
  32. for _, val := range vals {
  33. w.Append(val)
  34. }
  35. case []int16:
  36. vals := condIn.vals[0].([]int16)
  37. if len(vals) <= 0 {
  38. return ErrNoInConditions
  39. }
  40. questionMark := strings.Repeat("?,", len(vals))
  41. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  42. return err
  43. }
  44. for _, val := range vals {
  45. w.Append(val)
  46. }
  47. case []int:
  48. vals := condIn.vals[0].([]int)
  49. if len(vals) <= 0 {
  50. return ErrNoInConditions
  51. }
  52. questionMark := strings.Repeat("?,", len(vals))
  53. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  54. return err
  55. }
  56. for _, val := range vals {
  57. w.Append(val)
  58. }
  59. case []int32:
  60. vals := condIn.vals[0].([]int32)
  61. if len(vals) <= 0 {
  62. return ErrNoInConditions
  63. }
  64. questionMark := strings.Repeat("?,", len(vals))
  65. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  66. return err
  67. }
  68. for _, val := range vals {
  69. w.Append(val)
  70. }
  71. case []int64:
  72. vals := condIn.vals[0].([]int64)
  73. if len(vals) <= 0 {
  74. return ErrNoInConditions
  75. }
  76. questionMark := strings.Repeat("?,", len(vals))
  77. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  78. return err
  79. }
  80. for _, val := range vals {
  81. w.Append(val)
  82. }
  83. case []uint8:
  84. vals := condIn.vals[0].([]uint8)
  85. if len(vals) <= 0 {
  86. return ErrNoInConditions
  87. }
  88. questionMark := strings.Repeat("?,", len(vals))
  89. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  90. return err
  91. }
  92. for _, val := range vals {
  93. w.Append(val)
  94. }
  95. case []uint16:
  96. vals := condIn.vals[0].([]uint16)
  97. if len(vals) <= 0 {
  98. return ErrNoInConditions
  99. }
  100. questionMark := strings.Repeat("?,", len(vals))
  101. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  102. return err
  103. }
  104. for _, val := range vals {
  105. w.Append(val)
  106. }
  107. case []uint:
  108. vals := condIn.vals[0].([]uint)
  109. if len(vals) <= 0 {
  110. return ErrNoInConditions
  111. }
  112. questionMark := strings.Repeat("?,", len(vals))
  113. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  114. return err
  115. }
  116. for _, val := range vals {
  117. w.Append(val)
  118. }
  119. case []uint32:
  120. vals := condIn.vals[0].([]uint32)
  121. if len(vals) <= 0 {
  122. return ErrNoInConditions
  123. }
  124. questionMark := strings.Repeat("?,", len(vals))
  125. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  126. return err
  127. }
  128. for _, val := range vals {
  129. w.Append(val)
  130. }
  131. case []uint64:
  132. vals := condIn.vals[0].([]uint64)
  133. if len(vals) <= 0 {
  134. return ErrNoInConditions
  135. }
  136. questionMark := strings.Repeat("?,", len(vals))
  137. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  138. return err
  139. }
  140. for _, val := range vals {
  141. w.Append(val)
  142. }
  143. case []string:
  144. vals := condIn.vals[0].([]string)
  145. if len(vals) <= 0 {
  146. return ErrNoInConditions
  147. }
  148. questionMark := strings.Repeat("?,", len(vals))
  149. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  150. return err
  151. }
  152. for _, val := range vals {
  153. w.Append(val)
  154. }
  155. case []interface{}:
  156. vals := condIn.vals[0].([]interface{})
  157. if len(vals) <= 0 {
  158. return ErrNoInConditions
  159. }
  160. questionMark := strings.Repeat("?,", len(vals))
  161. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  162. return err
  163. }
  164. w.Append(vals...)
  165. case expr:
  166. val := condIn.vals[0].(expr)
  167. if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil {
  168. return err
  169. }
  170. if err := val.WriteTo(w); err != nil {
  171. return err
  172. }
  173. if _, err := fmt.Fprintf(w, ")"); err != nil {
  174. return err
  175. }
  176. case *Builder:
  177. bd := condIn.vals[0].(*Builder)
  178. if _, err := fmt.Fprintf(w, "%s IN (", condIn.col); err != nil {
  179. return err
  180. }
  181. if err := bd.WriteTo(w); err != nil {
  182. return err
  183. }
  184. if _, err := fmt.Fprintf(w, ")"); err != nil {
  185. return err
  186. }
  187. default:
  188. if len(condIn.vals) <= 0 {
  189. return ErrNoInConditions
  190. }
  191. questionMark := strings.Repeat("?,", len(condIn.vals))
  192. if _, err := fmt.Fprintf(w, "%s IN (%s)", condIn.col, questionMark[:len(questionMark)-1]); err != nil {
  193. return err
  194. }
  195. w.Append(condIn.vals...)
  196. }
  197. return nil
  198. }
  199. func (condIn condIn) And(conds ...Cond) Cond {
  200. return And(condIn, And(conds...))
  201. }
  202. func (condIn condIn) Or(conds ...Cond) Cond {
  203. return Or(condIn, Or(conds...))
  204. }
  205. func (condIn condIn) IsValid() bool {
  206. return len(condIn.col) > 0 && len(condIn.vals) > 0
  207. }