query_builder_specs.ts 9.1 KB

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