mqls_match.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package odbcmql
  2. import (
  3. "fmt"
  4. "regexp"
  5. "strings"
  6. odb "git.wecise.com/wecise/odb-go/odb"
  7. "gitee.com/wecisecode/util/cast"
  8. )
  9. func MatchValues(rtn *odb.Result, ks []string, ms []any) (x int, matchingvalues [][]any) {
  10. var matchingvalue any
  11. for _, dat := range rtn.Data {
  12. matchingvalues = append(matchingvalues, []any{})
  13. m := false
  14. sv := ""
  15. match := true
  16. for i, k := range ks {
  17. matchingvalue = dat[k]
  18. m, sv = matchvalue(ms[i], matchingvalue)
  19. if !m {
  20. ks := strings.Split(k, ".")
  21. if len(ks) <= 1 {
  22. match = false
  23. break
  24. } else {
  25. k := ""
  26. for i := 0; match && i < len(ks); i++ {
  27. if matchingvalue == nil {
  28. if k != "" {
  29. k += "."
  30. }
  31. k += ks[i]
  32. matchingvalue = dat[k]
  33. if matchingvalue == nil && ks[i] == "len" {
  34. matchingvalue = 0
  35. }
  36. } else {
  37. switch mv := matchingvalue.(type) {
  38. case map[string]any:
  39. matchingvalue = mv[ks[i]]
  40. if matchingvalue == nil && ks[i] == "len" {
  41. matchingvalue = len(mv)
  42. }
  43. case []any:
  44. if ks[i] == "len" {
  45. matchingvalue = len(mv)
  46. } else {
  47. n, e := cast.ToIntE(ks[i])
  48. if e != nil {
  49. match = false
  50. break
  51. }
  52. if n >= len(mv) {
  53. match = false
  54. break
  55. }
  56. matchingvalue = mv[n]
  57. }
  58. case string:
  59. if ks[i] == "len" {
  60. matchingvalue = len(mv)
  61. } else {
  62. n, e := cast.ToIntE(ks[i])
  63. if e != nil {
  64. match = false
  65. break
  66. }
  67. if n >= len(mv) {
  68. match = false
  69. break
  70. }
  71. matchingvalue = mv[n]
  72. }
  73. default:
  74. if ks[i] == "len" {
  75. matchingvalue = 0
  76. } else {
  77. matchingvalue = nil
  78. }
  79. }
  80. }
  81. }
  82. m, sv = matchvalue(ms[i], matchingvalue)
  83. if !m {
  84. match = false
  85. break
  86. }
  87. }
  88. }
  89. matchingvalues[len(matchingvalues)-1] = append(matchingvalues[len(matchingvalues)-1], sv)
  90. }
  91. if match {
  92. x++
  93. matchingvalues = matchingvalues[:len(matchingvalues)-1]
  94. } else {
  95. matchingvalues[len(matchingvalues)-1] = append(matchingvalues[len(matchingvalues)-1], sv)
  96. }
  97. }
  98. return
  99. }
  100. func matchvalue(matcher any, matchingvalue any) (bool, string) {
  101. switch m := matcher.(type) {
  102. case *regexp.Regexp:
  103. switch v := matchingvalue.(type) {
  104. case string:
  105. return m.MatchString(v), v
  106. default:
  107. sv := fmt.Sprintf("%#v", matchingvalue)
  108. return m.MatchString(sv), sv
  109. }
  110. case string:
  111. sv := ""
  112. switch matchingvalue.(type) {
  113. case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64, bool:
  114. sv = fmt.Sprintf("%v", matchingvalue)
  115. case float32, float64:
  116. sv = fmt.Sprintf("%v", matchingvalue)
  117. fvrange := strings.Split(m, "~")
  118. if len(fvrange) > 1 {
  119. return sv >= fvrange[0] && sv <= fvrange[len(fvrange)-1], sv
  120. }
  121. default:
  122. sv = fmt.Sprintf("%#v", matchingvalue)
  123. }
  124. return sv == m, sv
  125. case *Action:
  126. switch m.Name {
  127. case "<FUZZY>":
  128. return matchFuzzy(matchingvalue, m.Args)
  129. }
  130. }
  131. panic("未定义的匹配类型")
  132. }
  133. func matchFuzzy(matchingvalue any, mvrange []any) (bool, string) {
  134. sv := ""
  135. switch matchingvalue.(type) {
  136. case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64, bool, float32, float64, string:
  137. sv = fmt.Sprintf("%v", matchingvalue)
  138. default:
  139. sv = fmt.Sprintf("%#v", matchingvalue)
  140. }
  141. if len(mvrange) == 0 {
  142. return false, sv
  143. }
  144. m1 := fmt.Sprintf("%v", mvrange[0])
  145. m2 := fmt.Sprintf("%v", mvrange[len(mvrange)-1])
  146. return sv >= m1 && sv <= m2, sv
  147. }