queryBuilder.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. define([
  2. ],
  3. function () {
  4. 'use strict';
  5. function ElasticQueryBuilder() {
  6. }
  7. ElasticQueryBuilder.prototype.build = function(targets) {
  8. var query = {
  9. "aggs": {},
  10. "size": "$maxDataPoints"
  11. };
  12. var self = this;
  13. targets.forEach(function(target) {
  14. if (!target.hide) {
  15. query["aggs"][target.termKey + "_" + target.termValue] = {
  16. "filter": {
  17. "and": [
  18. self._buildRangeFilter(target),
  19. self._buildTermFilter(target)
  20. ]
  21. },
  22. "aggs": {
  23. "date_histogram": {
  24. "date_histogram": {
  25. "interval": target.interval || "$interval",
  26. "field": target.keyField,
  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. }
  50. });
  51. query = JSON.stringify(query);
  52. return query;
  53. };
  54. ElasticQueryBuilder.prototype._buildRangeFilter = function(target) {
  55. var filter = {"range":{}};
  56. filter["range"][target.keyField] = {
  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. });