Compare commits

...

5 Commits

Author SHA1 Message Date
4ff96ff091 Don't delete cache entry 2021-03-13 17:26:02 -08:00
ad87dd6fdc Only batch if > 1 2021-03-13 17:20:23 -08:00
80c833db88 Batch requests 2021-03-13 13:32:02 -08:00
a756891ccd Promises, not await 2021-03-13 11:57:12 -08:00
2e1b6c5190 Implemented search in couch provider 2021-03-13 10:30:55 -08:00
4 changed files with 86 additions and 17 deletions

View File

@ -180,7 +180,7 @@ ObjectAPI.prototype.get = function (identifier, abortSignal) {
this.cache[keystring] = objectPromise;
return objectPromise.then(result => {
delete this.cache[keystring];
//delete this.cache[keystring];
result = this.applyGetInterceptors(identifier, result);
return result;

View File

@ -26,6 +26,7 @@ import CouchObjectQueue from "./CouchObjectQueue";
const REV = "_rev";
const ID = "_id";
const HEARTBEAT = 50000;
const ALL_DOCS = "_all_docs?include_docs=true";
export default class CouchObjectProvider {
// options {
@ -67,6 +68,9 @@ export default class CouchObjectProvider {
// stringify body if needed
if (fetchOptions.body) {
fetchOptions.body = JSON.stringify(fetchOptions.body);
fetchOptions.headers = {
"Content-Type": "application/json"
};
}
return fetch(this.url + '/' + subPath, fetchOptions)
@ -131,10 +135,70 @@ export default class CouchObjectProvider {
}
get(identifier, abortSignal) {
return this.request(identifier.key, "GET", undefined, abortSignal).then(this.getModel.bind(this));
return new Promise((resolve, reject) => {
this.batchIds = this.batchIds || [];
this.batchIds.push(identifier.key);
if (this.bulkPromise === undefined) {
this.bulkPromise = new Promise((bulkResolve, bulkReject) => {
setTimeout(() => {
let batchIds = this.batchIds;
delete this.batchIds;
delete this.bulkPromise;
if (batchIds.length === 1) {
this.request(identifier.key, "GET", undefined, abortSignal)
.then((result) => resolve(this.getModel(result)));
} else {
this.bulkGet(batchIds, abortSignal)
.then(bulkResolve)
.catch(bulkReject);
}
});
});
}
this.bulkPromise
.then((domainObjectMap) => {
resolve(domainObjectMap[identifier.key]);
})
.catch(error => reject(error));
});
}
async getObjectsByFilter(filter) {
bulkGet(ids, signal) {
//Remove dupes
ids = Array.from(new Set(ids));
const query = {
'keys': ids
};
return this.request(ALL_DOCS, 'POST', query, signal).then((response) => {
return response.rows.reduce((map, row) => {
if (row.doc !== undefined) {
map[row.key] = this.getModel(row.doc);
}
return map;
}, {});
});
}
search(query, abortSignal) {
const filter = {
"selector": {
"model": {
"name": {
"$regex": `(?i)${query}`
}
}
}
};
return this.getObjectsByFilter(filter, abortSignal);
}
async getObjectsByFilter(filter, abortSignal) {
let objects = [];
let url = `${this.url}/_find`;
@ -149,6 +213,7 @@ export default class CouchObjectProvider {
headers: {
"Content-Type": "application/json"
},
signal: abortSignal,
body
});

View File

@ -143,5 +143,9 @@ describe('the plugin', () => {
expect(couchProvider.updateQueued).toHaveBeenCalledTimes(2);
});
describe('batches object requests', () => {
//NEED TO MAKE SURE THERE ARE NO RACE CONDITIONS WHERE REQUESTS FOR OBJECTS ARE DROPPED
});
});
});

View File

@ -710,25 +710,25 @@ export default {
}
});
},
async aggregateSearchResults(results, abortSignal) {
aggregateSearchResults(results, abortSignal) {
for (const result of results) {
if (!abortSignal.aborted) {
const objectPath = await this.openmct.objects.getOriginalPath(result.identifier);
this.openmct.objects.getOriginalPath(result.identifier).then((objectPath) => {
// removing the item itself, as the path we pass to buildTreeItem is a parent path
objectPath.shift();
// removing the item itself, as the path we pass to buildTreeItem is a parent path
objectPath.shift();
// if root, remove, we're not using in object path for tree
let lastObject = objectPath.length ? objectPath[objectPath.length - 1] : false;
if (lastObject && lastObject.type === 'root') {
objectPath.pop();
}
// if root, remove, we're not using in object path for tree
let lastObject = objectPath.length ? objectPath[objectPath.length - 1] : false;
if (lastObject && lastObject.type === 'root') {
objectPath.pop();
}
// we reverse the objectPath in the tree, so have to do it here first,
// since this one is already in the correct direction
let resultObject = this.buildTreeItem(result, objectPath.reverse());
// we reverse the objectPath in the tree, so have to do it here first,
// since this one is already in the correct direction
let resultObject = this.buildTreeItem(result, objectPath.reverse());
this.searchResultItems.push(resultObject);
this.searchResultItems.push(resultObject);
});
}
}
},