query_builder_specs.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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 raw query', function() {
  19. var query = builder.build({
  20. rawQuery: '{"query": "$lucene_query"}',
  21. });
  22. expect(query.query).to.be("$lucene_query");
  23. });
  24. it('with multiple bucket aggs', function() {
  25. var query = builder.build({
  26. metrics: [{type: 'count', id: '1'}],
  27. timeField: '@timestamp',
  28. bucketAggs: [
  29. {type: 'terms', field: '@host', id: '2'},
  30. {type: 'date_histogram', field: '@timestamp', id: '3'}
  31. ],
  32. });
  33. expect(query.aggs["2"].terms.field).to.be("@host");
  34. expect(query.aggs["2"].aggs["3"].date_histogram.field).to.be("@timestamp");
  35. });
  36. it('with es1.x and es2.x date histogram queries check time format', function() {
  37. var builder_2x = new ElasticQueryBuilder({
  38. timeField: '@timestamp',
  39. elasticsearchVersion: 2
  40. });
  41. var query_params = {
  42. metrics: [],
  43. bucketAggs: [
  44. {type: 'date_histogram', field: '@timestamp', id: '1'}
  45. ],
  46. };
  47. // format should not be specified in 1.x queries
  48. expect("format" in builder.build(query_params)["aggs"]["1"]["date_histogram"]).to.be(false);
  49. // 2.x query should specify format to be "epoch_millis"
  50. expect(builder_2x.build(query_params)["aggs"]["1"]["date_histogram"]["format"]).to.be("epoch_millis");
  51. });
  52. it('with es1.x and es2.x range filter check time format', function() {
  53. var builder_2x = new ElasticQueryBuilder({
  54. timeField: '@timestamp',
  55. elasticsearchVersion: 2
  56. });
  57. // format should not be specified in 1.x queries
  58. expect("format" in builder.getRangeFilter()["@timestamp"]).to.be(false);
  59. // 2.x query should specify format to be "epoch_millis"
  60. expect(builder_2x.getRangeFilter()["@timestamp"]["format"]).to.be("epoch_millis");
  61. });
  62. it('with select field', function() {
  63. var query = builder.build({
  64. metrics: [{type: 'avg', field: '@value', id: '1'}],
  65. bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '2'}],
  66. }, 100, 1000);
  67. var aggs = query.aggs["2"].aggs;
  68. expect(aggs["1"].avg.field).to.be("@value");
  69. });
  70. it('with term agg and order by metric agg', function() {
  71. var query = builder.build({
  72. metrics: [
  73. {type: 'count', id: '1'},
  74. {type: 'avg', field: '@value', id: '5'}
  75. ],
  76. bucketAggs: [
  77. {type: 'terms', field: '@host', settings: {size: 5, order: 'asc', orderBy: '5'}, id: '2' },
  78. {type: 'date_histogram', field: '@timestamp', id: '3'}
  79. ],
  80. }, 100, 1000);
  81. var firstLevel = query.aggs["2"];
  82. var secondLevel = firstLevel.aggs["3"];
  83. expect(firstLevel.aggs["5"].avg.field).to.be("@value");
  84. expect(secondLevel.aggs["5"].avg.field).to.be("@value");
  85. });
  86. it('with metric percentiles', function() {
  87. var query = builder.build({
  88. metrics: [
  89. {
  90. id: '1',
  91. type: 'percentiles',
  92. field: '@load_time',
  93. settings: {
  94. percents: [1,2,3,4]
  95. }
  96. }
  97. ],
  98. bucketAggs: [
  99. {type: 'date_histogram', field: '@timestamp', id: '3'}
  100. ],
  101. }, 100, 1000);
  102. var firstLevel = query.aggs["3"];
  103. expect(firstLevel.aggs["1"].percentiles.field).to.be("@load_time");
  104. expect(firstLevel.aggs["1"].percentiles.percents).to.eql([1,2,3,4]);
  105. });
  106. it('with filters aggs', function() {
  107. var query = builder.build({
  108. metrics: [{type: 'count', id: '1'}],
  109. timeField: '@timestamp',
  110. bucketAggs: [
  111. {
  112. id: '2',
  113. type: 'filters',
  114. settings: {
  115. filters: [
  116. {query: '@metric:cpu' },
  117. {query: '@metric:logins.count' },
  118. ]
  119. }
  120. },
  121. {type: 'date_histogram', field: '@timestamp', id: '4'}
  122. ],
  123. });
  124. expect(query.aggs["2"].filters.filters["@metric:cpu"].query.query_string.query).to.be("@metric:cpu");
  125. expect(query.aggs["2"].filters.filters["@metric:logins.count"].query.query_string.query).to.be("@metric:logins.count");
  126. expect(query.aggs["2"].aggs["4"].date_histogram.field).to.be("@timestamp");
  127. });
  128. it('with raw_document metric', function() {
  129. var query = builder.build({
  130. metrics: [{type: 'raw_document', id: '1'}],
  131. timeField: '@timestamp',
  132. bucketAggs: [],
  133. });
  134. expect(query.size).to.be(500);
  135. });
  136. });