module.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. ## Termsquery
  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. ### Group Events
  12. #### Sends
  13. * query :: Always broadcast as an array, even in multi: false
  14. * get_time :: Request the time object from the timepicker
  15. #### Receives
  16. * query :: An array of queries. This is probably needs to be fixed.
  17. * time :: populate index and time
  18. * fields :: A list of fields known to us
  19. */
  20. angular.module('kibana.derivequeries', [])
  21. .controller('derivequeries', function($scope, eventBus) {
  22. // Set and populate defaults
  23. var _d = {
  24. status : "Beta",
  25. label : "Search",
  26. query : "*",
  27. group : "default",
  28. field : '_type',
  29. fields : [],
  30. spyable : true,
  31. size : 5,
  32. mode : 'terms only',
  33. exclude : [],
  34. history : [],
  35. remember: 10 // max: 100, angular strap can't take a variable for items param
  36. }
  37. _.defaults($scope.panel,_d);
  38. $scope.init = function() {
  39. eventBus.register($scope,'fields', function(event, fields) {
  40. $scope.panel.fields = fields.all;
  41. });
  42. eventBus.register($scope,'time', function(event,time){set_time(time)});
  43. eventBus.register($scope,'query', function(event, query) {
  44. $scope.panel.query = _.isArray(query) ? query[0] : query;
  45. $scope.get_data();
  46. });
  47. // Now that we're all setup, request the time from our group
  48. eventBus.broadcast($scope.$id,$scope.panel.group,'get_time')
  49. }
  50. $scope.get_data = function() {
  51. update_history($scope.panel.query);
  52. // Make sure we have everything for the request to complete
  53. if(_.isUndefined($scope.index) || _.isUndefined($scope.time))
  54. return
  55. $scope.panel.loading = true;
  56. var request = $scope.ejs.Request().indices($scope.index);
  57. // Terms mode
  58. request = request
  59. .facet(ejs.TermsFacet('query')
  60. .field($scope.panel.field)
  61. .size($scope.panel['size'])
  62. .exclude($scope.panel.exclude)
  63. .facetFilter(ejs.QueryFilter(
  64. ejs.FilteredQuery(
  65. ejs.QueryStringQuery($scope.panel.query || '*'),
  66. ejs.RangeFilter($scope.time.field)
  67. .from($scope.time.from)
  68. .to($scope.time.to)
  69. )))).size(0)
  70. $scope.populate_modal(request);
  71. var results = request.doSearch();
  72. // Populate scope when we have results
  73. results.then(function(results) {
  74. $scope.panel.loading = false;
  75. var data = [];
  76. if ($scope.panel.query === '' || $scope.panel.mode === 'terms only') {
  77. var suffix = '';
  78. } else if ($scope.panel.mode === 'AND') {
  79. var suffix = ' AND (' + $scope.panel.query + ')';
  80. } else if ($scope.panel.mode === 'OR') {
  81. var suffix = ' OR (' + $scope.panel.query + ')';
  82. }
  83. _.each(results.facets.query.terms, function(v) {
  84. data.push($scope.panel.field+':"'+v.term+'"'+suffix)
  85. });
  86. $scope.send_query(data)
  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. $scope.refresh = false;
  96. }
  97. $scope.populate_modal = function(request) {
  98. $scope.modal = {
  99. title: "Inspector",
  100. body : "<h5>Last Elasticsearch Query</h5><pre>"+
  101. 'curl -XGET '+config.elasticsearch+'/'+$scope.index+"/_search?pretty -d'\n"+
  102. angular.toJson(JSON.parse(request.toString()),true)+
  103. "'</pre>",
  104. }
  105. }
  106. function set_time(time) {
  107. $scope.time = time;
  108. $scope.index = _.isUndefined(time.index) ? $scope.index : time.index
  109. $scope.get_data();
  110. }
  111. $scope.send_query = function(query) {
  112. var _query = _.isArray(query) ? query : [query]
  113. eventBus.broadcast($scope.$id,$scope.panel.group,'query',_query)
  114. }
  115. var update_history = function(query) {
  116. query = _.isArray(query) ? query : [query];
  117. if($scope.panel.remember > 0) {
  118. $scope.panel.history = _.union(query.reverse(),$scope.panel.history)
  119. var _length = $scope.panel.history.length
  120. if(_length > $scope.panel.remember) {
  121. $scope.panel.history = $scope.panel.history.slice(0,$scope.panel.remember)
  122. }
  123. }
  124. }
  125. });