query_builder.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. define([
  2. 'lodash'
  3. ],
  4. function (_) {
  5. 'use strict';
  6. function InfluxQueryBuilder(target, queryModel) {
  7. this.target = target;
  8. this.model = queryModel;
  9. if (target.groupByTags) {
  10. target.groupBy = [{type: 'time', interval: 'auto'}];
  11. for (var i in target.groupByTags) {
  12. target.groupBy.push({type: 'tag', key: target.groupByTags[i]});
  13. }
  14. delete target.groupByTags;
  15. }
  16. }
  17. function renderTagCondition (tag, index) {
  18. var str = "";
  19. var operator = tag.operator;
  20. var value = tag.value;
  21. if (index > 0) {
  22. str = (tag.condition || 'AND') + ' ';
  23. }
  24. if (!operator) {
  25. if (/^\/.*\/$/.test(tag.value)) {
  26. operator = '=~';
  27. } else {
  28. operator = '=';
  29. }
  30. }
  31. // quote value unless regex
  32. if (operator !== '=~' && operator !== '!~') {
  33. value = "'" + value + "'";
  34. }
  35. return str + '"' + tag.key + '" ' + operator + ' ' + value;
  36. }
  37. var p = InfluxQueryBuilder.prototype;
  38. p.build = function() {
  39. return this.target.rawQuery ? this._modifyRawQuery() : this._buildQuery();
  40. };
  41. p.buildExploreQuery = function(type, withKey) {
  42. var query;
  43. var measurement;
  44. if (type === 'TAG_KEYS') {
  45. query = 'SHOW TAG KEYS';
  46. measurement = this.target.measurement;
  47. } else if (type === 'TAG_VALUES') {
  48. query = 'SHOW TAG VALUES';
  49. measurement = this.target.measurement;
  50. } else if (type === 'MEASUREMENTS') {
  51. query = 'SHOW MEASUREMENTS';
  52. } else if (type === 'FIELDS') {
  53. query = 'SHOW FIELD KEYS FROM "' + this.target.measurement + '"';
  54. return query;
  55. }
  56. if (measurement) {
  57. if (!measurement.match('^/.*/') && !measurement.match(/^merge\(.*\)/)) {
  58. measurement = '"' + measurement+ '"';
  59. }
  60. query += ' FROM ' + measurement;
  61. }
  62. if (withKey) {
  63. query += ' WITH KEY = "' + withKey + '"';
  64. }
  65. if (this.target.tags && this.target.tags.length > 0) {
  66. var whereConditions = _.reduce(this.target.tags, function(memo, tag) {
  67. // do not add a condition for the key we want to explore for
  68. if (tag.key === withKey) {
  69. return memo;
  70. }
  71. memo.push(renderTagCondition(tag, memo.length));
  72. return memo;
  73. }, []);
  74. if (whereConditions.length > 0) {
  75. query += ' WHERE ' + whereConditions.join(' ');
  76. }
  77. }
  78. return query;
  79. };
  80. return InfluxQueryBuilder;
  81. });