query_builder_specs.ts 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import {describe, beforeEach, it, 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.bool.filter[0].range["@timestamp"].gte).to.be("$timeFrom");
  15. expect(query.aggs["1"].date_histogram.extended_bounds.min).to.be("$timeFrom");
  16. });
  17. it('with defaults on es5.x', function() {
  18. var builder_5x = new ElasticQueryBuilder({
  19. timeField: '@timestamp',
  20. esVersion: 5
  21. });
  22. var query = builder_5x.build({
  23. metrics: [{type: 'Count', id: '0'}],
  24. timeField: '@timestamp',
  25. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '1'}],
  26. });
  27. expect(query.query.bool.filter[0].range["@timestamp"].gte).to.be("$timeFrom");
  28. expect(query.aggs["1"].date_histogram.extended_bounds.min).to.be("$timeFrom");
  29. });
  30. it('with multiple bucket aggs', function() {
  31. var query = builder.build({
  32. metrics: [{type: 'count', id: '1'}],
  33. timeField: '@timestamp',
  34. bucketAggs: [ {type: 'terms', field: '@host', id: '2'},
  35. {type: 'date_histogram', field: '@timestamp', id: '3'}
  36. ],
  37. });
  38. expect(query.aggs["2"].terms.field).to.be("@host");
  39. expect(query.aggs["2"].aggs["3"].date_histogram.field).to.be("@timestamp");
  40. });
  41. it('with select field', function() {
  42. var query = builder.build({
  43. metrics: [{type: 'avg', field: '@value', id: '1'}],
  44. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '2'}],
  45. }, 100, 1000);
  46. var aggs = query.aggs["2"].aggs;
  47. expect(aggs["1"].avg.field).to.be("@value");
  48. });
  49. it('with term agg and order by metric agg', function() {
  50. var query = builder.build({
  51. metrics: [
  52. {type: 'count', id: '1'},
  53. {type: 'avg', field: '@value', id: '5'}
  54. ],
  55. bucketAggs: [
  56. {type: 'terms', field: '@host', settings: {size: 5, order: 'asc', orderBy: '5'}, id: '2' },
  57. {type: 'date_histogram', field: '@timestamp', id: '3'}
  58. ],
  59. }, 100, 1000);
  60. var firstLevel = query.aggs["2"];
  61. var secondLevel = firstLevel.aggs["3"];
  62. expect(firstLevel.aggs["5"].avg.field).to.be("@value");
  63. expect(secondLevel.aggs["5"].avg.field).to.be("@value");
  64. });
  65. it('with metric percentiles', function() {
  66. var query = builder.build({
  67. metrics: [
  68. {
  69. id: '1',
  70. type: 'percentiles',
  71. field: '@load_time',
  72. settings: {
  73. percents: [1,2,3,4]
  74. }
  75. }
  76. ],
  77. bucketAggs: [
  78. {type: 'date_histogram', field: '@timestamp', id: '3'}
  79. ],
  80. }, 100, 1000);
  81. var firstLevel = query.aggs["3"];
  82. expect(firstLevel.aggs["1"].percentiles.field).to.be("@load_time");
  83. expect(firstLevel.aggs["1"].percentiles.percents).to.eql([1,2,3,4]);
  84. });
  85. it('with filters aggs', function() {
  86. var query = builder.build({
  87. metrics: [{type: 'count', id: '1'}],
  88. timeField: '@timestamp',
  89. bucketAggs: [
  90. {
  91. id: '2',
  92. type: 'filters',
  93. settings: {
  94. filters: [
  95. {query: '@metric:cpu' },
  96. {query: '@metric:logins.count' },
  97. ]
  98. }
  99. },
  100. {type: 'date_histogram', field: '@timestamp', id: '4'}
  101. ],
  102. });
  103. expect(query.aggs["2"].filters.filters["@metric:cpu"].query_string.query).to.be("@metric:cpu");
  104. expect(query.aggs["2"].filters.filters["@metric:logins.count"].query_string.query).to.be("@metric:logins.count");
  105. expect(query.aggs["2"].aggs["4"].date_histogram.field).to.be("@timestamp");
  106. });
  107. it('with filters aggs on es5.x', function() {
  108. var builder_5x = new ElasticQueryBuilder({
  109. timeField: '@timestamp',
  110. esVersion: 5
  111. });
  112. var query = builder_5x.build({
  113. metrics: [{type: 'count', id: '1'}],
  114. timeField: '@timestamp',
  115. bucketAggs: [
  116. {
  117. id: '2',
  118. type: 'filters',
  119. settings: {
  120. filters: [
  121. {query: '@metric:cpu' },
  122. {query: '@metric:logins.count' },
  123. ]
  124. }
  125. },
  126. {type: 'date_histogram', field: '@timestamp', id: '4'}
  127. ],
  128. });
  129. expect(query.aggs["2"].filters.filters["@metric:cpu"].query_string.query).to.be("@metric:cpu");
  130. expect(query.aggs["2"].filters.filters["@metric:logins.count"].query_string.query).to.be("@metric:logins.count");
  131. expect(query.aggs["2"].aggs["4"].date_histogram.field).to.be("@timestamp");
  132. });
  133. it('with raw_document metric', function() {
  134. var query = builder.build({
  135. metrics: [{type: 'raw_document', id: '1',settings: {}}],
  136. timeField: '@timestamp',
  137. bucketAggs: [],
  138. });
  139. expect(query.size).to.be(500);
  140. });
  141. it('with raw_document metric size set', function() {
  142. var query = builder.build({
  143. metrics: [{type: 'raw_document', id: '1',settings: {size: 1337}}],
  144. timeField: '@timestamp',
  145. bucketAggs: [],
  146. });
  147. expect(query.size).to.be(1337);
  148. });
  149. it('with moving average', function() {
  150. var query = builder.build({
  151. metrics: [
  152. {
  153. id: '3',
  154. type: 'sum',
  155. field: '@value'
  156. },
  157. {
  158. id: '2',
  159. type: 'moving_avg',
  160. field: '3',
  161. pipelineAgg: '3'
  162. }
  163. ],
  164. bucketAggs: [
  165. {type: 'date_histogram', field: '@timestamp', id: '3'}
  166. ],
  167. });
  168. var firstLevel = query.aggs["3"];
  169. expect(firstLevel.aggs["2"]).not.to.be(undefined);
  170. expect(firstLevel.aggs["2"].moving_avg).not.to.be(undefined);
  171. expect(firstLevel.aggs["2"].moving_avg.buckets_path).to.be("3");
  172. });
  173. it('with broken moving average', function() {
  174. var query = builder.build({
  175. metrics: [
  176. {
  177. id: '3',
  178. type: 'sum',
  179. field: '@value'
  180. },
  181. {
  182. id: '2',
  183. type: 'moving_avg',
  184. pipelineAgg: '3'
  185. },
  186. {
  187. id: '4',
  188. type: 'moving_avg',
  189. pipelineAgg: 'Metric to apply moving average'
  190. }
  191. ],
  192. bucketAggs: [
  193. { type: 'date_histogram', field: '@timestamp', id: '3' }
  194. ],
  195. });
  196. var firstLevel = query.aggs["3"];
  197. expect(firstLevel.aggs["2"]).not.to.be(undefined);
  198. expect(firstLevel.aggs["2"].moving_avg).not.to.be(undefined);
  199. expect(firstLevel.aggs["2"].moving_avg.buckets_path).to.be("3");
  200. expect(firstLevel.aggs["4"]).to.be(undefined);
  201. });
  202. it('with derivative', function() {
  203. var query = builder.build({
  204. metrics: [
  205. {
  206. id: '3',
  207. type: 'sum',
  208. field: '@value'
  209. },
  210. {
  211. id: '2',
  212. type: 'derivative',
  213. pipelineAgg: '3'
  214. }
  215. ],
  216. bucketAggs: [
  217. {type: 'date_histogram', field: '@timestamp', id: '3'}
  218. ],
  219. });
  220. var firstLevel = query.aggs["3"];
  221. expect(firstLevel.aggs["2"]).not.to.be(undefined);
  222. expect(firstLevel.aggs["2"].derivative).not.to.be(undefined);
  223. expect(firstLevel.aggs["2"].derivative.buckets_path).to.be("3");
  224. });
  225. it('with histogram', function() {
  226. var query = builder.build({
  227. metrics: [
  228. {id: '1', type: 'count' },
  229. ],
  230. bucketAggs: [
  231. {type: 'histogram', field: 'bytes', id: '3', settings: {interval: 10, min_doc_count: 2, missing: 5}}
  232. ],
  233. });
  234. var firstLevel = query.aggs["3"];
  235. expect(firstLevel.histogram.field).to.be('bytes');
  236. expect(firstLevel.histogram.interval).to.be(10);
  237. expect(firstLevel.histogram.min_doc_count).to.be(2);
  238. expect(firstLevel.histogram.missing).to.be(5);
  239. });
  240. it('with adhoc filters', function() {
  241. var query = builder.build({
  242. metrics: [{type: 'Count', id: '0'}],
  243. timeField: '@timestamp',
  244. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '3'}],
  245. }, [
  246. {key: 'key1', operator: '=', value: 'value1'},
  247. {key: 'key2', operator: '=', value: 'value2'},
  248. {key: 'key2', operator: '!=', value: 'value2'},
  249. {key: 'key3', operator: '<', value: 'value3'},
  250. {key: 'key4', operator: '>', value: 'value4'},
  251. {key: 'key5', operator: '=~', value: 'value5'},
  252. {key: 'key6', operator: '!~', value: 'value6'},
  253. ]);
  254. expect(query.query.bool.must[0].match_phrase["key1"].query).to.be("value1");
  255. expect(query.query.bool.must[1].match_phrase["key2"].query).to.be("value2");
  256. expect(query.query.bool.must_not[0].match_phrase["key2"].query).to.be("value2");
  257. expect(query.query.bool.filter[2].range["key3"].lt).to.be("value3");
  258. expect(query.query.bool.filter[3].range["key4"].gt).to.be("value4");
  259. expect(query.query.bool.filter[4].regexp["key5"]).to.be("value5");
  260. expect(query.query.bool.filter[5].bool.must_not.regexp["key6"]).to.be("value6");
  261. });
  262. });