queryBuilder.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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, nestedAggs;
  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. break;
  52. }
  53. }
  54. nestedAggs.aggs = {};
  55. nestedAggs.aggs['b' + i] = esAgg;
  56. nestedAggs = esAgg;
  57. }
  58. nestedAggs.aggs = {};
  59. for (i = 0; i < target.metrics.length; i++) {
  60. var metric = target.metrics[i];
  61. if (metric.type === 'count') {
  62. continue;
  63. }
  64. var aggField = {};
  65. aggField[metric.type] = {field: metric.field};
  66. nestedAggs.aggs['m' + i] = aggField;
  67. }
  68. return query;
  69. };
  70. return ElasticQueryBuilder;
  71. });