mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-03 08:13:57 +00:00
mysql index analysis works
This commit is contained in:
@@ -2,7 +2,7 @@ const engines = require('../engines');
|
|||||||
const { testWrapper } = require('../tools');
|
const { testWrapper } = require('../tools');
|
||||||
|
|
||||||
const t1Sql = 'CREATE TABLE t1 (id int not null primary key, val1 varchar(50) null)';
|
const t1Sql = 'CREATE TABLE t1 (id int not null primary key, val1 varchar(50) null)';
|
||||||
const ix1Sql = 'CREATE index ix1 ON t1(val1)';
|
const ix1Sql = 'CREATE index ix1 ON t1(val1, id)';
|
||||||
const t2Sql = 'CREATE TABLE t2 (id int not null primary key, val2 varchar(50) null)';
|
const t2Sql = 'CREATE TABLE t2 (id int not null primary key, val2 varchar(50) null)';
|
||||||
|
|
||||||
const txMatch = (tname, vcolname, nextcol) =>
|
const txMatch = (tname, vcolname, nextcol) =>
|
||||||
@@ -120,8 +120,9 @@ describe('Table analyse', () => {
|
|||||||
|
|
||||||
const t1 = structure.tables.find(x => x.pureName == 't1');
|
const t1 = structure.tables.find(x => x.pureName == 't1');
|
||||||
expect(t1.indexes.length).toEqual(1);
|
expect(t1.indexes.length).toEqual(1);
|
||||||
expect(t1.indexes[0].columns.length).toEqual(1);
|
expect(t1.indexes[0].columns.length).toEqual(2);
|
||||||
expect(t1.indexes[0].columns[0]).toEqual(expect.objectContaining({ columnName: 'val1' }));
|
expect(t1.indexes[0].columns[0]).toEqual(expect.objectContaining({ columnName: 'val1' }));
|
||||||
|
expect(t1.indexes[0].columns[1]).toEqual(expect.objectContaining({ columnName: 'id' }));
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const viewTexts = await this.getViewTexts(views.rows.map(x => x.pureName));
|
const viewTexts = await this.getViewTexts(views.rows.map(x => x.pureName));
|
||||||
|
const indexes = await this.driver.query(this.pool, this.createQuery('indexes', ['tables']));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
tables: tables.rows.map(table => ({
|
tables: tables.rows.map(table => ({
|
||||||
@@ -83,6 +84,19 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
columns: columns.rows.filter(col => col.pureName == table.pureName).map(getColumnInfo),
|
columns: columns.rows.filter(col => col.pureName == table.pureName).map(getColumnInfo),
|
||||||
primaryKey: DatabaseAnalyser.extractPrimaryKeys(table, pkColumns.rows),
|
primaryKey: DatabaseAnalyser.extractPrimaryKeys(table, pkColumns.rows),
|
||||||
foreignKeys: DatabaseAnalyser.extractForeignKeys(table, fkColumns.rows),
|
foreignKeys: DatabaseAnalyser.extractForeignKeys(table, fkColumns.rows),
|
||||||
|
uniques: [],
|
||||||
|
indexes: _.uniqBy(
|
||||||
|
indexes.rows.filter(idx => idx.tableName == table.pureName),
|
||||||
|
'constraintName'
|
||||||
|
).map(idx => ({
|
||||||
|
..._.pick(idx, ['constraintName', 'indexType']),
|
||||||
|
isUnique: !idx.nonUnique,
|
||||||
|
columns: indexes.rows
|
||||||
|
.filter(col => col.tableName == idx.tableName && col.constraintName == idx.constraintName)
|
||||||
|
.map(col => ({
|
||||||
|
..._.pick(col, ['columnName']),
|
||||||
|
})),
|
||||||
|
})),
|
||||||
})),
|
})),
|
||||||
views: views.rows.map(view => ({
|
views: views.rows.map(view => ({
|
||||||
...view,
|
...view,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ const primaryKeys = require('./primaryKeys');
|
|||||||
const foreignKeys = require('./foreignKeys');
|
const foreignKeys = require('./foreignKeys');
|
||||||
const tableModifications = require('./tableModifications');
|
const tableModifications = require('./tableModifications');
|
||||||
const views = require('./views');
|
const views = require('./views');
|
||||||
|
const indexes = require('./indexes');
|
||||||
const programmables = require('./programmables');
|
const programmables = require('./programmables');
|
||||||
const procedureModifications = require('./procedureModifications');
|
const procedureModifications = require('./procedureModifications');
|
||||||
const functionModifications = require('./functionModifications');
|
const functionModifications = require('./functionModifications');
|
||||||
@@ -18,4 +19,5 @@ module.exports = {
|
|||||||
programmables,
|
programmables,
|
||||||
procedureModifications,
|
procedureModifications,
|
||||||
functionModifications,
|
functionModifications,
|
||||||
|
indexes,
|
||||||
};
|
};
|
||||||
|
|||||||
11
plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js
Normal file
11
plugins/dbgate-plugin-mysql/src/backend/sql/indexes.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = `
|
||||||
|
SELECT
|
||||||
|
INDEX_NAME AS constraintName,
|
||||||
|
TABLE_NAME AS tableName,
|
||||||
|
COLUMN_NAME AS columnName,
|
||||||
|
INDEX_TYPE AS indexType,
|
||||||
|
NON_UNIQUE AS nonUnique
|
||||||
|
FROM INFORMATION_SCHEMA.STATISTICS
|
||||||
|
WHERE TABLE_SCHEMA = '#DATABASE#' AND TABLE_NAME =OBJECT_ID_CONDITION AND INDEX_NAME != 'PRIMARY' AND INDEX_NAME NOT LIKE 'IFK_%'
|
||||||
|
ORDER BY SEQ_IN_INDEX
|
||||||
|
`;
|
||||||
Reference in New Issue
Block a user