expression.go 8.0 KB

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