| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- define([
- 'angular',
- 'underscore',
- 'config',
- 'kbn'
- ],
- function (angular, _, config, kbn) {
- 'use strict';
- var module = angular.module('kibana.services');
- module.service('querySrv', function(dashboard, ejsResource, filterSrv, $q) {
- // Create an object to hold our service state on the dashboard
- dashboard.current.services.query = dashboard.current.services.query || {};
- _.defaults(dashboard.current.services.query,{
- idQueue : [],
- list : {},
- ids : [],
- });
- this.colors = [
- "#7EB26D","#EAB839","#6ED0E0","#EF843C","#E24D42","#1F78C1","#BA43A9","#705DA0", //1
- "#508642","#CCA300","#447EBC","#C15C17","#890F02","#0A437C","#6D1F62","#584477", //2
- "#B7DBAB","#F4D598","#70DBED","#F9BA8F","#F29191","#82B5D8","#E5A8E2","#AEA2E0", //3
- "#629E51","#E5AC0E","#64B0C8","#E0752D","#BF1B00","#0A50A1","#962D82","#614D93", //4
- "#9AC48A","#F2C96D","#65C5DB","#F9934E","#EA6460","#5195CE","#D683CE","#806EB7", //5
- "#3F6833","#967302","#2F575E","#99440A","#58140C","#052B51","#511749","#3F2B5B", //6
- "#E0F9D7","#FCEACA","#CFFAFF","#F9E2D2","#FCE2DE","#BADFF4","#F9D9F9","#DEDAF7" //7
- ];
- // For convenience
- var ejs = ejsResource(config.elasticsearch);
- var _q = dashboard.current.services.query;
- // Holds all actual queries, including all resolved abstract queries
- var resolvedQueries = [];
- // Defaults for generic query object
- var _query = {
- alias: '',
- pin: false,
- type: 'lucene',
- enable: true
- };
- // Defaults for specific query types
- var _dTypes = {
- "lucene": {
- query: "*"
- },
- "regex": {
- query: ".*"
- },
- "topN": {
- query: "*",
- field: "_type",
- size: 5,
- union: 'AND'
- }
- };
- // query type meta data that is not stored on the dashboard object
- this.queryTypes = {
- lucene: {
- require:">=0.17.0",
- icon: "icon-circle",
- resolve: function(query) {
- // Simply returns itself
- var p = $q.defer();
- p.resolve(_.extend(query,{parent:query.id}));
- return p.promise;
- }
- },
- regex: {
- require:">=0.90.3",
- icon: "icon-circle",
- resolve: function(query) {
- // Simply returns itself
- var p = $q.defer();
- p.resolve(_.extend(query,{parent:query.id}));
- return p.promise;
- }
- },
- topN : {
- require:">=0.90.3",
- icon: "icon-cog",
- resolve: function(q) {
- var suffix = '';
- if (q.union === 'AND') {
- suffix = ' AND (' + (q.query||'*') + ')';
- } else if (q.union === 'OR') {
- suffix = ' OR (' + (q.query||'*') + ')';
- }
- var request = ejs.Request().indices(dashboard.indices);
- // Terms mode
- request = request
- .facet(ejs.TermsFacet('query')
- .field(q.field)
- .size(q.size)
- .facetFilter(ejs.QueryFilter(
- ejs.FilteredQuery(
- ejs.QueryStringQuery(q.query || '*'),
- filterSrv.getBoolFilter(filterSrv.ids)
- )))).size(0);
- var results = request.doSearch();
- // Like the regex and lucene queries, this returns a promise
- return results.then(function(data) {
- var _colors = kbn.colorSteps(q.color,data.facets.query.terms.length);
- var i = -1;
- return _.map(data.facets.query.terms,function(t) {
- ++i;
- return self.defaults({
- query : q.field+':"'+kbn.addslashes(t.term)+'"'+suffix,
- alias : t.term + (q.alias ? " ("+q.alias+")" : ""),
- type : 'lucene',
- color : _colors[i],
- parent : q.id
- });
- });
- });
- }
- }
- };
- // Save a reference to this
- var self = this;
- this.init = function() {
- self.list = dashboard.current.services.query.list;
- self.ids = dashboard.current.services.query.ids;
- // Check each query object, populate its defaults
- _.each(self.list,function(query) {
- query = self.defaults(query);
- });
- if (self.ids.length === 0) {
- self.set({});
- }
- };
- // This is used both for adding queries and modifying them. If an id is passed,
- // the query at that id is updated
- this.set = function(query,id) {
- if(!_.isUndefined(id)) {
- if(!_.isUndefined(self.list[id])) {
- _.extend(self.list[id],query);
- return id;
- } else {
- return false;
- }
- } else {
- // Query must have an id and color already
- query.id = _.isUndefined(query.id) ? nextId() : query.id;
- query.color = query.color || colorAt(query.id);
- // Then it can get defaults
- query = self.defaults(query);
- self.list[query.id] = query;
- self.ids.push(query.id);
- return query.id;
- }
- };
- this.defaults = function(query) {
- _.defaults(query,_query);
- _.defaults(query,_dTypes[query.type]);
- query.color = query.color || colorAt(query.id);
- return query;
- };
- this.remove = function(id) {
- if(!_.isUndefined(self.list[id])) {
- delete self.list[id];
- // This must happen on the full path also since _.without returns a copy
- self.ids = dashboard.current.services.query.ids = _.without(self.ids,id);
- _q.idQueue.unshift(id);
- _q.idQueue.sort(function(v,k){
- return v-k;
- });
- return true;
- } else {
- return false;
- }
- };
- // These are the only query types that can be returned by a compound query.
- this.toEjsObj = function (q) {
- switch(q.type)
- {
- case 'lucene':
- return ejs.QueryStringQuery(q.query || '*');
- case 'regex':
- return ejs.RegexpQuery('_all',q.query);
- default:
- return false;
- }
- };
- //
- this.getQueryObjs = function(ids) {
- if(_.isUndefined(ids)) {
- return resolvedQueries;
- } else {
- return _.flatten(_.map(ids,function(id) {
- return _.where(resolvedQueries,{parent:id});
- }));
- }
- };
- // BROKEN
- this.idsByMode = function(config) {
- switch(config.mode)
- {
- case 'all':
- return _.pluck(_.where(self.list,{enable:true}),'id');
- case 'pinned':
- return _.pluck(_.where(self.list,{pin:true,enable:true}),'id');
- case 'unpinned':
- return _.pluck(_.where(self.list,{pin:false,enable:true}),'id');
- case 'selected':
- return _.intersection(_.pluck(_.where(self.list,{enable:true}),'id'),config.ids);
- default:
- return _.pluck(_.where(self.list,{enable:true}),'id');
- }
- };
- // This populates the internal query list and returns a promise containing it
- this.resolve = function() {
- // Find ids of all abstract queries
- // Get a list of resolvable ids, constrast with total list to get abstract ones
- return $q.all(_.map(self.ids,function(q) {
- return self.queryTypes[self.list[q].type].resolve(_.clone(self.list[q])).then(function(data){
- return data;
- });
- })).then(function(data) {
- resolvedQueries = _.flatten(data);
- _.each(resolvedQueries,function(q,i) {
- q.id = i;
- });
- return resolvedQueries;
- });
- };
- var nextId = function() {
- if(_q.idQueue.length > 0) {
- return _q.idQueue.shift();
- } else {
- return self.ids.length;
- }
- };
- var colorAt = function(id) {
- return self.colors[id % self.colors.length];
- };
- self.init();
- });
- });
|