Skip to content

Commit

Permalink
Make a scan util
Browse files Browse the repository at this point in the history
Fixes #5586
  • Loading branch information
jbudz committed Dec 9, 2015
1 parent bdf4877 commit 9abbd28
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 114 deletions.
50 changes: 12 additions & 38 deletions src/plugins/kibana/public/dashboard/services/saved_dashboards.js
@@ -1,6 +1,8 @@
define(function (require) {
var module = require('ui/modules').get('app/dashboard');
var _ = require('lodash');
var Scanner = require('ui/utils/scanner');

// bring in the factory
require('plugins/kibana/dashboard/services/_saved_dashboard');

Expand All @@ -14,6 +16,11 @@ define(function (require) {

// This is the only thing that gets injected into controllers
module.service('savedDashboards', function (Promise, SavedDashboard, kbnIndex, es, kbnUrl) {
var scanner = new Scanner(es, {
index: kbnIndex,
type: 'dashboard'
});

this.type = SavedDashboard.type;
this.Class = SavedDashboard;

Expand Down Expand Up @@ -41,44 +48,11 @@ define(function (require) {
});
};

this.scan = function (pageSize = 100, docCount = 1000) {
var allResults = {
hits: [],
total: 0
};

var self = this;
return new Promise(function (resolve, reject) {
es.search({
index: kbnIndex,
type: 'dashboard',
size: pageSize,
body: { query: {match_all: {}}},
searchType: 'scan',
scroll: '1m'
}, function getMoreUntilDone(error, response) {
var scanAllResults = docCount === Number.POSITIVE_INFINITY;
allResults.total = scanAllResults ? response.hits.total : Math.min(response.hits.total, docCount);

var hits = response.hits.hits
.slice(0, allResults.total - allResults.hits.length)
.map(self.mapHits.bind(self));
allResults.hits = allResults.hits.concat(hits);

var collectedAllResults = allResults.total === allResults.hits.length;
if (collectedAllResults) {
resolve(allResults);
} else {
es.scroll({
scrollId: response._scroll_id,
}, getMoreUntilDone);
}
});
});
};

this.scanAll = function (queryString, pageSize = 100) {
return this.scan(pageSize, Number.POSITIVE_INFINITY);
this.scanAll = function (queryString, pageSize = 1000) {
return scanner.scanAndMap(queryString, {
pageSize,
docCount: Number.POSITIVE_INFINITY
}, this.mapHits.bind(this));
};

this.mapHits = function (hit) {
Expand Down
48 changes: 10 additions & 38 deletions src/plugins/kibana/public/discover/saved_searches/saved_searches.js
@@ -1,5 +1,6 @@
define(function (require) {
var _ = require('lodash');
var Scanner = require('ui/utils/scanner');

require('plugins/kibana/discover/saved_searches/_saved_search');
require('ui/notify');
Expand All @@ -16,7 +17,10 @@ define(function (require) {
});

module.service('savedSearches', function (Promise, config, kbnIndex, es, createNotifier, SavedSearch, kbnUrl) {

var scanner = new Scanner(es, {
index: kbnIndex,
type: 'search'
});

var notify = createNotifier({
location: 'Saved Searches'
Expand All @@ -31,44 +35,12 @@ define(function (require) {
nouns: 'saved searches'
};

this.scan = function (pageSize = 100, docCount = 1000) {
var allResults = {
hits: [],
total: 0
};

var self = this;
return new Promise(function (resolve, reject) {
es.search({
index: kbnIndex,
type: 'search',
size: pageSize,
body: { query: {match_all: {}}},
searchType: 'scan',
scroll: '1m'
}, function getMoreUntilDone(error, response) {
var scanAllResults = docCount === Number.POSITIVE_INFINITY;
allResults.total = scanAllResults ? response.hits.total : Math.min(response.hits.total, docCount);

var hits = response.hits.hits
.slice(0, allResults.total - allResults.hits.length)
.map(self.mapHits.bind(self));
allResults.hits = allResults.hits.concat(hits);

var collectedAllResults = allResults.total === allResults.hits.length;
if (collectedAllResults) {
resolve(allResults);
} else {
es.scroll({
scrollId: response._scroll_id,
}, getMoreUntilDone);
}
});
});
};

this.scanAll = function (queryString, pageSize = 100) {
return this.scan(pageSize, Number.POSITIVE_INFINITY);
this.scanAll = function (queryString, pageSize = 1000) {
return scanner.scanAndMap(queryString, {
pageSize,
docCount: Number.POSITIVE_INFINITY
}, this.mapHits.bind(this));
};


Expand Down
@@ -1,6 +1,7 @@
define(function (require) {
var app = require('ui/modules').get('app/visualize');
var _ = require('lodash');
var Scanner = require('ui/utils/scanner');

require('plugins/kibana/visualize/saved_visualizations/_saved_vis');

Expand All @@ -13,6 +14,12 @@ define(function (require) {

app.service('savedVisualizations', function (Promise, es, kbnIndex, SavedVis, Private, Notifier, kbnUrl) {
var visTypes = Private(require('ui/registry/vis_types'));

var scanner = new Scanner(es, {
index: kbnIndex,
type: 'visualization'
});

var notify = new Notifier({
location: 'Saved Visualization Service'
});
Expand Down Expand Up @@ -41,44 +48,11 @@ define(function (require) {
});
};

this.scan = function (pageSize = 100, docCount = 1000) {
var allResults = {
hits: [],
total: 0
};

var self = this;
return new Promise(function (resolve, reject) {
es.search({
index: kbnIndex,
type: 'visualization',
size: pageSize,
body: { query: {match_all: {}}},
searchType: 'scan',
scroll: '1m'
}, function getMoreUntilDone(error, response) {
var scanAllResults = docCount === Number.POSITIVE_INFINITY;
allResults.total = scanAllResults ? response.hits.total : Math.min(response.hits.total, docCount);

var hits = response.hits.hits
.slice(0, allResults.total - allResults.hits.length)
.map(self.mapHits.bind(self));
allResults.hits = allResults.hits.concat(hits);

var collectedAllResults = allResults.total === allResults.hits.length;
if (collectedAllResults) {
resolve(allResults);
} else {
es.scroll({
scrollId: response._scroll_id,
}, getMoreUntilDone);
}
});
});
};

this.scanAll = function (queryString, pageSize = 100) {
return this.scan(pageSize, Number.POSITIVE_INFINITY);
this.scanAll = function (queryString, pageSize = 1000) {
return scanner.scanAndMap(queryString, {
pageSize,
docCount: Number.POSITIVE_INFINITY
}, this.mapHits.bind(this));
};

this.mapHits = function (hit) {
Expand Down
69 changes: 69 additions & 0 deletions src/ui/public/utils/scanner.js
@@ -0,0 +1,69 @@
var _ = require('lodash');

var Scanner = function (client, {index, type}) {
if (!index) throw new Error('Expected index');
if (!type) throw new Error('Expected type');
if (!client) throw new Error('Expected client');

this.client = client;
this.index = index;
this.type = type;
};

Scanner.prototype.scanAndMap = function (searchString, options, mapFn) {
const opts = _.defaults({
pageSize: 100,
docCount: 1000
}, options);

var allResults = {
hits: [],
total: 0
};

var body;
if (searchString) {
body = {
query: {
simple_query_string: {
query: searchString + '*',
fields: ['title^3', 'description'],
default_operator: 'AND'
}
}
};
} else {
body = { query: {match_all: {}}};
}

return new Promise((resolve, reject) => {
this.client.search({
index: this.index,
type: this.type,
size: opts.pageSize,
body,
searchType: 'scan',
scroll: '1m'
}, function getMoreUntilDone(error, response) {
var scanAllResults = opts.docCount === Number.POSITIVE_INFINITY;
allResults.total = scanAllResults ? response.hits.total : Math.min(response.hits.total, opts.docCount);

var hits = response.hits.hits
.slice(0, allResults.total - allResults.hits.length);
if (mapFn) hits = hits.map(mapFn);

allResults.hits = allResults.hits.concat(hits);

var collectedAllResults = allResults.total === allResults.hits.length;
if (collectedAllResults) {
resolve(allResults);
} else {
this.client.scroll({
scrollId: response._scroll_id,
}, getMoreUntilDone);
}
});
});
};

export default Scanner;

0 comments on commit 9abbd28

Please sign in to comment.