queryBuilder.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. var size = parseInt(aggDef.size, 10);
  52. if (size > 0) { esAgg.terms.size = size; }
  53. if (aggDef.orderBy) {
  54. esAgg.terms.order = {};
  55. esAgg.terms.order[aggDef.orderBy] = aggDef.order;
  56. }
  57. break;
  58. }
  59. }
  60. nestedAggs.aggs = {};
  61. nestedAggs.aggs[aggDef.id] = esAgg;
  62. nestedAggs = esAgg;
  63. }
  64. nestedAggs.aggs = {};
  65. for (i = 0; i < target.metrics.length; i++) {
  66. var metric = target.metrics[i];
  67. if (metric.type === 'count') {
  68. continue;
  69. }
  70. var aggField = {};
  71. aggField[metric.type] = {field: metric.field};
  72. nestedAggs.aggs[metric.id] = aggField;
  73. }
  74. return query;
  75. };
  76. return ElasticQueryBuilder;
  77. });