query_builder_specs.ts 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. ///<amd-dependency path="app/plugins/datasource/influxdb/query_builder" name="InfluxQueryBuilder"/>
  2. import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
  3. declare var InfluxQueryBuilder: any;
  4. describe('InfluxQueryBuilder', function() {
  5. describe('series with mesurement only', function() {
  6. it('should generate correct query', function() {
  7. var builder = new InfluxQueryBuilder({
  8. measurement: 'cpu',
  9. groupBy: [{type: 'time', interval: 'auto'}]
  10. });
  11. var query = builder.build();
  12. expect(query).to.be('SELECT mean("value") AS "value" FROM "cpu" WHERE $timeFilter GROUP BY time($interval)');
  13. });
  14. });
  15. describe('series with math expr and as expr', function() {
  16. it('should generate correct query', function() {
  17. var builder = new InfluxQueryBuilder({
  18. measurement: 'cpu',
  19. fields: [{name: 'test', func: 'max', mathExpr: '*2', asExpr: 'new_name'}],
  20. groupBy: [{type: 'time', interval: 'auto'}]
  21. });
  22. var query = builder.build();
  23. expect(query).to.be('SELECT max("test")*2 AS "new_name" FROM "cpu" WHERE $timeFilter GROUP BY time($interval)');
  24. });
  25. });
  26. describe('series with single tag only', function() {
  27. it('should generate correct query', function() {
  28. var builder = new InfluxQueryBuilder({
  29. measurement: 'cpu',
  30. groupBy: [{type: 'time', interval: 'auto'}],
  31. tags: [{key: 'hostname', value: 'server1'}]
  32. });
  33. var query = builder.build();
  34. expect(query).to.be('SELECT mean("value") AS "value" FROM "cpu" WHERE "hostname" = \'server1\' AND $timeFilter'
  35. + ' GROUP BY time($interval)');
  36. });
  37. it('should switch regex operator with tag value is regex', function() {
  38. var builder = new InfluxQueryBuilder({
  39. measurement: 'cpu',
  40. groupBy: [{type: 'time', interval: 'auto'}],
  41. tags: [{key: 'app', value: '/e.*/'}]
  42. });
  43. var query = builder.build();
  44. expect(query).to.be('SELECT mean("value") AS "value" FROM "cpu" WHERE "app" =~ /e.*/ AND $timeFilter GROUP BY time($interval)');
  45. });
  46. });
  47. describe('series with multiple fields', function() {
  48. it('should generate correct query', function() {
  49. var builder = new InfluxQueryBuilder({
  50. measurement: 'cpu',
  51. tags: [],
  52. groupBy: [{type: 'time', interval: 'auto'}],
  53. fields: [{ name: 'tx_in', func: 'sum' }, { name: 'tx_out', func: 'mean' }]
  54. });
  55. var query = builder.build();
  56. expect(query).to.be('SELECT sum("tx_in") AS "tx_in", mean("tx_out") AS "tx_out" ' +
  57. 'FROM "cpu" WHERE $timeFilter GROUP BY time($interval)');
  58. });
  59. });
  60. describe('series with multiple tags only', function() {
  61. it('should generate correct query', function() {
  62. var builder = new InfluxQueryBuilder({
  63. measurement: 'cpu',
  64. groupBy: [{type: 'time', interval: 'auto'}],
  65. tags: [{key: 'hostname', value: 'server1'}, {key: 'app', value: 'email', condition: "AND"}]
  66. });
  67. var query = builder.build();
  68. expect(query).to.be('SELECT mean("value") AS "value" FROM "cpu" WHERE "hostname" = \'server1\' AND "app" = \'email\' AND ' +
  69. '$timeFilter GROUP BY time($interval)');
  70. });
  71. });
  72. describe('series with tags OR condition', function() {
  73. it('should generate correct query', function() {
  74. var builder = new InfluxQueryBuilder({
  75. measurement: 'cpu',
  76. groupBy: [{type: 'time', interval: 'auto'}],
  77. tags: [{key: 'hostname', value: 'server1'}, {key: 'hostname', value: 'server2', condition: "OR"}]
  78. });
  79. var query = builder.build();
  80. expect(query).to.be('SELECT mean("value") AS "value" FROM "cpu" WHERE "hostname" = \'server1\' OR "hostname" = \'server2\' AND ' +
  81. '$timeFilter GROUP BY time($interval)');
  82. });
  83. });
  84. describe('series with groupByTag', function() {
  85. it('should generate correct query', function() {
  86. var builder = new InfluxQueryBuilder({
  87. measurement: 'cpu',
  88. tags: [],
  89. groupBy: [{type: 'time', interval: 'auto'}, {type: 'tag', key: 'host'}],
  90. });
  91. var query = builder.build();
  92. expect(query).to.be('SELECT mean("value") AS "value" FROM "cpu" WHERE $timeFilter ' +
  93. 'GROUP BY time($interval), "host"');
  94. });
  95. });
  96. describe('when building explore queries', function() {
  97. it('should only have measurement condition in tag keys query given query with measurement', function() {
  98. var builder = new InfluxQueryBuilder({ measurement: 'cpu', tags: [] });
  99. var query = builder.buildExploreQuery('TAG_KEYS');
  100. expect(query).to.be('SHOW TAG KEYS FROM "cpu"');
  101. });
  102. it('should handle regex measurement in tag keys query', function() {
  103. var builder = new InfluxQueryBuilder({
  104. measurement: '/.*/',
  105. tags: []
  106. });
  107. var query = builder.buildExploreQuery('TAG_KEYS');
  108. expect(query).to.be('SHOW TAG KEYS FROM /.*/');
  109. });
  110. it('should have no conditions in tags keys query given query with no measurement or tag', function() {
  111. var builder = new InfluxQueryBuilder({ measurement: '', tags: [] });
  112. var query = builder.buildExploreQuery('TAG_KEYS');
  113. expect(query).to.be('SHOW TAG KEYS');
  114. });
  115. it('should have where condition in tag keys query with tags', function() {
  116. var builder = new InfluxQueryBuilder({ measurement: '', tags: [{key: 'host', value: 'se1'}] });
  117. var query = builder.buildExploreQuery('TAG_KEYS');
  118. expect(query).to.be("SHOW TAG KEYS WHERE \"host\" = 'se1'");
  119. });
  120. it('should have no conditions in measurement query for query with no tags', function() {
  121. var builder = new InfluxQueryBuilder({ measurement: '', tags: [] });
  122. var query = builder.buildExploreQuery('MEASUREMENTS');
  123. expect(query).to.be('SHOW MEASUREMENTS');
  124. });
  125. it('should have where condition in measurement query for query with tags', function() {
  126. var builder = new InfluxQueryBuilder({measurement: '', tags: [{key: 'app', value: 'email'}]});
  127. var query = builder.buildExploreQuery('MEASUREMENTS');
  128. expect(query).to.be("SHOW MEASUREMENTS WHERE \"app\" = 'email'");
  129. });
  130. it('should have where tag name IN filter in tag values query for query with one tag', function() {
  131. var builder = new InfluxQueryBuilder({measurement: '', tags: [{key: 'app', value: 'asdsadsad'}]});
  132. var query = builder.buildExploreQuery('TAG_VALUES', 'app');
  133. expect(query).to.be('SHOW TAG VALUES WITH KEY = "app"');
  134. });
  135. it('should have measurement tag condition and tag name IN filter in tag values query', function() {
  136. var builder = new InfluxQueryBuilder({measurement: 'cpu', tags: [{key: 'app', value: 'email'}, {key: 'host', value: 'server1'}]});
  137. var query = builder.buildExploreQuery('TAG_VALUES', 'app');
  138. expect(query).to.be('SHOW TAG VALUES FROM "cpu" WITH KEY = "app" WHERE "host" = \'server1\'');
  139. });
  140. it('should switch to regex operator in tag condition', function() {
  141. var builder = new InfluxQueryBuilder({measurement: 'cpu', tags: [{key: 'host', value: '/server.*/'}]});
  142. var query = builder.buildExploreQuery('TAG_VALUES', 'app');
  143. expect(query).to.be('SHOW TAG VALUES FROM "cpu" WITH KEY = "app" WHERE "host" =~ /server.*/');
  144. });
  145. it('should build show field query', function() {
  146. var builder = new InfluxQueryBuilder({measurement: 'cpu', tags: [{key: 'app', value: 'email'}]});
  147. var query = builder.buildExploreQuery('FIELDS');
  148. expect(query).to.be('SHOW FIELD KEYS FROM "cpu"');
  149. });
  150. });
  151. });