funcs_str.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package xsql
  2. import (
  3. "bytes"
  4. "engine/common"
  5. "fmt"
  6. "regexp"
  7. "strings"
  8. "time"
  9. "unicode"
  10. "unicode/utf8"
  11. )
  12. func strCall(name string, args []interface{}) (interface{}, bool) {
  13. switch name {
  14. case "concat":
  15. var b bytes.Buffer
  16. for _, arg := range args {
  17. b.WriteString(common.ToString(arg))
  18. }
  19. return b.String(), true
  20. case "endswith":
  21. arg0, arg1 := common.ToString(args[0]), common.ToString(args[1])
  22. return strings.HasSuffix(arg0, arg1), true
  23. case "indexof":
  24. arg0, arg1 := common.ToString(args[0]), common.ToString(args[1])
  25. return strings.Index(arg0, arg1), true
  26. case "length":
  27. arg0 := common.ToString(args[0])
  28. return utf8.RuneCountInString(arg0), true
  29. case "lower":
  30. arg0 := common.ToString(args[0])
  31. return strings.ToLower(arg0), true
  32. case "lpad":
  33. arg0 := common.ToString(args[0])
  34. arg1, err := common.ToInt(args[1])
  35. if err != nil{
  36. return err, false
  37. }
  38. return strings.Repeat(" ", arg1) + arg0, true
  39. case "ltrim":
  40. arg0 := common.ToString(args[0])
  41. return strings.TrimLeftFunc(arg0, unicode.IsSpace), true
  42. case "numbytes":
  43. arg0 := common.ToString(args[0])
  44. return len(arg0), true
  45. case "format_time":
  46. arg0 := args[0]
  47. if t, ok := arg0.(time.Time); ok{
  48. arg1 := common.ToString(args[1])
  49. if s, err := common.FormatTime(t, arg1); err==nil{
  50. return s, true
  51. }
  52. }
  53. return "", false
  54. case "regexp_matches":
  55. arg0, arg1 := common.ToString(args[0]), common.ToString(args[1])
  56. if matched, err := regexp.MatchString(arg1, arg0); err != nil{
  57. return err, false
  58. }else{
  59. return matched, true
  60. }
  61. case "regexp_replace":
  62. arg0, arg1, arg2 := common.ToString(args[0]), common.ToString(args[1]), common.ToString(args[2])
  63. if re, err := regexp.Compile(arg1); err != nil{
  64. return err, false
  65. }else{
  66. return re.ReplaceAllString(arg0, arg2), true
  67. }
  68. case "regexp_substr":
  69. arg0, arg1 := common.ToString(args[0]), common.ToString(args[1])
  70. if re, err := regexp.Compile(arg1); err != nil{
  71. return err, false
  72. }else{
  73. return re.FindString(arg0), true
  74. }
  75. case "rpad":
  76. arg0 := common.ToString(args[0])
  77. arg1, err := common.ToInt(args[1])
  78. if err != nil{
  79. return err, false
  80. }
  81. return arg0 + strings.Repeat(" ", arg1), true
  82. case "rtrim":
  83. arg0 := common.ToString(args[0])
  84. return strings.TrimRightFunc(arg0, unicode.IsSpace), true
  85. case "substring":
  86. arg0 := common.ToString(args[0])
  87. arg1, err := common.ToInt(args[1])
  88. if err != nil{
  89. return err, false
  90. }
  91. if len(args) > 2{
  92. arg2, err := common.ToInt(args[2])
  93. if err != nil{
  94. return err, false
  95. }
  96. return arg0[arg1:arg2], true
  97. }else{
  98. return arg0[arg1:], true
  99. }
  100. case "startswith":
  101. arg0, arg1 := common.ToString(args[0]), common.ToString(args[1])
  102. return strings.HasPrefix(arg0, arg1), true
  103. case "trim":
  104. arg0 := common.ToString(args[0])
  105. return strings.TrimSpace(arg0), true
  106. case "upper":
  107. arg0 := common.ToString(args[0])
  108. return strings.ToUpper(arg0), true
  109. default:
  110. return fmt.Errorf("unknown string function name %s", name), false
  111. }
  112. }