response_parser.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import _ from 'lodash';
  2. export default class ResponseParser {
  3. parse(query, results) {
  4. if (!results || results.results.length === 0) {
  5. return [];
  6. }
  7. const influxResults = results.results[0];
  8. if (!influxResults.series) {
  9. return [];
  10. }
  11. const normalizedQuery = query.toLowerCase();
  12. const isValueFirst =
  13. normalizedQuery.indexOf('show field keys') >= 0 || normalizedQuery.indexOf('show retention policies') >= 0;
  14. const res = {};
  15. _.each(influxResults.series, serie => {
  16. _.each(serie.values, value => {
  17. if (_.isArray(value)) {
  18. // In general, there are 2 possible shapes for the returned value.
  19. // The first one is a two-element array,
  20. // where the first element is somewhat a metadata value:
  21. // the tag name for SHOW TAG VALUES queries,
  22. // the time field for SELECT queries, etc.
  23. // The second shape is an one-element array,
  24. // that is containing an immediate value.
  25. // For example, SHOW FIELD KEYS queries return such shape.
  26. // Note, pre-0.11 versions return
  27. // the second shape for SHOW TAG VALUES queries
  28. // (while the newer versions—first).
  29. if (isValueFirst) {
  30. addUnique(res, value[0]);
  31. } else if (value[1] !== undefined) {
  32. addUnique(res, value[1]);
  33. } else {
  34. addUnique(res, value[0]);
  35. }
  36. } else {
  37. addUnique(res, value);
  38. }
  39. });
  40. });
  41. // @ts-ignore problems with typings for this _.map only accepts [] but this needs to be object
  42. return _.map(res, value => {
  43. // @ts-ignore
  44. return { text: value.toString() };
  45. });
  46. }
  47. }
  48. function addUnique(arr, value) {
  49. arr[value] = value;
  50. }