queryBuilder.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. define([
  2. "angular"
  3. ],
  4. function (angular) {
  5. 'use strict';
  6. function ElasticQueryBuilder(options) {
  7. this.timeField = options.timeField;
  8. }
  9. ElasticQueryBuilder.prototype.getRangeFilter = function() {
  10. var filter = {};
  11. filter[this.timeField] = {"gte": "$timeFrom", "lte": "$timeTo"};
  12. return filter;
  13. };
  14. ElasticQueryBuilder.prototype.buildTermsAgg = function(aggDef, queryNode, target) {
  15. var metricRef, metric, size, y;
  16. queryNode.terms = { "field": aggDef.field };
  17. size = parseInt(aggDef.size, 10);
  18. if (size > 0) { queryNode.terms.size = size; }
  19. if (aggDef.orderBy !== void 0) {
  20. queryNode.terms.order = {};
  21. queryNode.terms.order[aggDef.orderBy] = aggDef.order;
  22. // if metric ref, look it up and add it to this agg level
  23. metricRef = parseInt(aggDef.orderBy, 10);
  24. if (!isNaN(metricRef)) {
  25. for (y = 0; y < target.metrics.length; y++) {
  26. metric = target.metrics[y];
  27. if (metric.id === aggDef.orderBy) {
  28. queryNode.aggs = {};
  29. queryNode.aggs[metric.id] = {};
  30. queryNode.aggs[metric.id][metric.type] = {field: metric.field};
  31. break;
  32. }
  33. }
  34. }
  35. }
  36. return queryNode;
  37. };
  38. ElasticQueryBuilder.prototype.build = function(target) {
  39. if (target.rawQuery) {
  40. return angular.fromJson(target.rawQuery);
  41. }
  42. var i, nestedAggs, metric;
  43. var query = {
  44. "size": 0,
  45. "query": {
  46. "filtered": {
  47. "query": {
  48. "query_string": {
  49. "analyze_wildcard": true,
  50. "query": target.query || '*' ,
  51. }
  52. },
  53. "filter": {
  54. "bool": {
  55. "must": [{"range": this.getRangeFilter()}]
  56. }
  57. }
  58. }
  59. }
  60. };
  61. nestedAggs = query;
  62. for (i = 0; i < target.bucketAggs.length; i++) {
  63. var aggDef = target.bucketAggs[i];
  64. var esAgg = {};
  65. switch(aggDef.type) {
  66. case 'date_histogram': {
  67. esAgg["date_histogram"] = {
  68. "interval": target.interval || "$interval",
  69. "field": this.timeField,
  70. "min_doc_count": 1,
  71. "extended_bounds": { "min": "$timeFrom", "max": "$timeTo" }
  72. };
  73. break;
  74. }
  75. case 'terms': {
  76. this.buildTermsAgg(aggDef, esAgg, target);
  77. break;
  78. }
  79. }
  80. nestedAggs.aggs = nestedAggs.aggs || {};
  81. nestedAggs.aggs[aggDef.id] = esAgg;
  82. nestedAggs = esAgg;
  83. }
  84. nestedAggs.aggs = {};
  85. for (i = 0; i < target.metrics.length; i++) {
  86. metric = target.metrics[i];
  87. if (metric.type === 'count') {
  88. continue;
  89. }
  90. var metricAgg = {field: metric.field};
  91. for (var prop in metric.settings) {
  92. if (metric.settings.hasOwnProperty(prop) && metric.settings[prop] !== null) {
  93. metricAgg[prop] = metric.settings[prop];
  94. }
  95. }
  96. var aggField = {};
  97. aggField[metric.type] = metricAgg;
  98. nestedAggs.aggs[metric.id] = aggField;
  99. }
  100. return query;
  101. };
  102. return ElasticQueryBuilder;
  103. });