sql.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package orm
  2. import (
  3. "fmt"
  4. "reflect"
  5. "strings"
  6. "github.com/huandu/go-sqlbuilder"
  7. )
  8. var SqlFlavor = sqlbuilder.MySQL
  9. type SqlType uint8
  10. const (
  11. Select SqlType = iota << 1
  12. Update
  13. Insert
  14. Delete
  15. )
  16. type cmethod uint8
  17. type ctype uint8
  18. const (
  19. And ctype = iota
  20. Or
  21. Between
  22. NotBetween
  23. EqualThan
  24. NotEqualThan
  25. GreaterThan
  26. GreatenThanEqual
  27. LessThan
  28. LessThanEqual
  29. Like
  30. NotLike
  31. In
  32. NotIn
  33. Null
  34. NotNull
  35. )
  36. const (
  37. Limit cmethod = iota
  38. Where
  39. )
  40. type Cond struct {
  41. Method cmethod
  42. Type ctype
  43. vars []interface{}
  44. }
  45. func (c Cond) SetVar(v ...interface{}) Cond {
  46. c.vars = append(c.vars, v...)
  47. return c
  48. }
  49. type selectBuilder struct {
  50. *sqlbuilder.SelectBuilder
  51. }
  52. func getSelectBuilder(tbl *table) *selectBuilder {
  53. return &selectBuilder{
  54. sqlbuilder.NewSelectBuilder().From(tbl.getNameAs(true)),
  55. }
  56. }
  57. func (sb *selectBuilder) getXint64(v reflect.Value, unsigned bool) interface{} {
  58. switch v.Kind() {
  59. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  60. if !unsigned {
  61. return int(v.Uint())
  62. }
  63. return v.Uint()
  64. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  65. if unsigned {
  66. return uint64(v.Int())
  67. }
  68. return v.Int()
  69. }
  70. return 0
  71. }
  72. func (sb *selectBuilder) _extra(tbl *table, extra ...Cond) *selectBuilder {
  73. for _, cond := range extra {
  74. if len(cond.vars) == 0 {
  75. continue
  76. }
  77. for i, v := range cond.vars {
  78. switch v.(type) {
  79. case string:
  80. if s := strings.SplitAfterN(v.(string), ".", 2); len(s) > 1 {
  81. fmt.Println(s, s[0][0:len(s[0])-1])
  82. for _, rels := range tbl.getRelations() {
  83. for _, rel := range rels {
  84. if rel.f.getFieldName() == s[0][0:len(s[0])-1] {
  85. cond.vars[i] = sqlbuilder.Raw(rel.getAlias(true) + "." + SqlFlavor.Quote(s[1]))
  86. }
  87. }
  88. }
  89. cond.vars[i] = v
  90. }
  91. }
  92. }
  93. switch cond.Method {
  94. case Limit:
  95. if len(cond.vars) > 0 {
  96. switch cond.vars[0].(type) {
  97. case int, uint:
  98. sb.Limit(cond.vars[0].(int))
  99. }
  100. }
  101. case Where:
  102. switch cond.Type {
  103. case Null:
  104. sb.Where(sb.IsNull(cond.vars[0].(string)))
  105. case NotNull:
  106. sb.Where(sb.IsNotNull(cond.vars[0].(string)))
  107. }
  108. }
  109. }
  110. //fmt.Println(sb)
  111. return sb
  112. }
  113. func (sb *selectBuilder) _select(tbls ...interface{}) *selectBuilder {
  114. cols := []string{}
  115. for _, tbl := range tbls {
  116. switch tbl.(type) {
  117. case relation:
  118. rtbl := tbl.(relation)
  119. for _, col := range rtbl.table.getColumns() {
  120. cols = append(cols, col.getName(true, rtbl))
  121. }
  122. case *table:
  123. rtbl := tbl.(*table)
  124. for _, col := range rtbl.getColumns() {
  125. cols = append(cols, col.getName(true, rtbl))
  126. }
  127. }
  128. }
  129. sb.Select(cols...)
  130. return sb
  131. }
  132. func (sb *selectBuilder) _where(tbl *table, i MappableInterface) *selectBuilder {
  133. tmp := tbl.Make()
  134. where := []string{}
  135. outerloop:
  136. for _, col := range tbl.getColumns() {
  137. fn := "Get" + strings.Title(col.getFieldName())
  138. val, err := tbl.CallMethod(i, fn)
  139. if err == nil {
  140. tmpv, _ := tbl.CallMethod(tmp, fn)
  141. for i, v := range val {
  142. if v == tmpv[i] {
  143. continue outerloop
  144. }
  145. }
  146. fmt.Println(fn, val)
  147. where = append(where, sb.Equal(col.getName(true, tbl), val[0]))
  148. } else {
  149. fmt.Println(err)
  150. }
  151. }
  152. sb.Where(where...)
  153. return sb
  154. }
  155. func (sb *selectBuilder) _wherePrimaryOrElse(tbl *table, i MappableInterface) *selectBuilder {
  156. if pk := tbl.getPrimaryKey(); pk != nil {
  157. val, err := tbl.CallMethod(i, "Get"+strings.Title(pk.getFieldName()))
  158. if err != nil {
  159. sb._where(tbl, i)
  160. } else {
  161. sb.Where(sb.Equal(pk.getName(true, tbl), val[0]))
  162. }
  163. } else {
  164. sb._where(tbl, i)
  165. }
  166. return sb
  167. }
  168. func (sb *selectBuilder) _join(tbl *table, rel relation, opt ...sqlbuilder.JoinOption) *selectBuilder {
  169. if len(opt) == 0 {
  170. sb.Join(rel.getNameAs(true), sb.Equal(rel.on.getName(true, rel), sqlbuilder.Raw(rel.key.getName(true, tbl))))
  171. } else {
  172. sb.JoinWithOption(opt[0], rel.getNameAs(true), sb.Equal(rel.on.getName(true, rel), sqlbuilder.Raw(rel.key.getName(true, tbl))))
  173. }
  174. return sb
  175. }