mql_prepare.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package mql
  2. import (
  3. "fmt"
  4. "sort"
  5. "strconv"
  6. "strings"
  7. )
  8. type MQLRequest struct {
  9. // params
  10. OriginQueryString string
  11. FilePath string
  12. Fromline, Toline, Fromchar, Tochar int
  13. // init values
  14. Key string
  15. StaticActionExprs map[int]*Action
  16. StaticActions *StaticActions
  17. FormatedQueryString string
  18. //
  19. WaitMQLRequest *MQLRequest // 等待上一语句完成
  20. }
  21. type MQLRequestInstance struct {
  22. *MQLRequest
  23. PreparedQueryString string
  24. }
  25. type MQLGroupRequest struct {
  26. mqrn int // 一个文件中的mql计数
  27. mqrs [][]*MQLRequest // 并发MQLRequest序列, mqrs[0]为主序列
  28. curn int // 当前序列
  29. }
  30. func NewMQLGroupRequest() (mqg *MQLGroupRequest) {
  31. mqg = &MQLGroupRequest{
  32. mqrn: 0,
  33. mqrs: [][]*MQLRequest{{}},
  34. curn: 0,
  35. }
  36. return
  37. }
  38. func (mqg *MQLGroupRequest) Append(mqr *MQLRequest) error {
  39. mqr, e := mqr.init(mqg.mqrn + 1)
  40. if e != nil {
  41. return e
  42. }
  43. if mqr != nil {
  44. if mqr.StaticActions.ForkName != nil {
  45. // fork新线程
  46. if len(mqg.mqrs[0]) > 0 {
  47. // 等待上一语句完成
  48. mqr.WaitMQLRequest = mqg.mqrs[0][len(mqg.mqrs[0])-1]
  49. } else {
  50. // 第一句就开始fork新线程
  51. }
  52. mqg.mqrs = append(mqg.mqrs, []*MQLRequest{})
  53. mqg.curn = len(mqg.mqrs) - 1
  54. }
  55. if mqr.StaticActions.ForkName == nil && mqr.StaticActions.WaitName != nil {
  56. // 主线程等待指定线程
  57. mqg.curn = 0
  58. }
  59. mqg.mqrs[mqg.curn] = append(mqg.mqrs[mqg.curn], mqr)
  60. mqg.mqrn++
  61. }
  62. return nil
  63. }
  64. func (mqr *MQLRequest) init(n int) (*MQLRequest, error) {
  65. mqr.OriginQueryString = strings.TrimSpace(mqr.OriginQueryString)
  66. if mqr.OriginQueryString == "" {
  67. return nil, nil
  68. }
  69. mqr.Key = fmt.Sprint(mqr.FilePath, ".", n, "[", mqr.Fromline, "-", mqr.Toline, "]")
  70. staticactionexprs := map[int]*Action{}
  71. str := mqr.OriginQueryString
  72. idxs := refmtvar.FindAllStringSubmatchIndex(str, -1)
  73. if len(idxs) > 0 {
  74. nstr := ""
  75. is := 0
  76. for _, idx := range idxs {
  77. if len(idx) == 6 {
  78. // 标记前内容
  79. ie := idx[0]
  80. nstr += str[is:ie]
  81. nstr += strings.Repeat("_", idx[1]-ie)
  82. is = idx[1]
  83. }
  84. }
  85. nstr += str[is:]
  86. str = nstr
  87. }
  88. actionexprs, e := getActionExprs(str, staticactionexprs)
  89. if e != nil {
  90. return nil, e
  91. }
  92. staticactions, e := ToStaticActions(actionexprs)
  93. if e != nil {
  94. return nil, e
  95. }
  96. if staticactions.Skip {
  97. return nil, nil
  98. }
  99. xmqlstr := ""
  100. if len(staticactionexprs) == 0 {
  101. xmqlstr = strings.ReplaceAll(mqr.OriginQueryString, "[", "[[]")
  102. } else {
  103. mqlrunes := []rune(mqr.OriginQueryString)
  104. istart := 0
  105. keys := []int{}
  106. for k := range staticactionexprs {
  107. keys = append(keys, k)
  108. }
  109. sort.Ints(keys)
  110. for _, k := range keys {
  111. sat := staticactionexprs[k]
  112. if sat.SourceText != "" {
  113. xmqlstr += strings.ReplaceAll(string(mqlrunes[istart:sat.SourceFromIndex]), "[", "[[]")
  114. xmqlstr += "[" + strconv.Itoa(k) + "]"
  115. istart = sat.SourceToIndex
  116. }
  117. }
  118. xmqlstr += strings.ReplaceAll(string(mqlrunes[istart:]), "[", "[[]")
  119. }
  120. mqr.StaticActionExprs = staticactionexprs
  121. mqr.StaticActions = staticactions
  122. mqr.FormatedQueryString = xmqlstr
  123. return mqr, nil
  124. }