query_builder_specs.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
  2. import ElasticQueryBuilder from '../query_builder';
  3. describe('ElasticQueryBuilder', function() {
  4. var builder;
  5. beforeEach(function() {
  6. builder = new ElasticQueryBuilder({timeField: '@timestamp'});
  7. });
  8. it('with defaults', function() {
  9. var query = builder.build({
  10. metrics: [{type: 'Count', id: '0'}],
  11. timeField: '@timestamp',
  12. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '1'}],
  13. });
  14. expect(query.query.filtered.filter.bool.must[0].range["@timestamp"].gte).to.be("$timeFrom");
  15. expect(query.aggs["1"].date_histogram.extended_bounds.min).to.be("$timeFrom");
  16. });
  17. it('with multiple bucket aggs', function() {
  18. var query = builder.build({
  19. metrics: [{type: 'count', id: '1'}],
  20. timeField: '@timestamp',
  21. bucketAggs: [
  22. {type: 'terms', field: '@host', id: '2'},
  23. {type: 'date_histogram', field: '@timestamp', id: '3'}
  24. ],
  25. });
  26. expect(query.aggs["2"].terms.field).to.be("@host");
  27. expect(query.aggs["2"].aggs["3"].date_histogram.field).to.be("@timestamp");
  28. });
  29. it('with es1.x and es2.x date histogram queries check time format', function() {
  30. var builder_2x = new ElasticQueryBuilder({
  31. timeField: '@timestamp',
  32. esVersion: 2
  33. });
  34. var query_params = {
  35. metrics: [],
  36. bucketAggs: [
  37. {type: 'date_histogram', field: '@timestamp', id: '1'}
  38. ],
  39. };
  40. // format should not be specified in 1.x queries
  41. expect("format" in builder.build(query_params)["aggs"]["1"]["date_histogram"]).to.be(false);
  42. // 2.x query should specify format to be "epoch_millis"
  43. expect(builder_2x.build(query_params)["aggs"]["1"]["date_histogram"]["format"]).to.be("epoch_millis");
  44. });
  45. it('with es1.x and es2.x range filter check time format', function() {
  46. var builder_2x = new ElasticQueryBuilder({
  47. timeField: '@timestamp',
  48. esVersion: 2
  49. });
  50. // format should not be specified in 1.x queries
  51. expect("format" in builder.getRangeFilter()["@timestamp"]).to.be(false);
  52. // 2.x query should specify format to be "epoch_millis"
  53. expect(builder_2x.getRangeFilter()["@timestamp"]["format"]).to.be("epoch_millis");
  54. });
  55. it('with select field', function() {
  56. var query = builder.build({
  57. metrics: [{type: 'avg', field: '@value', id: '1'}],
  58. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '2'}],
  59. }, 100, 1000);
  60. var aggs = query.aggs["2"].aggs;
  61. expect(aggs["1"].avg.field).to.be("@value");
  62. });
  63. it('with term agg and order by metric agg', function() {
  64. var query = builder.build({
  65. metrics: [
  66. {type: 'count', id: '1'},
  67. {type: 'avg', field: '@value', id: '5'}
  68. ],
  69. bucketAggs: [
  70. {type: 'terms', field: '@host', settings: {size: 5, order: 'asc', orderBy: '5'}, id: '2' },
  71. {type: 'date_histogram', field: '@timestamp', id: '3'}
  72. ],
  73. }, 100, 1000);
  74. var firstLevel = query.aggs["2"];
  75. var secondLevel = firstLevel.aggs["3"];
  76. expect(firstLevel.aggs["5"].avg.field).to.be("@value");
  77. expect(secondLevel.aggs["5"].avg.field).to.be("@value");
  78. });
  79. it('with metric percentiles', function() {
  80. var query = builder.build({
  81. metrics: [
  82. {
  83. id: '1',
  84. type: 'percentiles',
  85. field: '@load_time',
  86. settings: {
  87. percents: [1,2,3,4]
  88. }
  89. }
  90. ],
  91. bucketAggs: [
  92. {type: 'date_histogram', field: '@timestamp', id: '3'}
  93. ],
  94. }, 100, 1000);
  95. var firstLevel = query.aggs["3"];
  96. expect(firstLevel.aggs["1"].percentiles.field).to.be("@load_time");
  97. expect(firstLevel.aggs["1"].percentiles.percents).to.eql([1,2,3,4]);
  98. });
  99. it('with filters aggs', function() {
  100. var query = builder.build({
  101. metrics: [{type: 'count', id: '1'}],
  102. timeField: '@timestamp',
  103. bucketAggs: [
  104. {
  105. id: '2',
  106. type: 'filters',
  107. settings: {
  108. filters: [
  109. {query: '@metric:cpu' },
  110. {query: '@metric:logins.count' },
  111. ]
  112. }
  113. },
  114. {type: 'date_histogram', field: '@timestamp', id: '4'}
  115. ],
  116. });
  117. expect(query.aggs["2"].filters.filters["@metric:cpu"].query.query_string.query).to.be("@metric:cpu");
  118. expect(query.aggs["2"].filters.filters["@metric:logins.count"].query.query_string.query).to.be("@metric:logins.count");
  119. expect(query.aggs["2"].aggs["4"].date_histogram.field).to.be("@timestamp");
  120. });
  121. it('with raw_document metric', function() {
  122. var query = builder.build({
  123. metrics: [{type: 'raw_document', id: '1'}],
  124. timeField: '@timestamp',
  125. bucketAggs: [],
  126. });
  127. expect(query.size).to.be(500);
  128. });
  129. it('with moving average', function() {
  130. var query = builder.build({
  131. metrics: [
  132. {
  133. id: '3',
  134. type: 'sum',
  135. field: '@value'
  136. },
  137. {
  138. id: '2',
  139. type: 'moving_avg',
  140. field: '3',
  141. pipelineAgg: '3'
  142. }
  143. ],
  144. bucketAggs: [
  145. {type: 'date_histogram', field: '@timestamp', id: '3'}
  146. ],
  147. });
  148. var firstLevel = query.aggs["3"];
  149. expect(firstLevel.aggs["2"]).not.to.be(undefined);
  150. expect(firstLevel.aggs["2"].moving_avg).not.to.be(undefined);
  151. expect(firstLevel.aggs["2"].moving_avg.buckets_path).to.be("3");
  152. });
  153. it('with broken moving average', function() {
  154. var query = builder.build({
  155. metrics: [
  156. {
  157. id: '3',
  158. type: 'sum',
  159. field: '@value'
  160. },
  161. {
  162. id: '2',
  163. type: 'moving_avg',
  164. pipelineAgg: '3'
  165. },
  166. {
  167. id: '4',
  168. type: 'moving_avg',
  169. pipelineAgg: 'Metric to apply moving average'
  170. }
  171. ],
  172. bucketAggs: [
  173. { type: 'date_histogram', field: '@timestamp', id: '3' }
  174. ],
  175. });
  176. var firstLevel = query.aggs["3"];
  177. expect(firstLevel.aggs["2"]).not.to.be(undefined);
  178. expect(firstLevel.aggs["2"].moving_avg).not.to.be(undefined);
  179. expect(firstLevel.aggs["2"].moving_avg.buckets_path).to.be("3");
  180. expect(firstLevel.aggs["4"]).to.be(undefined);
  181. });
  182. it('with derivative', function() {
  183. var query = builder.build({
  184. metrics: [
  185. {
  186. id: '3',
  187. type: 'sum',
  188. field: '@value'
  189. },
  190. {
  191. id: '2',
  192. type: 'derivative',
  193. pipelineAgg: '3'
  194. }
  195. ],
  196. bucketAggs: [
  197. {type: 'date_histogram', field: '@timestamp', id: '3'}
  198. ],
  199. });
  200. var firstLevel = query.aggs["3"];
  201. expect(firstLevel.aggs["2"]).not.to.be(undefined);
  202. expect(firstLevel.aggs["2"].derivative).not.to.be(undefined);
  203. expect(firstLevel.aggs["2"].derivative.buckets_path).to.be("3");
  204. });
  205. });