Compare commits

...

2 Commits

Author SHA1 Message Date
369b991991 [Search] Don't re-index from second window
...if another window has already completed indexing
of domain objects for in-memory search.
2015-11-16 15:48:45 -08:00
63430b7f51 [Search] Used shared worker
nasa/openmctweb#308
2015-11-16 15:30:11 -08:00
3 changed files with 45 additions and 22 deletions

View File

@ -66,7 +66,8 @@
"workers": [ "workers": [
{ {
"key": "genericSearchWorker", "key": "genericSearchWorker",
"scriptUrl": "services/GenericSearchWorker.js" "scriptUrl": "services/GenericSearchWorker.js",
"shared": true
} }
] ]
} }

View File

@ -59,11 +59,9 @@ define([
this.worker = this.startWorker(workerService); this.worker = this.startWorker(workerService);
this.indexOnMutation(topic); this.indexOnMutation(topic);
ROOTS.forEach(function indexRoot(rootId) { this.rootsToIndex = ROOTS;
provider.scheduleForIndexing(rootId);
});
this.worker.port.postMessage({ request: 'status' });
} }
/** /**
@ -102,7 +100,8 @@ define([
var worker = workerService.run('genericSearchWorker'), var worker = workerService.run('genericSearchWorker'),
provider = this; provider = this;
worker.addEventListener('message', function (messageEvent) { worker.port.start();
worker.port.addEventListener('message', function (messageEvent) {
provider.onWorkerMessage(messageEvent); provider.onWorkerMessage(messageEvent);
}); });
@ -150,9 +149,12 @@ define([
* @private * @private
*/ */
GenericSearchProvider.prototype.keepIndexing = function () { GenericSearchProvider.prototype.keepIndexing = function () {
if (this.pendingRequests === 0 && this.idsToIndex.length === 0) {
this.worker.port.postMessage({ request: 'finish' });
}
while (this.pendingRequests < this.MAX_CONCURRENT_REQUESTS && while (this.pendingRequests < this.MAX_CONCURRENT_REQUESTS &&
this.idsToIndex.length this.idsToIndex.length) {
) {
this.beginIndexRequest(); this.beginIndexRequest();
} }
}; };
@ -168,7 +170,7 @@ define([
GenericSearchProvider.prototype.index = function (id, model) { GenericSearchProvider.prototype.index = function (id, model) {
var provider = this; var provider = this;
this.worker.postMessage({ this.worker.port.postMessage({
request: 'index', request: 'index',
model: model, model: model,
id: id id: id
@ -220,11 +222,22 @@ define([
* @private * @private
*/ */
GenericSearchProvider.prototype.onWorkerMessage = function (event) { GenericSearchProvider.prototype.onWorkerMessage = function (event) {
var provider = this,
pendingQuery,
modelResults;
if (event.data.request === 'status' && !event.data.finished) {
this.rootsToIndex.forEach(function indexRoot(rootId) {
provider.scheduleForIndexing(rootId);
});
return;
}
if (event.data.request !== 'search') { if (event.data.request !== 'search') {
return; return;
} }
var pendingQuery = this.pendingQueries[event.data.queryId], pendingQuery = this.pendingQueries[event.data.queryId];
modelResults = { modelResults = {
total: event.data.total total: event.data.total
}; };
@ -265,7 +278,7 @@ define([
) { ) {
var queryId = this.makeQueryId(); var queryId = this.makeQueryId();
this.worker.postMessage({ this.worker.port.postMessage({
request: 'search', request: 'search',
input: searchInput, input: searchInput,
maxResults: maxResults, maxResults: maxResults,

View File

@ -30,7 +30,8 @@
// An array of objects composed of domain object IDs and models // An array of objects composed of domain object IDs and models
// {id: domainObject's ID, model: domainObject's model} // {id: domainObject's ID, model: domainObject's model}
var indexedItems = [], var indexedItems = [],
TERM_SPLITTER = /[ _\*]/; TERM_SPLITTER = /[ _\*]/,
status = { request: 'status', finished: false };
function indexItem(id, model) { function indexItem(id, model) {
var vector = { var vector = {
@ -147,11 +148,19 @@
return message; return message;
} }
self.onmessage = function (event) { self.onconnect = function (connectEvent) {
var port = connectEvent.ports[0];
port.onmessage = function (event) {
if (event.data.request === 'index') { if (event.data.request === 'index') {
indexItem(event.data.id, event.data.model); indexItem(event.data.id, event.data.model);
} else if (event.data.request === 'search') { } else if (event.data.request === 'search') {
self.postMessage(search(event.data)); port.postMessage(search(event.data));
} else if (event.data.request === 'status') {
port.postMessage(status);
} else if (event.data.request === 'finish') {
status.finished = true;
} }
}; };
};
}()); }());