module.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*jshint globalstrict:true */
  2. /*global angular:true */
  3. /*
  4. ## Derivequeries
  5. ### Parameters
  6. * label :: The label to stick over the field
  7. * query :: A string to use as a filter for the terms facet
  8. * field :: the field to facet on
  9. * rest :: include a filter that matches all other terms,
  10. * size :: how many queries to generate
  11. * fields :: a list of fields known to us
  12. * query_mode :: how to create query
  13. */
  14. 'use strict';
  15. angular.module('kibana.derivequeries', [])
  16. .controller('derivequeries', function($scope, $rootScope, querySrv, fields, dashboard, filterSrv) {
  17. $scope.panelMeta = {
  18. status : "Experimental",
  19. description : "Creates a new set of queries using the Elasticsearch terms facet. For example,"+
  20. " you might want to create 5 queries showing the most frequent HTTP response codes. Be "+
  21. "careful not to select a high cardinality field, as Elasticsearch must load all unique values"+
  22. " into memory."
  23. };
  24. // Set and populate defaults
  25. var _d = {
  26. loading : false,
  27. label : "Search",
  28. query : "*",
  29. ids : [],
  30. field : '_type',
  31. fields : [],
  32. spyable : true,
  33. rest : false,
  34. size : 5,
  35. mode : 'terms only',
  36. exclude : [],
  37. history : [],
  38. remember: 10 // max: 100, angular strap can't take a variable for items param
  39. };
  40. _.defaults($scope.panel,_d);
  41. $scope.init = function() {
  42. $scope.panel.fields = fields.list;
  43. };
  44. $scope.get_data = function() {
  45. update_history($scope.panel.query);
  46. // Make sure we have everything for the request to complete
  47. if(dashboard.indices.length === 0) {
  48. return;
  49. }
  50. $scope.panelMeta.loading = true;
  51. var request = $scope.ejs.Request().indices(dashboard.indices);
  52. // Terms mode
  53. request = request
  54. .facet($scope.ejs.TermsFacet('query')
  55. .field($scope.panel.field)
  56. .size($scope.panel.size)
  57. .exclude($scope.panel.exclude)
  58. .facetFilter($scope.ejs.QueryFilter(
  59. $scope.ejs.FilteredQuery(
  60. $scope.ejs.QueryStringQuery($scope.panel.query || '*'),
  61. filterSrv.getBoolFilter(filterSrv.ids)
  62. )))).size(0);
  63. $scope.populate_modal(request);
  64. var results = request.doSearch();
  65. // Populate scope when we have results
  66. results.then(function(results) {
  67. $scope.panelMeta.loading = false;
  68. var suffix,
  69. data = [];
  70. if ($scope.panel.query === '' || $scope.panel.mode === 'terms only') {
  71. suffix = '';
  72. } else if ($scope.panel.mode === 'AND') {
  73. suffix = ' AND (' + $scope.panel.query + ')';
  74. } else if ($scope.panel.mode === 'OR') {
  75. suffix = ' OR (' + $scope.panel.query + ')';
  76. }
  77. var ids = [];
  78. var terms = results.facets.query.terms;
  79. var others = [];
  80. _.each(terms, function(v) {
  81. var _q = $scope.panel.field+':"'+v.term+'"'+suffix;
  82. // if it isn't in the list, remove it
  83. var _iq = querySrv.findQuery(_q);
  84. if(!_iq) {
  85. ids.push(querySrv.set({alias: v.term, query:_q}));
  86. } else {
  87. ids.push(_iq.id);
  88. }
  89. others.push("NOT (" + _q + ")");
  90. });
  91. if ($scope.panel.rest) {
  92. var _other_q = others.join(' AND ');
  93. var _iq = querySrv.findQuery(_other_q);
  94. if (!_iq) {
  95. ids.push(querySrv.set({alias: 'other', query: _other_q}));
  96. } else {
  97. ids.push(_iq.id);
  98. }
  99. }
  100. _.each(_.difference($scope.panel.ids,ids),function(id){
  101. querySrv.remove(id);
  102. });
  103. $scope.panel.ids = ids;
  104. dashboard.refresh();
  105. });
  106. };
  107. $scope.set_refresh = function (state) {
  108. $scope.refresh = state;
  109. };
  110. $scope.close_edit = function() {
  111. if($scope.refresh) {
  112. $scope.get_data();
  113. }
  114. $scope.refresh = false;
  115. };
  116. $scope.populate_modal = function(request) {
  117. $scope.modal = {
  118. title: "Inspector",
  119. body : "<h5>Last Elasticsearch Query</h5><pre>"+
  120. 'curl -XGET '+config.elasticsearch+'/'+dashboard.indices+"/_search?pretty -d'\n"+
  121. angular.toJson(JSON.parse(request.toString()),true)+
  122. "'</pre>",
  123. };
  124. };
  125. var update_history = function(query) {
  126. query = _.isArray(query) ? query : [query];
  127. if($scope.panel.remember > 0) {
  128. $scope.panel.history = _.union(query.reverse(),$scope.panel.history);
  129. var _length = $scope.panel.history.length;
  130. if(_length > $scope.panel.remember) {
  131. $scope.panel.history = $scope.panel.history.slice(0,$scope.panel.remember);
  132. }
  133. }
  134. };
  135. });