module.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. ### Group Events
  11. #### Sends
  12. * query :: Always broadcast as an array, even in multi: false
  13. * get_time :: Request the time object from the timepicker
  14. #### Receives
  15. * query :: An array of queries. This is probably needs to be fixed.
  16. * time :: populate index and time
  17. * fields :: A list of fields known to us
  18. */
  19. angular.module('kibana.derivequeries', [])
  20. .controller('derivequeries', function($scope, eventBus) {
  21. // Set and populate defaults
  22. var _d = {
  23. label : "Search",
  24. query : "*",
  25. group : "default",
  26. field : '_type',
  27. spyable : true,
  28. size : 5,
  29. exclude : []
  30. }
  31. _.defaults($scope.panel,_d);
  32. $scope.init = function() {
  33. eventBus.register($scope,'fields', function(event, fields) {
  34. $scope.panel.sort = _.clone(fields.sort);
  35. $scope.fields = fields.all,
  36. $scope.active = _.clone(fields.active);
  37. });
  38. eventBus.register($scope,'time', function(event,time){set_time(time)});
  39. eventBus.register($scope,'query', function(event, query) {
  40. $scope.panel.query = _.isArray(query) ? query[0] : query;
  41. $scope.get_data();
  42. });
  43. // Now that we're all setup, request the time from our group
  44. eventBus.broadcast($scope.$id,$scope.panel.group,'get_time')
  45. }
  46. $scope.get_data = function() {
  47. // Make sure we have everything for the request to complete
  48. if(_.isUndefined($scope.index) || _.isUndefined($scope.time))
  49. return
  50. $scope.panel.loading = true;
  51. var request = $scope.ejs.Request().indices($scope.index);
  52. // Terms mode
  53. request = request
  54. .facet(ejs.TermsFacet('query')
  55. .field($scope.panel.field)
  56. .size($scope.panel['size'])
  57. .exclude($scope.panel.exclude)
  58. .facetFilter(ejs.QueryFilter(
  59. ejs.FilteredQuery(
  60. ejs.QueryStringQuery($scope.panel.query || '*'),
  61. ejs.RangeFilter($scope.time.field)
  62. .from($scope.time.from)
  63. .to($scope.time.to)
  64. )))).size(0)
  65. $scope.populate_modal(request);
  66. var results = request.doSearch();
  67. // Populate scope when we have results
  68. results.then(function(results) {
  69. $scope.panel.loading = false;
  70. var data = [];
  71. _.each(results.facets.query.terms, function(v) {
  72. data.push($scope.panel.field+":"+v.term)
  73. });
  74. console.log(data)
  75. $scope.send_query(data)
  76. });
  77. }
  78. $scope.set_refresh = function (state) {
  79. $scope.refresh = state;
  80. }
  81. $scope.close_edit = function() {
  82. if($scope.refresh)
  83. $scope.get_data();
  84. $scope.refresh = false;
  85. }
  86. $scope.populate_modal = function(request) {
  87. $scope.modal = {
  88. title: "Inspector",
  89. body : "<h5>Last Elasticsearch Query</h5><pre>"+
  90. 'curl -XGET '+config.elasticsearch+'/'+$scope.index+"/_search?pretty -d'\n"+
  91. angular.toJson(JSON.parse(request.toString()),true)+
  92. "'</pre>",
  93. }
  94. }
  95. function set_time(time) {
  96. $scope.time = time;
  97. $scope.index = _.isUndefined(time.index) ? $scope.index : time.index
  98. $scope.get_data();
  99. }
  100. $scope.send_query = function(query) {
  101. var _query = _.isArray(query) ? query : [query]
  102. eventBus.broadcast($scope.$id,$scope.panel.group,'query',_query)
  103. }
  104. });