query_part.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package influxdb
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. var renders map[string]QueryDefinition
  7. type DefinitionParameters struct {
  8. Name string
  9. Type string
  10. }
  11. type QueryDefinition struct {
  12. Renderer func(part *QueryPart, innerExpr string) string
  13. Params []DefinitionParameters
  14. }
  15. func init() {
  16. renders = make(map[string]QueryDefinition)
  17. renders["field"] = QueryDefinition{Renderer: fieldRenderer}
  18. renders["spread"] = QueryDefinition{Renderer: functionRenderer}
  19. renders["count"] = QueryDefinition{Renderer: functionRenderer}
  20. renders["distinct"] = QueryDefinition{Renderer: functionRenderer}
  21. renders["integral"] = QueryDefinition{Renderer: functionRenderer}
  22. renders["mean"] = QueryDefinition{Renderer: functionRenderer}
  23. renders["median"] = QueryDefinition{Renderer: functionRenderer}
  24. renders["sum"] = QueryDefinition{Renderer: functionRenderer}
  25. renders["derivative"] = QueryDefinition{
  26. Renderer: functionRenderer,
  27. Params: []DefinitionParameters{{Name: "duration", Type: "interval"}},
  28. }
  29. renders["non_negative_derivative"] = QueryDefinition{
  30. Renderer: functionRenderer,
  31. Params: []DefinitionParameters{{Name: "duration", Type: "interval"}},
  32. }
  33. renders["difference"] = QueryDefinition{Renderer: functionRenderer}
  34. renders["moving_average"] = QueryDefinition{
  35. Renderer: functionRenderer,
  36. Params: []DefinitionParameters{{Name: "window", Type: "number"}},
  37. }
  38. renders["stddev"] = QueryDefinition{Renderer: functionRenderer}
  39. renders["time"] = QueryDefinition{
  40. Renderer: functionRenderer,
  41. Params: []DefinitionParameters{{Name: "interval", Type: "time"}},
  42. }
  43. renders["fill"] = QueryDefinition{
  44. Renderer: functionRenderer,
  45. Params: []DefinitionParameters{{Name: "fill", Type: "string"}},
  46. }
  47. renders["elapsed"] = QueryDefinition{
  48. Renderer: functionRenderer,
  49. Params: []DefinitionParameters{{Name: "duration", Type: "interval"}},
  50. }
  51. renders["bottom"] = QueryDefinition{
  52. Renderer: functionRenderer,
  53. Params: []DefinitionParameters{{Name: "count", Type: "int"}},
  54. }
  55. renders["first"] = QueryDefinition{Renderer: functionRenderer}
  56. renders["last"] = QueryDefinition{Renderer: functionRenderer}
  57. renders["max"] = QueryDefinition{Renderer: functionRenderer}
  58. renders["min"] = QueryDefinition{Renderer: functionRenderer}
  59. renders["percentile"] = QueryDefinition{
  60. Renderer: functionRenderer,
  61. Params: []DefinitionParameters{{Name: "nth", Type: "int"}},
  62. }
  63. renders["top"] = QueryDefinition{
  64. Renderer: functionRenderer,
  65. Params: []DefinitionParameters{{Name: "count", Type: "int"}},
  66. }
  67. renders["tag"] = QueryDefinition{
  68. Renderer: fieldRenderer,
  69. Params: []DefinitionParameters{{Name: "tag", Type: "string"}},
  70. }
  71. renders["math"] = QueryDefinition{Renderer: suffixRenderer}
  72. renders["alias"] = QueryDefinition{Renderer: aliasRenderer}
  73. }
  74. func fieldRenderer(part *QueryPart, innerExpr string) string {
  75. if part.Params[0] == "*" {
  76. return "*"
  77. }
  78. return fmt.Sprintf(`"%s"`, part.Params[0])
  79. }
  80. func functionRenderer(part *QueryPart, innerExpr string) string {
  81. if innerExpr != "" {
  82. part.Params = append([]string{innerExpr}, part.Params...)
  83. }
  84. params := strings.Join(part.Params, ", ")
  85. return fmt.Sprintf("%s(%s)", part.Type, params)
  86. }
  87. func suffixRenderer(part *QueryPart, innerExpr string) string {
  88. return fmt.Sprintf("%s %s", innerExpr, part.Params[0])
  89. }
  90. func aliasRenderer(part *QueryPart, innerExpr string) string {
  91. return fmt.Sprintf(`%s AS "%s"`, innerExpr, part.Params[0])
  92. }
  93. func (r QueryDefinition) Render(part *QueryPart, innerExpr string) string {
  94. return r.Renderer(part, innerExpr)
  95. }
  96. func NewQueryPart(typ string, params []string) (*QueryPart, error) {
  97. def, exist := renders[typ]
  98. if !exist {
  99. return nil, fmt.Errorf("Missing query definition for %s", typ)
  100. }
  101. return &QueryPart{
  102. Type: typ,
  103. Params: params,
  104. Def: def,
  105. }, nil
  106. }
  107. type QueryPart struct {
  108. Def QueryDefinition
  109. Type string
  110. Params []string
  111. }
  112. func (qp *QueryPart) Render(expr string) string {
  113. return qp.Def.Renderer(qp, expr)
  114. }