queryBuilder.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. define([
  2. ],
  3. function () {
  4. 'use strict';
  5. function ElasticQueryBuilder() { }
  6. ElasticQueryBuilder.prototype.build = function(targets) {
  7. var query = {
  8. "aggs": {},
  9. "size": "$maxDataPoints"
  10. };
  11. var self = this;
  12. targets.forEach(function(target, index) {
  13. if (target.hide) {
  14. return;
  15. }
  16. var esQuery = {
  17. "filter": {
  18. "and": [
  19. self._buildRangeFilter(target)
  20. ]
  21. },
  22. "aggs": {
  23. "date_histogram": {
  24. "date_histogram": {
  25. "interval": target.interval || "$interval",
  26. "field": target.timestampField,
  27. "min_doc_count": 0,
  28. },
  29. "aggs": {
  30. "stats": {
  31. "stats": {
  32. "field": target.valueField
  33. }
  34. }
  35. }
  36. }
  37. }
  38. };
  39. if (target.groupByField) {
  40. query["aggs"][target.termKey + "_" + target.termValue]["aggs"] = {
  41. "terms": {
  42. "terms": {
  43. "field": target.groupByField
  44. },
  45. "aggs": query["aggs"][target.termKey + "_" + target.termValue]["aggs"]
  46. }
  47. };
  48. }
  49. query["aggs"]['query:' + index] = esQuery;
  50. });
  51. query = JSON.stringify(query);
  52. return query;
  53. };
  54. ElasticQueryBuilder.prototype._buildRangeFilter = function(target) {
  55. var filter = {"range":{}};
  56. filter["range"][target.timestampField] = {
  57. "gte": "$rangeFrom",
  58. "lte": "$rangeTo"
  59. };
  60. return filter;
  61. };
  62. ElasticQueryBuilder.prototype._buildTermFilter = function(target) {
  63. var filter = {"term":{}};
  64. filter["term"][target.termKey] = target.termValue;
  65. return filter;
  66. };
  67. return ElasticQueryBuilder;
  68. });