module.js 3.7 KB

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