query_builder_specs.ts 6.4 KB

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