queryBuilder.js 2.7 KB

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