querystring_builder.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import moment from 'moment';
  2. export default class LogAnalyticsQuerystringBuilder {
  3. constructor(public rawQueryString, public options, public defaultTimeField) {}
  4. generate() {
  5. let queryString = this.rawQueryString;
  6. const macroRegexp = /\$__([_a-zA-Z0-9]+)\(([^\)]*)\)/gi;
  7. queryString = queryString.replace(macroRegexp, (match, p1, p2) => {
  8. if (p1 === 'contains') {
  9. return this.getMultiContains(p2);
  10. }
  11. return match;
  12. });
  13. queryString = queryString.replace(/\$__escapeMulti\(('[^]*')\)/gi, (match, p1) => this.escape(p1));
  14. if (this.options) {
  15. queryString = queryString.replace(macroRegexp, (match, p1, p2) => {
  16. if (p1 === 'timeFilter') {
  17. return this.getTimeFilter(p2, this.options);
  18. }
  19. return match;
  20. });
  21. queryString = queryString.replace(/\$__interval/gi, this.options.interval);
  22. queryString = queryString.replace(/\$__from/gi, this.getFrom(this.options));
  23. queryString = queryString.replace(/\$__to/gi, this.getUntil(this.options));
  24. }
  25. const rawQuery = queryString;
  26. queryString = encodeURIComponent(queryString);
  27. const uriString = `query=${queryString}`;
  28. return { uriString, rawQuery };
  29. }
  30. getFrom(options) {
  31. const from = options.range.from;
  32. return `datetime(${moment(from)
  33. .startOf('minute')
  34. .toISOString()})`;
  35. }
  36. getUntil(options) {
  37. if (options.rangeRaw.to === 'now') {
  38. return 'now()';
  39. } else {
  40. const until = options.range.to;
  41. return `datetime(${moment(until)
  42. .startOf('minute')
  43. .toISOString()})`;
  44. }
  45. }
  46. getTimeFilter(timeFieldArg, options) {
  47. const timeField = timeFieldArg || this.defaultTimeField;
  48. if (options.rangeRaw.to === 'now') {
  49. return `${timeField} >= ${this.getFrom(options)}`;
  50. } else {
  51. return `${timeField} >= ${this.getFrom(options)} and ${timeField} <= ${this.getUntil(options)}`;
  52. }
  53. }
  54. getMultiContains(inputs: string) {
  55. const firstCommaIndex = inputs.indexOf(',');
  56. const field = inputs.substring(0, firstCommaIndex);
  57. const templateVar = inputs.substring(inputs.indexOf(',') + 1);
  58. if (templateVar && templateVar.toLowerCase().trim() === 'all') {
  59. return '1 == 1';
  60. }
  61. return `${field.trim()} in (${templateVar.trim()})`;
  62. }
  63. escape(inputs: string) {
  64. return inputs
  65. .substring(1, inputs.length - 1)
  66. .split(`','`)
  67. .map(v => `@'${v}'`)
  68. .join(', ');
  69. }
  70. }