time_grain_converter.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import _ from 'lodash';
  2. import kbn from 'app/core/utils/kbn';
  3. export default class TimeGrainConverter {
  4. static createISO8601Duration(timeGrain, timeGrainUnit) {
  5. const timeIntervals = ['hour', 'minute', 'h', 'm'];
  6. if (_.includes(timeIntervals, timeGrainUnit)) {
  7. return `PT${timeGrain}${timeGrainUnit[0].toUpperCase()}`;
  8. }
  9. return `P${timeGrain}${timeGrainUnit[0].toUpperCase()}`;
  10. }
  11. static createISO8601DurationFromInterval(interval: string) {
  12. const timeGrain = +interval.slice(0, interval.length - 1);
  13. const unit = interval[interval.length - 1];
  14. if (interval.indexOf('ms') > -1) {
  15. return TimeGrainConverter.createISO8601Duration(1, 'm');
  16. }
  17. if (interval[interval.length - 1] === 's') {
  18. let toMinutes = (timeGrain * 60) % 60;
  19. if (toMinutes < 1) {
  20. toMinutes = 1;
  21. }
  22. return TimeGrainConverter.createISO8601Duration(toMinutes, 'm');
  23. }
  24. return TimeGrainConverter.createISO8601Duration(timeGrain, unit);
  25. }
  26. static findClosestTimeGrain(interval, allowedTimeGrains) {
  27. const timeGrains = _.filter(allowedTimeGrains, o => o !== 'auto');
  28. let closest = timeGrains[0];
  29. const intervalMs = kbn.interval_to_ms(interval);
  30. for (let i = 0; i < timeGrains.length; i++) {
  31. // abs (num - val) < abs (num - curr):
  32. if (intervalMs > kbn.interval_to_ms(timeGrains[i])) {
  33. if (i + 1 < timeGrains.length) {
  34. closest = timeGrains[i + 1];
  35. } else {
  36. closest = timeGrains[i];
  37. }
  38. }
  39. }
  40. return closest;
  41. }
  42. static createTimeGrainFromISO8601Duration(duration: string) {
  43. let offset = 1;
  44. if (duration.substring(0, 2) === 'PT') {
  45. offset = 2;
  46. }
  47. const value = duration.substring(offset, duration.length - 1);
  48. const unit = duration.substring(duration.length - 1);
  49. return value + ' ' + TimeGrainConverter.timeUnitToText(+value, unit);
  50. }
  51. static timeUnitToText(value: number, unit: string) {
  52. let text = '';
  53. if (unit === 'S') {
  54. text = 'second';
  55. }
  56. if (unit === 'M') {
  57. text = 'minute';
  58. }
  59. if (unit === 'H') {
  60. text = 'hour';
  61. }
  62. if (unit === 'D') {
  63. text = 'day';
  64. }
  65. if (value > 1) {
  66. return text + 's';
  67. }
  68. return text;
  69. }
  70. static createKbnUnitFromISO8601Duration(duration: string) {
  71. if (duration === 'auto') {
  72. return 'auto';
  73. }
  74. let offset = 1;
  75. if (duration.substring(0, 2) === 'PT') {
  76. offset = 2;
  77. }
  78. const value = duration.substring(offset, duration.length - 1);
  79. const unit = duration.substring(duration.length - 1);
  80. return value + TimeGrainConverter.timeUnitToKbn(+value, unit);
  81. }
  82. static timeUnitToKbn(value: number, unit: string) {
  83. if (unit === 'S') {
  84. return 's';
  85. }
  86. if (unit === 'M') {
  87. return 'm';
  88. }
  89. if (unit === 'H') {
  90. return 'h';
  91. }
  92. if (unit === 'D') {
  93. return 'd';
  94. }
  95. return '';
  96. }
  97. }