async function runQuery(query, filters) {
let results = [];
let queryMap = new Map(Object.entries(query.query));
filters = d3.shuffle(filters);
log("runQuery: shuffling filters", filters);
for (let filter of filters) {
log("runQuery: creating backend", filter);
let { initialize, filterData, filterer, client } = await filter();
let initStart = performance.now();
log("runQuery: initializing filter", filter);
await initialize(datasets[query.dataset]);
let initEnd = performance.now();
log("runQuery: initialized ", initialize, filterData, filterer);
let execStart = performance.now();
log("runQuery: filtering data", queryMap);
let res = await filterData(queryMap);
let execEnd = performance.now();
log("runQuery: data filtered", queryMap);
results.push({
initTime: initEnd - initStart,
ExecTime: execEnd - execStart,
resLength: res?.length,
res: res,
filterer
});
filterData = null;
initialize = null;
filterer = null;
res = null;
client = null;
}
function checkResults(results) {
return new Set(results.map((d) => d.resLength)).size === 1;
}
let resFlat = { ...query };
delete resFlat["_id"];
log("runQuery: checking results", results);
resFlat.resMatch = checkResults(results);
for (let result of results) {
resFlat[result.filterer] = {};
resFlat[result.filterer]["initTime"] = result.initTime;
resFlat[result.filterer]["execTime"] = result.ExecTime;
if (!resFlat.resMatch) {
resFlat[result.filterer] = result.res;
} else {
resFlat["length"] = result.resLength;
}
}
let order = results.map((d) => d.filterer);
resFlat.execOrder = order;
log("runQuery: creating the log", resFlat);
log("runQuery: results checked", results);
log("runQuery: inserting log to Mongo", resFlat);
let insertCollection = resFlat.resMatch
? mongoDetailsSuccessQuery
: mongoDetailsFailedQuery;
let response = await mongodbClient({
...insertCollection,
operation: "insert",
data: [resFlat]
});
log("runQuery: inserted acknowledged", response.acknowledged);
if (response.acknowledged) {
return { status: true, resFlat };
} else {
return { status: false, resFlat };
}
}