preloaded data works

This commit is contained in:
Jan Prochazka
2021-11-27 17:49:02 +01:00
parent d4f4211ee4
commit 40d53275e3
12 changed files with 177 additions and 5 deletions

View File

@@ -0,0 +1,47 @@
import _ from 'lodash';
import { DatabaseInfo, EngineDriver } from 'dbgate-types';
export async function enrichWithPreloadedRows(
dbModel: DatabaseInfo,
dbTarget: DatabaseInfo,
conn,
driver: EngineDriver
): Promise<DatabaseInfo> {
// const res = { ...dbTarget, tables: [...(dbTarget.tables || [])] };
const repl = {};
for (const tableTarget of dbTarget.tables) {
const tableModel = dbModel.tables.find(x => x.pairingId == tableTarget.pairingId);
if (tableModel.preloadedRows?.length || 0 == 0) continue;
const keyColumns = tableModel.preloadedRowsKey || tableModel.primaryKey?.columns?.map(x => x.columnName);
if (keyColumns?.length || 0 == 0) continue;
const dmp = driver.createDumper();
if (keyColumns.length == 1) {
dmp.putCmd(
'^select * ^from %f ^where %i ^in (%,v)',
tableTarget,
keyColumns[0],
tableModel.preloadedRows.map(x => x[keyColumns[0]])
);
} else {
dmp.put('^select * ^from %f ^where', tableTarget);
dmp.putCollection(' ^or ', tableTarget.preloadedRows, row => {
dmp.put('(');
dmp.putCollection(' ^and ', keyColumns, col => dmp.put('%i=%v', col, row[col]));
dmp.put(')');
});
dmp.endCommand();
}
const resp = await driver.query(conn, dmp.s);
repl[tableTarget.pairingId] = {
...tableTarget,
preloadedRows: resp.rows,
preloadedRowsKey: keyColumns,
};
}
if (_.isEmpty(repl)) return dbTarget;
return {
...dbTarget,
tables: dbTarget.tables.map(x => repl[x.pairingId] || x),
};
}