util.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package xsql
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. )
  7. func PrintFieldType(ft FieldType) (result string) {
  8. switch t := ft.(type) {
  9. case *BasicType:
  10. result = t.Type.String()
  11. case *ArrayType:
  12. result = "array("
  13. if t.FieldType != nil {
  14. result += PrintFieldType(t.FieldType)
  15. } else {
  16. result += t.Type.String()
  17. }
  18. result += ")"
  19. case *RecType:
  20. result = "struct("
  21. isFirst := true
  22. for _, f := range t.StreamFields {
  23. if isFirst {
  24. isFirst = false
  25. } else {
  26. result += ", "
  27. }
  28. result = result + f.Name + " " + PrintFieldType(f.FieldType)
  29. }
  30. result += ")"
  31. }
  32. return
  33. }
  34. func PrintFieldTypeForJson(ft FieldType) (result interface{}) {
  35. r, q := doPrintFieldTypeForJson(ft)
  36. if q {
  37. return r
  38. } else {
  39. return json.RawMessage(r)
  40. }
  41. }
  42. func doPrintFieldTypeForJson(ft FieldType) (result string, isLiteral bool) {
  43. switch t := ft.(type) {
  44. case *BasicType:
  45. return t.Type.String(), true
  46. case *ArrayType:
  47. var (
  48. fieldType string
  49. q bool
  50. )
  51. if t.FieldType != nil {
  52. fieldType, q = doPrintFieldTypeForJson(t.FieldType)
  53. } else {
  54. fieldType, q = t.Type.String(), true
  55. }
  56. if q {
  57. result = fmt.Sprintf(`{"Type":"array","ElementType":"%s"}`, fieldType)
  58. } else {
  59. result = fmt.Sprintf(`{"Type":"array","ElementType":%s}`, fieldType)
  60. }
  61. case *RecType:
  62. result = `{"Type":"struct","Fields":[`
  63. isFirst := true
  64. for _, f := range t.StreamFields {
  65. if isFirst {
  66. isFirst = false
  67. } else {
  68. result += ","
  69. }
  70. fieldType, q := doPrintFieldTypeForJson(f.FieldType)
  71. if q {
  72. result = fmt.Sprintf(`%s{"FieldType":"%s","Name":"%s"}`, result, fieldType, f.Name)
  73. } else {
  74. result = fmt.Sprintf(`%s{"FieldType":"%s","Name":"%s"}`, result, fieldType, f.Name)
  75. }
  76. }
  77. result += `]}`
  78. }
  79. return result, false
  80. }
  81. func GetStreams(stmt *SelectStatement) (result []string) {
  82. if stmt == nil {
  83. return nil
  84. }
  85. for _, source := range stmt.Sources {
  86. if s, ok := source.(*Table); ok {
  87. result = append(result, s.Name)
  88. }
  89. }
  90. for _, join := range stmt.Joins {
  91. result = append(result, join.Name)
  92. }
  93. return
  94. }
  95. func LowercaseKeyMap(m map[string]interface{}) map[string]interface{} {
  96. m1 := make(map[string]interface{})
  97. for k, v := range m {
  98. if m2, ok := v.(map[string]interface{}); ok {
  99. m1[strings.ToLower(k)] = LowercaseKeyMap(m2)
  100. } else {
  101. m1[strings.ToLower(k)] = v
  102. }
  103. }
  104. return m1
  105. }