expression.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. package clause
  2. import (
  3. "database/sql"
  4. "database/sql/driver"
  5. "go/ast"
  6. "reflect"
  7. )
  8. // Expression expression interface
  9. type Expression interface {
  10. Build(builder Builder)
  11. }
  12. // NegationExpressionBuilder negation expression builder
  13. type NegationExpressionBuilder interface {
  14. NegationBuild(builder Builder)
  15. }
  16. // Expr raw expression
  17. type Expr struct {
  18. SQL string
  19. Vars []interface{}
  20. WithoutParentheses bool
  21. }
  22. // Build build raw expression
  23. func (expr Expr) Build(builder Builder) {
  24. var (
  25. afterParenthesis bool
  26. idx int
  27. )
  28. for _, v := range []byte(expr.SQL) {
  29. if v == '?' && len(expr.Vars) > idx {
  30. if afterParenthesis || expr.WithoutParentheses {
  31. if _, ok := expr.Vars[idx].(driver.Valuer); ok {
  32. builder.AddVar(builder, expr.Vars[idx])
  33. } else {
  34. switch rv := reflect.ValueOf(expr.Vars[idx]); rv.Kind() {
  35. case reflect.Slice, reflect.Array:
  36. if rv.Len() == 0 {
  37. builder.AddVar(builder, nil)
  38. } else {
  39. for i := 0; i < rv.Len(); i++ {
  40. if i > 0 {
  41. builder.WriteByte(',')
  42. }
  43. builder.AddVar(builder, rv.Index(i).Interface())
  44. }
  45. }
  46. default:
  47. builder.AddVar(builder, expr.Vars[idx])
  48. }
  49. }
  50. } else {
  51. builder.AddVar(builder, expr.Vars[idx])
  52. }
  53. idx++
  54. } else {
  55. if v == '(' {
  56. afterParenthesis = true
  57. } else {
  58. afterParenthesis = false
  59. }
  60. builder.WriteByte(v)
  61. }
  62. }
  63. if idx < len(expr.Vars) {
  64. for _, v := range expr.Vars[idx:] {
  65. builder.AddVar(builder, sql.NamedArg{Value: v})
  66. }
  67. }
  68. }
  69. // NamedExpr raw expression for named expr
  70. type NamedExpr struct {
  71. SQL string
  72. Vars []interface{}
  73. }
  74. // Build build raw expression
  75. func (expr NamedExpr) Build(builder Builder) {
  76. var (
  77. idx int
  78. inName bool
  79. afterParenthesis bool
  80. namedMap = make(map[string]interface{}, len(expr.Vars))
  81. )
  82. for _, v := range expr.Vars {
  83. switch value := v.(type) {
  84. case sql.NamedArg:
  85. namedMap[value.Name] = value.Value
  86. case map[string]interface{}:
  87. for k, v := range value {
  88. namedMap[k] = v
  89. }
  90. default:
  91. var appendFieldsToMap func(reflect.Value)
  92. appendFieldsToMap = func(reflectValue reflect.Value) {
  93. reflectValue = reflect.Indirect(reflectValue)
  94. switch reflectValue.Kind() {
  95. case reflect.Struct:
  96. modelType := reflectValue.Type()
  97. for i := 0; i < modelType.NumField(); i++ {
  98. if fieldStruct := modelType.Field(i); ast.IsExported(fieldStruct.Name) {
  99. namedMap[fieldStruct.Name] = reflectValue.Field(i).Interface()
  100. if fieldStruct.Anonymous {
  101. appendFieldsToMap(reflectValue.Field(i))
  102. }
  103. }
  104. }
  105. }
  106. }
  107. appendFieldsToMap(reflect.ValueOf(value))
  108. }
  109. }
  110. name := make([]byte, 0, 10)
  111. for _, v := range []byte(expr.SQL) {
  112. if v == '@' && !inName {
  113. inName = true
  114. name = name[:0]
  115. } else if v == ' ' || v == ',' || v == ')' || v == '"' || v == '\'' || v == '`' || v == '\r' || v == '\n' || v == ';' {
  116. if inName {
  117. if nv, ok := namedMap[string(name)]; ok {
  118. builder.AddVar(builder, nv)
  119. } else {
  120. builder.WriteByte('@')
  121. builder.WriteString(string(name))
  122. }
  123. inName = false
  124. }
  125. afterParenthesis = false
  126. builder.WriteByte(v)
  127. } else if v == '?' && len(expr.Vars) > idx {
  128. if afterParenthesis {
  129. if _, ok := expr.Vars[idx].(driver.Valuer); ok {
  130. builder.AddVar(builder, expr.Vars[idx])
  131. } else {
  132. switch rv := reflect.ValueOf(expr.Vars[idx]); rv.Kind() {
  133. case reflect.Slice, reflect.Array:
  134. if rv.Len() == 0 {
  135. builder.AddVar(builder, nil)
  136. } else {
  137. for i := 0; i < rv.Len(); i++ {
  138. if i > 0 {
  139. builder.WriteByte(',')
  140. }
  141. builder.AddVar(builder, rv.Index(i).Interface())
  142. }
  143. }
  144. default:
  145. builder.AddVar(builder, expr.Vars[idx])
  146. }
  147. }
  148. } else {
  149. builder.AddVar(builder, expr.Vars[idx])
  150. }
  151. idx++
  152. } else if inName {
  153. name = append(name, v)
  154. } else {
  155. if v == '(' {
  156. afterParenthesis = true
  157. } else {
  158. afterParenthesis = false
  159. }
  160. builder.WriteByte(v)
  161. }
  162. }
  163. if inName {
  164. if nv, ok := namedMap[string(name)]; ok {
  165. builder.AddVar(builder, nv)
  166. } else {
  167. builder.WriteByte('@')
  168. builder.WriteString(string(name))
  169. }
  170. }
  171. }
  172. // IN Whether a value is within a set of values
  173. type IN struct {
  174. Column interface{}
  175. Values []interface{}
  176. }
  177. func (in IN) Build(builder Builder) {
  178. builder.WriteQuoted(in.Column)
  179. switch len(in.Values) {
  180. case 0:
  181. builder.WriteString(" IN (NULL)")
  182. case 1:
  183. if _, ok := in.Values[0].([]interface{}); !ok {
  184. builder.WriteString(" = ")
  185. builder.AddVar(builder, in.Values[0])
  186. break
  187. }
  188. fallthrough
  189. default:
  190. builder.WriteString(" IN (")
  191. builder.AddVar(builder, in.Values...)
  192. builder.WriteByte(')')
  193. }
  194. }
  195. func (in IN) NegationBuild(builder Builder) {
  196. builder.WriteQuoted(in.Column)
  197. switch len(in.Values) {
  198. case 0:
  199. builder.WriteString(" IS NOT NULL")
  200. case 1:
  201. if _, ok := in.Values[0].([]interface{}); !ok {
  202. builder.WriteString(" <> ")
  203. builder.AddVar(builder, in.Values[0])
  204. break
  205. }
  206. fallthrough
  207. default:
  208. builder.WriteString(" NOT IN (")
  209. builder.AddVar(builder, in.Values...)
  210. builder.WriteByte(')')
  211. }
  212. }
  213. // Eq equal to for where
  214. type Eq struct {
  215. Column interface{}
  216. Value interface{}
  217. }
  218. func (eq Eq) Build(builder Builder) {
  219. builder.WriteQuoted(eq.Column)
  220. switch eq.Value.(type) {
  221. case []string, []int, []int32, []int64, []uint, []uint32, []uint64, []interface{}:
  222. rv := reflect.ValueOf(eq.Value)
  223. if rv.Len() == 0 {
  224. builder.WriteString(" IN (NULL)")
  225. } else {
  226. builder.WriteString(" IN (")
  227. for i := 0; i < rv.Len(); i++ {
  228. if i > 0 {
  229. builder.WriteByte(',')
  230. }
  231. builder.AddVar(builder, rv.Index(i).Interface())
  232. }
  233. builder.WriteByte(')')
  234. }
  235. default:
  236. if eqNil(eq.Value) {
  237. builder.WriteString(" IS NULL")
  238. } else {
  239. builder.WriteString(" = ")
  240. builder.AddVar(builder, eq.Value)
  241. }
  242. }
  243. }
  244. func (eq Eq) NegationBuild(builder Builder) {
  245. Neq(eq).Build(builder)
  246. }
  247. // Neq not equal to for where
  248. type Neq Eq
  249. func (neq Neq) Build(builder Builder) {
  250. builder.WriteQuoted(neq.Column)
  251. switch neq.Value.(type) {
  252. case []string, []int, []int32, []int64, []uint, []uint32, []uint64, []interface{}:
  253. builder.WriteString(" NOT IN (")
  254. rv := reflect.ValueOf(neq.Value)
  255. for i := 0; i < rv.Len(); i++ {
  256. if i > 0 {
  257. builder.WriteByte(',')
  258. }
  259. builder.AddVar(builder, rv.Index(i).Interface())
  260. }
  261. builder.WriteByte(')')
  262. default:
  263. if eqNil(neq.Value) {
  264. builder.WriteString(" IS NOT NULL")
  265. } else {
  266. builder.WriteString(" <> ")
  267. builder.AddVar(builder, neq.Value)
  268. }
  269. }
  270. }
  271. func (neq Neq) NegationBuild(builder Builder) {
  272. Eq(neq).Build(builder)
  273. }
  274. // Gt greater than for where
  275. type Gt Eq
  276. func (gt Gt) Build(builder Builder) {
  277. builder.WriteQuoted(gt.Column)
  278. builder.WriteString(" > ")
  279. builder.AddVar(builder, gt.Value)
  280. }
  281. func (gt Gt) NegationBuild(builder Builder) {
  282. Lte(gt).Build(builder)
  283. }
  284. // Gte greater than or equal to for where
  285. type Gte Eq
  286. func (gte Gte) Build(builder Builder) {
  287. builder.WriteQuoted(gte.Column)
  288. builder.WriteString(" >= ")
  289. builder.AddVar(builder, gte.Value)
  290. }
  291. func (gte Gte) NegationBuild(builder Builder) {
  292. Lt(gte).Build(builder)
  293. }
  294. // Lt less than for where
  295. type Lt Eq
  296. func (lt Lt) Build(builder Builder) {
  297. builder.WriteQuoted(lt.Column)
  298. builder.WriteString(" < ")
  299. builder.AddVar(builder, lt.Value)
  300. }
  301. func (lt Lt) NegationBuild(builder Builder) {
  302. Gte(lt).Build(builder)
  303. }
  304. // Lte less than or equal to for where
  305. type Lte Eq
  306. func (lte Lte) Build(builder Builder) {
  307. builder.WriteQuoted(lte.Column)
  308. builder.WriteString(" <= ")
  309. builder.AddVar(builder, lte.Value)
  310. }
  311. func (lte Lte) NegationBuild(builder Builder) {
  312. Gt(lte).Build(builder)
  313. }
  314. // Like whether string matches regular expression
  315. type Like Eq
  316. func (like Like) Build(builder Builder) {
  317. builder.WriteQuoted(like.Column)
  318. builder.WriteString(" LIKE ")
  319. builder.AddVar(builder, like.Value)
  320. }
  321. func (like Like) NegationBuild(builder Builder) {
  322. builder.WriteQuoted(like.Column)
  323. builder.WriteString(" NOT LIKE ")
  324. builder.AddVar(builder, like.Value)
  325. }
  326. func eqNil(value interface{}) bool {
  327. if valuer, ok := value.(driver.Valuer); ok && !eqNilReflect(valuer) {
  328. value, _ = valuer.Value()
  329. }
  330. return value == nil || eqNilReflect(value)
  331. }
  332. func eqNilReflect(value interface{}) bool {
  333. reflectValue := reflect.ValueOf(value)
  334. return reflectValue.Kind() == reflect.Ptr && reflectValue.IsNil()
  335. }