model_parser.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package influxdb
  2. import (
  3. "strconv"
  4. "github.com/grafana/grafana/pkg/components/simplejson"
  5. )
  6. type InfluxdbQueryParser struct{}
  7. func (qp *InfluxdbQueryParser) Parse(model *simplejson.Json) (*Query, error) {
  8. policy := model.Get("policy").MustString("default")
  9. rawQuery := model.Get("query").MustString("")
  10. measurement, err := model.Get("measurement").String()
  11. if err != nil {
  12. return nil, err
  13. }
  14. resultFormat, err := model.Get("resultFormat").String()
  15. if err != nil {
  16. return nil, err
  17. }
  18. tags, err := qp.parseTags(model)
  19. if err != nil {
  20. return nil, err
  21. }
  22. groupBys, err := qp.parseGroupBy(model)
  23. if err != nil {
  24. return nil, err
  25. }
  26. selects, err := qp.parseSelects(model)
  27. if err != nil {
  28. return nil, err
  29. }
  30. return &Query{
  31. Measurement: measurement,
  32. Policy: policy,
  33. ResultFormat: resultFormat,
  34. GroupBy: groupBys,
  35. Tags: tags,
  36. Selects: selects,
  37. RawQuery: rawQuery,
  38. }, nil
  39. }
  40. func (qp *InfluxdbQueryParser) parseSelects(model *simplejson.Json) ([]*Select, error) {
  41. var result []*Select
  42. for _, selectObj := range model.Get("select").MustArray() {
  43. selectJson := simplejson.NewFromAny(selectObj)
  44. var parts Select
  45. for _, partObj := range selectJson.MustArray() {
  46. part := simplejson.NewFromAny(partObj)
  47. queryPart, err := qp.parseQueryPart(part)
  48. if err != nil {
  49. return nil, err
  50. }
  51. parts = append(parts, *queryPart)
  52. }
  53. result = append(result, &parts)
  54. }
  55. return result, nil
  56. }
  57. func (*InfluxdbQueryParser) parseTags(model *simplejson.Json) ([]*Tag, error) {
  58. var result []*Tag
  59. for _, t := range model.Get("tags").MustArray() {
  60. tagJson := simplejson.NewFromAny(t)
  61. tag := &Tag{}
  62. var err error
  63. tag.Key, err = tagJson.Get("key").String()
  64. if err != nil {
  65. return nil, err
  66. }
  67. tag.Value, err = tagJson.Get("value").String()
  68. if err != nil {
  69. return nil, err
  70. }
  71. operator, err := tagJson.Get("operator").String()
  72. if err == nil {
  73. tag.Operator = operator
  74. }
  75. condition, err := tagJson.Get("condition").String()
  76. if err == nil {
  77. tag.Condition = condition
  78. }
  79. result = append(result, tag)
  80. }
  81. return result, nil
  82. }
  83. func (*InfluxdbQueryParser) parseQueryPart(model *simplejson.Json) (*QueryPart, error) {
  84. typ, err := model.Get("type").String()
  85. if err != nil {
  86. return nil, err
  87. }
  88. var params []string
  89. for _, paramObj := range model.Get("params").MustArray() {
  90. param := simplejson.NewFromAny(paramObj)
  91. stringParam, err := param.String()
  92. if err == nil {
  93. params = append(params, stringParam)
  94. continue
  95. }
  96. intParam, err := param.Int()
  97. if err == nil {
  98. params = append(params, strconv.Itoa(intParam))
  99. continue
  100. }
  101. return nil, err
  102. }
  103. qp, err := NewQueryPart(typ, params)
  104. if err != nil {
  105. return nil, err
  106. }
  107. return qp, nil
  108. }
  109. func (qp *InfluxdbQueryParser) parseGroupBy(model *simplejson.Json) ([]*QueryPart, error) {
  110. var result []*QueryPart
  111. for _, groupObj := range model.Get("groupBy").MustArray() {
  112. groupJson := simplejson.NewFromAny(groupObj)
  113. queryPart, err := qp.parseQueryPart(groupJson)
  114. if err != nil {
  115. return nil, err
  116. }
  117. result = append(result, queryPart)
  118. }
  119. return result, nil
  120. }