queryBuilder.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 query = {
  17. "size": 0,
  18. "query": {
  19. "filtered": {
  20. "query": {
  21. "query_string": {
  22. "analyze_wildcard": true,
  23. "query": target.query || '*' ,
  24. }
  25. },
  26. "filter": {
  27. "bool": {
  28. "must": [{"range": this.getRangeFilter(target.timeField)}]
  29. }
  30. }
  31. }
  32. }
  33. };
  34. query.aggs = {
  35. "histogram": {
  36. "date_histogram": {
  37. "interval": target.interval || "$interval",
  38. "field": target.timeField,
  39. "min_doc_count": 0,
  40. "extended_bounds": {
  41. "min": "$timeFrom",
  42. "max": "$timeTo"
  43. }
  44. }
  45. },
  46. };
  47. var nestedAggs = query.aggs.histogram;
  48. var i;
  49. target.groupByFields = target.groupByFields || [];
  50. for (i = 0; i < target.groupByFields.length; i++) {
  51. var field = target.groupByFields[i].field;
  52. var aggs = {terms: {field: field}};
  53. nestedAggs.aggs = {};
  54. nestedAggs.aggs[field] = aggs;
  55. nestedAggs = aggs;
  56. }
  57. nestedAggs.aggs = {};
  58. for (i = 0; i < target.select.length; i++) {
  59. var select = target.select[i];
  60. if (select.field) {
  61. var aggField = {};
  62. aggField[select.agg] = {field: select.field};
  63. nestedAggs.aggs[i.toString()] = aggField;
  64. }
  65. }
  66. return query;
  67. };
  68. return ElasticQueryBuilder;
  69. });