query.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package DB
  2. import (
  3. "TsDB2/DB/core"
  4. "TsDB2/DB/core/types"
  5. "fmt"
  6. )
  7. // Query 泛型查询构建器
  8. type Query[T any] struct {
  9. table *Table[T]
  10. wheres []whereClause
  11. orders []orderClause
  12. limit int
  13. offset int
  14. }
  15. type whereClause struct {
  16. field string
  17. op string
  18. value interface{}
  19. }
  20. type orderClause struct {
  21. field string
  22. desc bool
  23. }
  24. func (q *Query[T]) addWhere(field, op string, value interface{}) *Query[T] {
  25. q.wheres = append(q.wheres, whereClause{field: field, op: op, value: value})
  26. return q
  27. }
  28. // Where 添加条件
  29. func (q *Query[T]) Where(field string, op string, value interface{}) *Query[T] {
  30. q.wheres = append(q.wheres, whereClause{field: field, op: op, value: value})
  31. return q
  32. }
  33. // OrderBy 排序
  34. func (q *Query[T]) OrderBy(field string, desc ...bool) *Query[T] {
  35. d := false
  36. if len(desc) > 0 && desc[0] {
  37. d = true
  38. }
  39. q.orders = append(q.orders, orderClause{field: field, desc: d})
  40. return q
  41. }
  42. // Limit 限制行数
  43. func (q *Query[T]) Limit(n int) *Query[T] {
  44. q.limit = n
  45. return q
  46. }
  47. // Offset 跳过行数
  48. func (q *Query[T]) Offset(n int) *Query[T] {
  49. q.offset = n
  50. return q
  51. }
  52. // Find 执行查询返回所有结果
  53. func (q *Query[T]) Find() ([]*T, error) {
  54. cq := q.buildCoreQuery()
  55. rows, err := cq.Find()
  56. if err != nil {
  57. return nil, err
  58. }
  59. result := make([]*T, 0, len(rows))
  60. for _, row := range rows {
  61. obj := new(T)
  62. if err := fieldValuesToStruct(row, q.table.model, obj); err != nil {
  63. continue
  64. }
  65. result = append(result, obj)
  66. }
  67. return result, nil
  68. }
  69. // First 返回第一条结果
  70. func (q *Query[T]) First() (*T, error) {
  71. q.limit = 1
  72. results, err := q.Find()
  73. if err != nil {
  74. return nil, err
  75. }
  76. if len(results) == 0 {
  77. return nil, fmt.Errorf("tsdb: record not found")
  78. }
  79. return results[0], nil
  80. }
  81. // Count 返回匹配行数
  82. func (q *Query[T]) Count() (int64, error) {
  83. cq := q.buildCoreQuery()
  84. return cq.Count()
  85. }
  86. // Scan 流式遍历
  87. func (q *Query[T]) Scan(callback func(*T) bool) error {
  88. cq := q.buildCoreQuery()
  89. return cq.Scan(func(row []types.FieldValue) bool {
  90. obj := new(T)
  91. if err := fieldValuesToStruct(row, q.table.model, obj); err != nil {
  92. return true
  93. }
  94. return callback(obj)
  95. })
  96. }
  97. // buildCoreQuery 构建 core 层的 Query
  98. func (q *Query[T]) buildCoreQuery() *core.Query {
  99. cq := q.table.coreTable.Query()
  100. // 构建 WHERE 条件
  101. if len(q.wheres) > 0 {
  102. cond := q.buildCondition(q.wheres[0])
  103. for i := 1; i < len(q.wheres); i++ {
  104. cond = core.And(cond, q.buildCondition(q.wheres[i]))
  105. }
  106. cq = cq.Where(cond)
  107. }
  108. // ORDER BY
  109. for _, o := range q.orders {
  110. cq = cq.OrderBy(o.field, o.desc)
  111. }
  112. // LIMIT / OFFSET
  113. if q.limit > 0 {
  114. cq = cq.Limit(q.limit)
  115. }
  116. if q.offset > 0 {
  117. cq = cq.Offset(q.offset)
  118. }
  119. return cq
  120. }
  121. // buildCondition 将 whereClause 转换为 core.Condition
  122. func (q *Query[T]) buildCondition(w whereClause) core.Condition {
  123. ft := q.findFieldType(w.field)
  124. val := normalizeCondValue(w.value, ft)
  125. switch w.op {
  126. case "=", "==", "eq":
  127. return core.Eq(w.field, val, ft)
  128. case "!=", "<>":
  129. return core.Not(core.Eq(w.field, val, ft))
  130. case ">", "gt":
  131. return core.Gt(w.field, val, ft)
  132. case ">=", "ge", "gte":
  133. return core.Ge(w.field, val, ft)
  134. case "<", "lt":
  135. return core.Lt(w.field, val, ft)
  136. case "<=", "le", "lte":
  137. return core.Le(w.field, val, ft)
  138. case "like":
  139. if s, ok := w.value.(string); ok {
  140. return core.Like(w.field, s)
  141. }
  142. return core.Eq(w.field, val, ft)
  143. default:
  144. return core.Eq(w.field, val, ft)
  145. }
  146. }
  147. // normalizeCondValue 将条件值转换为 core 期望的类型
  148. func normalizeCondValue(v interface{}, ft types.FieldType) interface{} {
  149. switch ft {
  150. case types.FieldType_8byte:
  151. return toUint64(v)
  152. case types.FieldType_4byte:
  153. return toInt32(v)
  154. case types.FieldType_2byte:
  155. return int16(toUint64(v))
  156. case types.FieldType_1byte:
  157. return int8(toUint64(v))
  158. default:
  159. // 定长字符串类型: 转换为 []byte (core 的 encodeIndexKey 需要)
  160. if s, ok := v.(string); ok {
  161. return toFixedBytes(s, int(types.GetSize(ft)))
  162. }
  163. return v
  164. }
  165. }
  166. // findFieldType 查找字段的 FieldType
  167. // 优先从 DB schema 查找,回退到 struct model
  168. func (q *Query[T]) findFieldType(name string) types.FieldType {
  169. // 优先从 DB schema 查找
  170. if ft, ok := q.table.coreTable.GetActiveFieldType(name); ok {
  171. return ft
  172. }
  173. // 回退到 struct model
  174. for _, fd := range q.table.model.AllFields {
  175. if fd.ColName == name || fd.Name == name {
  176. return fd.FieldType
  177. }
  178. }
  179. return types.FieldType_8byte // 默认
  180. }