mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-18 00:56:02 +00:00
WIP
This commit is contained in:
85
plugins/dbgate-plugin-duckdb/src/backend/Analyser.js
Normal file
85
plugins/dbgate-plugin-duckdb/src/backend/Analyser.js
Normal file
@@ -0,0 +1,85 @@
|
||||
const _ = require('lodash');
|
||||
const { DatabaseAnalyser } = require('dbgate-tools');
|
||||
const sql = require('./sql');
|
||||
const {
|
||||
mapRawTableToTableInfo,
|
||||
mapRawColumnToColumnInfo,
|
||||
mapConstraintRowToForeignKeyInfo: mapDuckDbFkConstraintToForeignKeyInfo,
|
||||
mapConstraintRowToPrimaryKeyInfo,
|
||||
mapIndexRowToIndexInfo,
|
||||
mapConstraintRowToUniqueInfo,
|
||||
mapViewRowToViewInfo,
|
||||
} = require('./Analyser.helpers');
|
||||
|
||||
class Analyser extends DatabaseAnalyser {
|
||||
constructor(dbhan, driver, version) {
|
||||
super(dbhan, driver, version);
|
||||
}
|
||||
|
||||
async _computeSingleObjectId() {
|
||||
const { pureName } = this.singleObjectFilter;
|
||||
this.singleObjectId = pureName;
|
||||
}
|
||||
|
||||
async _getFastSnapshot() {
|
||||
const tablesResult = await this.driver.query(this.dbhan, sql.tables);
|
||||
const columnsResult = await this.driver.query(this.dbhan, sql.columns);
|
||||
const foreignKeysResult = await this.driver.query(this.dbhan, sql.foreignKeys);
|
||||
const primaryKeysResult = await this.driver.query(this.dbhan, sql.primaryKeys);
|
||||
const uniquesResults = await this.driver.query(this.dbhan, sql.uniques);
|
||||
const indexesResult = await this.driver.query(this.dbhan, sql.indexes);
|
||||
const viewsResult = await this.driver.query(this.dbhan, sql.views);
|
||||
|
||||
/**
|
||||
* @type {import('dbgate-types').ForeignKeyInfo[]}
|
||||
*/
|
||||
const foreignKeys = foreignKeysResult.rows?.map(mapDuckDbFkConstraintToForeignKeyInfo).filter(Boolean);
|
||||
|
||||
/**
|
||||
* @type {import('dbgate-types').PrimaryKeyInfo[]}
|
||||
*/
|
||||
const primaryKeys = primaryKeysResult.rows?.map(mapConstraintRowToPrimaryKeyInfo).filter(Boolean);
|
||||
|
||||
/**
|
||||
* @type {import('dbgate-types').UniqueInfo[]}
|
||||
*/
|
||||
const uniques = uniquesResults.rows?.map(mapConstraintRowToUniqueInfo).filter(Boolean);
|
||||
|
||||
/**
|
||||
* @type {import('dbgate-types').IndexInfo[]}
|
||||
*/
|
||||
const indexes = indexesResult.rows?.map(mapIndexRowToIndexInfo).filter(Boolean);
|
||||
|
||||
const views = viewsResult.rows?.map(mapViewRowToViewInfo);
|
||||
|
||||
const columns = columnsResult.rows?.map(mapRawColumnToColumnInfo);
|
||||
const tables = tablesResult.rows?.map(mapRawTableToTableInfo);
|
||||
const tablesExtended = tables.map((table) => ({
|
||||
...table,
|
||||
columns: columns.filter((x) => x.pureName == table.pureName && x.schemaName == table.schemaName),
|
||||
foreignKeys: foreignKeys.filter((x) => x.pureName == table.pureName && x.schemaName == table.schemaName),
|
||||
primaryKey: primaryKeys.find((x) => x.pureName == table.pureName && x.schemaName == table.schemaName),
|
||||
indexes: indexes.filter((x) => x.pureName == table.pureName && x.schemaName == table.schemaName),
|
||||
uniques: uniques.filter((x) => x.pureName == table.pureName && x.schemaName == table.schemaName),
|
||||
}));
|
||||
|
||||
const viewsExtended = views.map((view) => ({
|
||||
...view,
|
||||
columns: columns.filter((x) => x.pureName == view.pureName && x.schemaName == view.schemaName),
|
||||
}));
|
||||
|
||||
return {
|
||||
tables: tablesExtended,
|
||||
views: viewsExtended,
|
||||
};
|
||||
}
|
||||
|
||||
async _runAnalysis() {
|
||||
const structure = await this._getFastSnapshot();
|
||||
return structure;
|
||||
throw new Error('Not implemented');
|
||||
return this._getFastSnapshot();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Analyser;
|
||||
Reference in New Issue
Block a user