query_part.go 3.8 KB

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