util.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package xsql
  2. import (
  3. "strings"
  4. )
  5. func PrintFieldType(ft FieldType) (result string) {
  6. switch t := ft.(type) {
  7. case *BasicType:
  8. result = t.Type.String()
  9. case *ArrayType:
  10. result = "array("
  11. if t.FieldType != nil {
  12. result += PrintFieldType(t.FieldType)
  13. } else {
  14. result += t.Type.String()
  15. }
  16. result += ")"
  17. case *RecType:
  18. result = "struct("
  19. isFirst := true
  20. for _, f := range t.StreamFields {
  21. if isFirst {
  22. isFirst = false
  23. } else {
  24. result += ", "
  25. }
  26. result = result + f.Name + " " + PrintFieldType(f.FieldType)
  27. }
  28. result += ")"
  29. }
  30. return
  31. }
  32. func GetStreams(stmt *SelectStatement) (result []string) {
  33. if stmt == nil {
  34. return nil
  35. }
  36. for _, source := range stmt.Sources {
  37. if s, ok := source.(*Table); ok {
  38. result = append(result, s.Name)
  39. }
  40. }
  41. for _, join := range stmt.Joins {
  42. result = append(result, join.Name)
  43. }
  44. return
  45. }
  46. func LowercaseKeyMap(m map[string]interface{}, orig map[string]interface{}) map[string]interface{} {
  47. m1 := make(map[string]interface{})
  48. for k, v := range m {
  49. if m2, ok := v.(map[string]interface{}); ok {
  50. o1 := make(map[string]interface{})
  51. orig[k] = o1
  52. m1[strings.ToLower(k)] = LowercaseKeyMap(m2, o1)
  53. } else {
  54. m1[strings.ToLower(k)] = v
  55. orig[k] = nil
  56. }
  57. }
  58. return m1
  59. }
  60. //TODO To handle nested types?
  61. func GetOriginalKey(lkey string, okeys map[string]interface{}) (bool, string){
  62. for k, _ := range okeys {
  63. if strings.ToLower(k) == lkey {
  64. return true, k
  65. }
  66. }
  67. return false, ""
  68. }