module.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. ## Derivequeries
  3. Broadcasts an array of queries based on the results of a terms facet
  4. ### Parameters
  5. * label :: The label to stick over the field
  6. * query :: A string to use as a filter for the terms facet
  7. * field :: the field to facet on
  8. * size :: how many queries to generate
  9. * fields :: a list of fields known to us
  10. * query_mode :: how to create query
  11. */
  12. angular.module('kibana.derivequeries', [])
  13. .controller('derivequeries', function($scope, $rootScope, query, fields, dashboard, filterSrv) {
  14. // Set and populate defaults
  15. var _d = {
  16. loading : false,
  17. status : "Beta",
  18. label : "Search",
  19. query : "*",
  20. ids : [],
  21. group : "default",
  22. field : '_type',
  23. fields : [],
  24. spyable : true,
  25. size : 5,
  26. mode : 'terms only',
  27. exclude : [],
  28. history : [],
  29. remember: 10 // max: 100, angular strap can't take a variable for items param
  30. }
  31. _.defaults($scope.panel,_d);
  32. $scope.init = function() {
  33. $scope.panel.fields = fields.list
  34. }
  35. $scope.get_data = function() {
  36. update_history($scope.panel.query);
  37. // Make sure we have everything for the request to complete
  38. if(dashboard.indices.length == 0) {
  39. return
  40. }
  41. $scope.panel.loading = true;
  42. var request = $scope.ejs.Request().indices(dashboard.indices);
  43. // Terms mode
  44. request = request
  45. .facet(ejs.TermsFacet('query')
  46. .field($scope.panel.field)
  47. .size($scope.panel['size'])
  48. .exclude($scope.panel.exclude)
  49. .facetFilter(ejs.QueryFilter(
  50. ejs.FilteredQuery(
  51. ejs.QueryStringQuery($scope.panel.query || '*'),
  52. filterSrv.getBoolFilter(filterSrv.ids)
  53. )))).size(0)
  54. $scope.populate_modal(request);
  55. var results = request.doSearch();
  56. // Populate scope when we have results
  57. results.then(function(results) {
  58. $scope.panel.loading = false;
  59. var data = [];
  60. if ($scope.panel.query === '' || $scope.panel.mode === 'terms only') {
  61. var suffix = '';
  62. } else if ($scope.panel.mode === 'AND') {
  63. var suffix = ' AND (' + $scope.panel.query + ')';
  64. } else if ($scope.panel.mode === 'OR') {
  65. var suffix = ' OR (' + $scope.panel.query + ')';
  66. }
  67. var ids = [];
  68. _.each(results.facets.query.terms, function(v) {
  69. var _q = $scope.panel.field+':"'+v.term+'"'+suffix;
  70. // if it isn't in the list, remove it
  71. var _iq = query.findQuery(_q)
  72. if(!_iq) {
  73. ids.push(query.set({query:_q}));
  74. } else {
  75. ids.push(_iq.id);
  76. }
  77. });
  78. _.each(_.difference($scope.panel.ids,ids),function(id){
  79. query.remove(id)
  80. })
  81. $scope.panel.ids = ids;
  82. dashboard.refresh();
  83. });
  84. }
  85. $scope.set_refresh = function (state) {
  86. $scope.refresh = state;
  87. }
  88. $scope.close_edit = function() {
  89. if($scope.refresh)
  90. $scope.get_data();
  91. $scope.refresh = false;
  92. }
  93. $scope.populate_modal = function(request) {
  94. $scope.modal = {
  95. title: "Inspector",
  96. body : "<h5>Last Elasticsearch Query</h5><pre>"+
  97. 'curl -XGET '+config.elasticsearch+'/'+dashboard.indices+"/_search?pretty -d'\n"+
  98. angular.toJson(JSON.parse(request.toString()),true)+
  99. "'</pre>",
  100. }
  101. }
  102. var update_history = function(query) {
  103. query = _.isArray(query) ? query : [query];
  104. if($scope.panel.remember > 0) {
  105. $scope.panel.history = _.union(query.reverse(),$scope.panel.history)
  106. var _length = $scope.panel.history.length
  107. if(_length > $scope.panel.remember) {
  108. $scope.panel.history = $scope.panel.history.slice(0,$scope.panel.remember)
  109. }
  110. }
  111. }
  112. });