queryCtrl.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. define([
  2. 'angular',
  3. 'lodash',
  4. './queryBuilder',
  5. ],
  6. function (angular, _, ElasticQueryBuilder) {
  7. 'use strict';
  8. var module = angular.module('grafana.controllers');
  9. module.controller('ElasticQueryCtrl', function($scope, $timeout, uiSegmentSrv, templateSrv, $q) {
  10. $scope.functionList = ['count', 'min', 'max', 'total', 'mean'];
  11. $scope.functionMenu = _.map($scope.functionList, function(func) {
  12. return { text: func, click: "changeFunction('" + func + "');" };
  13. });
  14. $scope.init = function() {
  15. $scope.queryBuilder = new ElasticQueryBuilder(target);
  16. var target = $scope.target;
  17. target.function = target.function || 'mean';
  18. target.timeField = target.timeField || '@timestamp';
  19. target.select = target.select || [{ agg: 'count' }];
  20. target.groupByFields = target.groupByFields || [];
  21. $scope.timeSegment = uiSegmentSrv.newSegment(target.timeField);
  22. $scope.groupBySegments = _.map(target.groupByFields, function(group) {
  23. return uiSegmentSrv.newSegment(group.field);
  24. });
  25. $scope.selectSegments = _.map(target.select, function(select) {
  26. return uiSegmentSrv.newSegment(select.agg);
  27. });
  28. $scope.groupBySegments.push(uiSegmentSrv.newPlusButton());
  29. $scope.removeSelectSegment = uiSegmentSrv.newSegment({fake: true, value: '-- remove select --'});
  30. $scope.removeGroupBySegment = uiSegmentSrv.newSegment({fake: true, value: '-- remove group by --'});
  31. };
  32. $scope.getFields = function() {
  33. return $scope.datasource.metricFindQuery('fields()').then($scope.transformToSegments(true));
  34. };
  35. $scope.transformToSegments = function(addTemplateVars) {
  36. return function(results) {
  37. var segments = _.map(results, function(segment) {
  38. return uiSegmentSrv.newSegment({ value: segment.text, expandable: segment.expandable });
  39. });
  40. if (addTemplateVars) {
  41. _.each(templateSrv.variables, function(variable) {
  42. segments.unshift(uiSegmentSrv.newSegment({ type: 'template', value: '$' + variable.name, expandable: true }));
  43. });
  44. }
  45. return segments;
  46. };
  47. };
  48. $scope.getGroupByFields = function(segment) {
  49. return $scope.datasource.metricFindQuery('fields()').then($scope.transformToSegments(false))
  50. .then(function(results) {
  51. if (segment.type !== 'plus-button') {
  52. results.splice(0, 0, angular.copy($scope.removeGroupBySegment));
  53. }
  54. return results;
  55. })
  56. .then(null, $scope.handleQueryError);
  57. };
  58. $scope.groupByChanged = function(segment, index) {
  59. if (segment.value === $scope.removeGroupBySegment.value) {
  60. $scope.target.groupByFields.splice(index, 1);
  61. $scope.groupBySegments.splice(index, 1);
  62. $scope.$parent.get_data();
  63. return;
  64. }
  65. if (index === $scope.groupBySegments.length-1) {
  66. $scope.groupBySegments.push(uiSegmentSrv.newPlusButton());
  67. }
  68. segment.type = 'group-by-key';
  69. segment.fake = false;
  70. $scope.target.groupByFields[index] = {field: segment.value};
  71. $scope.$parent.get_data();
  72. };
  73. $scope.valueFieldChanged = function() {
  74. $scope.target.valueField = $scope.valueFieldSegment.value;
  75. $scope.$parent.get_data();
  76. };
  77. $scope.keyFieldChanged = function() {
  78. $scope.target.keyField = $scope.keyFieldSegment.value;
  79. $scope.$parent.get_data();
  80. };
  81. $scope.termValueSegmentChanged = function() {
  82. $scope.target.termValue = $scope.termValueSegment.value;
  83. $scope.$parent.get_data();
  84. };
  85. $scope.termKeySegmentChanged = function() {
  86. $scope.target.termKey = $scope.termKeySegment.value;
  87. $scope.$parent.get_data();
  88. };
  89. $scope.groupByFieldChanged = function() {
  90. $scope.target.groupBy = $scope.groupByFieldSegment.value;
  91. $scope.$parent.get_data();
  92. };
  93. $scope.changeFunction = function(func) {
  94. $scope.target.function = func;
  95. $scope.$parent.get_data();
  96. };
  97. $scope.handleQueryError = function(err) {
  98. $scope.parserError = err.message || 'Failed to issue metric query';
  99. return [];
  100. };
  101. $scope.toggleQueryMode = function () {
  102. $scope.target.rawQuery = !$scope.target.rawQuery;
  103. };
  104. $scope.init();
  105. });
  106. });