converter.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package converter
  2. import (
  3. "io"
  4. "strings"
  5. "github.com/influxdata/influxql"
  6. "github.com/pkg/errors"
  7. "github.com/zexi/influxql-to-metricsql/converter/translator"
  8. )
  9. type Converter interface {
  10. Translate() (string, error)
  11. TranslateWithTimeRange() (string, *influxql.TimeRange, error)
  12. }
  13. type converter struct {
  14. influxParser *influxql.Parser
  15. translator translator.Translator
  16. }
  17. func Translate(influxQL string) (string, error) {
  18. return New(strings.NewReader(influxQL)).Translate()
  19. }
  20. func TranslateWithTimeRange(influxQL string) (string, *influxql.TimeRange, error) {
  21. return New(strings.NewReader(influxQL)).TranslateWithTimeRange()
  22. }
  23. func New(r io.Reader) Converter {
  24. c := &converter{
  25. influxParser: influxql.NewParser(r),
  26. translator: translator.NewPromQL(),
  27. }
  28. return c
  29. }
  30. func (c converter) Translate() (string, error) {
  31. q, err := c.influxParser.ParseQuery()
  32. if err != nil {
  33. return "", errors.Wrap(err, "influxParser.ParserQuery")
  34. }
  35. if len(q.Statements) > 1 {
  36. return "", errors.Errorf("Only support 1 statement translating")
  37. }
  38. return c.translator.Translate(q.Statements[0])
  39. }
  40. func (c converter) TranslateWithTimeRange() (string, *influxql.TimeRange, error) {
  41. promQL, err := c.Translate()
  42. if err != nil {
  43. return "", nil, errors.Wrap(err, "Translate")
  44. }
  45. return promQL, c.translator.GetTimeRange(), nil
  46. }