Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: migrate describeTableQuery and showIndexesQuery to TS #15299

Merged
merged 19 commits into from Nov 20, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/dialects/abstract/query-generator-typescript.ts
Expand Up @@ -2,6 +2,7 @@ import NodeUtil from 'node:util';
import isObject from 'lodash/isObject';
import type { ModelStatic } from '../../model.js';
import type { Sequelize } from '../../sequelize.js';
import { noSchemaParameter, noSchemaDelimiterParameter } from '../../utils/deprecations.js';
import { isPlainObject, isString, quoteIdentifier } from '../../utils/index.js';
import { isModelStatic } from '../../utils/model-utils.js';
import type { TableName, TableNameWithSchema } from './query-interface.js';
Expand Down Expand Up @@ -39,6 +40,27 @@ export class AbstractQueryGeneratorTypeScript {
return this.sequelize.options;
}

// TODO [>7]: remove schema and schemaDelimiter parameter
describeTableQuery(tableName: TableName, schema?: string, schemaDelimiter?: string) {
const table = this.extractTableDetails(tableName);

if (schema) {
noSchemaParameter();
table.schema = schema;
}

if (schemaDelimiter) {
noSchemaDelimiterParameter();
table.delimiter = schemaDelimiter;
}

return `DESCRIBE ${this.quoteTable(table)};`;
}

showIndexesQuery(_tableName: TableName): string {
throw new Error(`showIndexesQuery has not been implemented in ${this.dialect.name}.`);
}

extractTableDetails(
tableNameOrModel: TableNameOrModel,
options?: { schema?: string, delimiter?: string },
Expand Down
4 changes: 0 additions & 4 deletions src/dialects/abstract/query-generator.d.ts
Expand Up @@ -192,11 +192,7 @@ export class AbstractQueryGenerator extends AbstractQueryGeneratorTypeScript {
options?: ArithmeticQueryOptions,
): string;

showIndexesQuery(tableName: TableName): string;

dropTableQuery(tableName: TableName, options?: DropTableQueryOptions): string;
// TODO: this should become `describeTableQuery(tableName: TableName): string`
describeTableQuery(tableName: TableName, schema?: string, schemaDelimiter?: string): string;

createSchemaQuery(schemaName: string, options?: CreateSchemaQueryOptions): string;
dropSchemaQuery(schemaName: string): string | { query: string, bind?: unknown[] };
Expand Down
9 changes: 0 additions & 9 deletions src/dialects/abstract/query-generator.js
Expand Up @@ -100,15 +100,6 @@ export class AbstractQueryGenerator extends AbstractQueryGeneratorTypeScript {
throw new Error(`Schemas are not supported in ${this.dialect.name}.`);
}

// TODO: remove schema, schemaDelimiter
describeTableQuery(tableName, schema, schemaDelimiter) {
tableName = this.extractTableDetails(tableName);
tableName.schema = schema || tableName.schema;
tableName.delimiter = schemaDelimiter || tableName.delimiter;

return `DESCRIBE ${this.quoteTable(tableName)};`;
}

dropTableQuery(tableName, options) {
const DROP_TABLE_QUERY_SUPPORTED_OPTIONS = new Set();

Expand Down
43 changes: 43 additions & 0 deletions src/dialects/db2/query-generator-typescript.ts
@@ -0,0 +1,43 @@
import { noSchemaParameter } from '../../utils/deprecations';
import { joinSQLFragments } from '../../utils/join-sql-fragments';
import { AbstractQueryGenerator } from '../abstract/query-generator';
import type { TableName } from '../abstract/query-interface';

/**
* Temporary class to ease the TypeScript migration
*/
export class Db2QueryGeneratorTypeScript extends AbstractQueryGenerator {
// TODO [>7]: remove schema parameter
describeTableQuery(tableName: TableName, schema?: string) {
WikiRik marked this conversation as resolved.
Show resolved Hide resolved
const table = this.extractTableDetails(tableName);

if (schema) {
noSchemaParameter();
table.schema = schema;
}

return joinSQLFragments([
'SELECT NAME AS "Name", TBNAME AS "Table", TBCREATOR AS "Schema",',
'TRIM(COLTYPE) AS "Type", LENGTH AS "Length", SCALE AS "Scale",',
'NULLS AS "IsNull", DEFAULT AS "Default", COLNO AS "Colno",',
'IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq", REMARKS AS "Comment"',
'FROM',
'SYSIBM.SYSCOLUMNS',
`WHERE TBNAME = ${this.escape(table.tableName)}`,
table.schema !== this.dialect.getDefaultSchema() ? `AND TBCREATOR = ${this.escape(table.schema)}` : 'AND TBCREATOR = USER',
WikiRik marked this conversation as resolved.
Show resolved Hide resolved
';',
]);
}

showIndexesQuery(tableName: TableName) {
const table = this.extractTableDetails(tableName);

return joinSQLFragments([
'SELECT NAME AS "name", TBNAME AS "tableName", UNIQUERULE AS "keyType",',
'COLNAMES, INDEXTYPE AS "type" FROM SYSIBM.SYSINDEXES',
`WHERE TBNAME = ${this.escape(table.tableName)}`,
table.schema !== this.dialect.getDefaultSchema() ? `AND TBCREATOR = ${this.escape(table.schema)}` : '',
'ORDER BY NAME;',
]);
}
}
4 changes: 2 additions & 2 deletions src/dialects/db2/query-generator.d.ts
@@ -1,3 +1,3 @@
import { AbstractQueryGenerator } from '../abstract/query-generator.js';
import { Db2QueryGeneratorTypeScript } from './query-generator-typescript.js';

export class Db2QueryGenerator extends AbstractQueryGenerator {}
export class Db2QueryGenerator extends Db2QueryGeneratorTypeScript {}
49 changes: 2 additions & 47 deletions src/dialects/db2/query-generator.js
Expand Up @@ -9,11 +9,11 @@ import {
ADD_COLUMN_QUERY_SUPPORTABLE_OPTIONS,
REMOVE_COLUMN_QUERY_SUPPORTABLE_OPTIONS,
} from '../abstract/query-generator';
import { Db2QueryGeneratorTypeScript } from './query-generator-typescript';

const _ = require('lodash');
const Utils = require('../../utils');
const DataTypes = require('../../data-types');
const { AbstractQueryGenerator } = require('../abstract/query-generator');
const randomBytes = require('crypto').randomBytes;
const { Op } = require('../../operators');

Expand All @@ -26,7 +26,7 @@ function throwMethodUndefined(methodName) {
throw new Error(`The method "${methodName}" is not defined! Please add it to your sql dialect.`);
}

export class Db2QueryGenerator extends AbstractQueryGenerator {
export class Db2QueryGenerator extends Db2QueryGeneratorTypeScript {
constructor(options) {
super(options);

Expand Down Expand Up @@ -180,31 +180,6 @@ export class Db2QueryGenerator extends AbstractQueryGenerator {
return `${_.template(query, this._templateSettings)(values).trim()};${commentStr}`;
}

describeTableQuery(tableName, schema) {
if (typeof tableName === 'object') {
schema = tableName.schema || schema;
tableName = tableName.tableName;
}

let sql = [
'SELECT NAME AS "Name", TBNAME AS "Table", TBCREATOR AS "Schema",',
'TRIM(COLTYPE) AS "Type", LENGTH AS "Length", SCALE AS "Scale",',
'NULLS AS "IsNull", DEFAULT AS "Default", COLNO AS "Colno",',
'IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq", REMARKS AS "Comment"',
'FROM',
'SYSIBM.SYSCOLUMNS',
'WHERE TBNAME =', wrapSingleQuote(tableName),
].join(' ');

if (schema) {
sql += ` AND TBCREATOR =${wrapSingleQuote(schema)}`;
} else {
sql += ' AND TBCREATOR = USER';
}

return `${sql};`;
}

renameTableQuery(before, after) {
const query = 'RENAME TABLE <%= before %> TO <%= after %>;';

Expand Down Expand Up @@ -612,26 +587,6 @@ export class Db2QueryGenerator extends AbstractQueryGenerator {
return super.addIndexQuery(tableName, attributes, options, rawTablename);
}

showIndexesQuery(tableName) {
let sql = 'SELECT NAME AS "name", TBNAME AS "tableName", UNIQUERULE AS "keyType", COLNAMES, INDEXTYPE AS "type" FROM SYSIBM.SYSINDEXES WHERE TBNAME = <%= tableName %>';
let schema;
if (_.isObject(tableName)) {
schema = tableName.schema;
tableName = tableName.tableName;
}

if (schema) {
sql = `${sql} AND TBCREATOR = <%= schemaName %>`;
}

sql = `${sql} ORDER BY NAME;`;

return _.template(sql, this._templateSettings)({
tableName: wrapSingleQuote(tableName),
schemaName: wrapSingleQuote(schema),
});
}

showConstraintsQuery(tableName, constraintName) {
let sql = `SELECT CONSTNAME AS "constraintName", TRIM(TABSCHEMA) AS "schemaName", TABNAME AS "tableName" FROM SYSCAT.TABCONST WHERE TABNAME = '${tableName}'`;

Expand Down
55 changes: 55 additions & 0 deletions src/dialects/ibmi/query-generator-typescript.ts
@@ -0,0 +1,55 @@
import { noSchemaParameter } from '../../utils/deprecations';
import { joinSQLFragments } from '../../utils/join-sql-fragments';
import { AbstractQueryGenerator } from '../abstract/query-generator';
import type { TableName } from '../abstract/query-interface';

/**
* Temporary class to ease the TypeScript migration
*/
export class IBMiQueryGeneratorTypeScript extends AbstractQueryGenerator {
// TODO [>7]: remove schema and schemaDelimiter parameter
describeTableQuery(tableName: TableName, schema?: string) {
const table = this.extractTableDetails(tableName);

if (schema) {
noSchemaParameter();
table.schema = schema;
}

return joinSQLFragments([
'SELECT',
'QSYS2.SYSCOLUMNS.*,',
'QSYS2.SYSCST.CONSTRAINT_NAME,',
'QSYS2.SYSCST.CONSTRAINT_TYPE',
'FROM QSYS2.SYSCOLUMNS',
'LEFT OUTER JOIN QSYS2.SYSCSTCOL',
'ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA',
'AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME',
'AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME',
'LEFT JOIN QSYS2.SYSCST',
'ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME',
'WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA =',
table.schema !== this.dialect.getDefaultSchema() ? `${this.escape(table.schema)}` : 'CURRENT SCHEMA',
'AND QSYS2.SYSCOLUMNS.TABLE_NAME =',
`${this.escape(table.tableName)}`,
]);
}

showIndexesQuery(tableName: TableName) {
const table = this.extractTableDetails(tableName);

// TODO [+odbc]: check if the query also works when capitalized (for consistency)
return joinSQLFragments([
'select QSYS2.SYSCSTCOL.CONSTRAINT_NAME as NAME, QSYS2.SYSCSTCOL.COLUMN_NAME, QSYS2.SYSCST.CONSTRAINT_TYPE, QSYS2.SYSCST.TABLE_SCHEMA,',
'QSYS2.SYSCST.TABLE_NAME from QSYS2.SYSCSTCOL left outer join QSYS2.SYSCST on QSYS2.SYSCSTCOL.TABLE_SCHEMA = QSYS2.SYSCST.TABLE_SCHEMA and',
'QSYS2.SYSCSTCOL.TABLE_NAME = QSYS2.SYSCST.TABLE_NAME and QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME where',
'QSYS2.SYSCSTCOL.TABLE_SCHEMA =',
table.schema !== this.dialect.getDefaultSchema() ? `${this.escape(table.schema)}` : 'CURRENT SCHEMA',
WikiRik marked this conversation as resolved.
Show resolved Hide resolved
`and QSYS2.SYSCSTCOL.TABLE_NAME = ${this.escape(table.tableName)} union select QSYS2.SYSKEYS.INDEX_NAME AS NAME,`,
`QSYS2.SYSKEYS.COLUMN_NAME, CAST('INDEX' AS VARCHAR(11)), QSYS2.SYSINDEXES.TABLE_SCHEMA, QSYS2.SYSINDEXES.TABLE_NAME from QSYS2.SYSKEYS`,
'left outer join QSYS2.SYSINDEXES on QSYS2.SYSKEYS.INDEX_NAME = QSYS2.SYSINDEXES.INDEX_NAME where QSYS2.SYSINDEXES.TABLE_SCHEMA =',
table.schema !== this.dialect.getDefaultSchema() ? `${this.escape(table.schema)}` : 'CURRENT SCHEMA',
WikiRik marked this conversation as resolved.
Show resolved Hide resolved
`and QSYS2.SYSINDEXES.TABLE_NAME = ${this.escape(table.tableName)}`,
]);
}
}
4 changes: 2 additions & 2 deletions src/dialects/ibmi/query-generator.d.ts
@@ -1,3 +1,3 @@
import { AbstractQueryGenerator } from '../abstract/query-generator.js';
import { IBMiQueryGeneratorTypeScript } from './query-generator-typescript.js';

export class IBMiQueryGenerator extends AbstractQueryGenerator {}
export class IBMiQueryGenerator extends IBMiQueryGeneratorTypeScript {}
86 changes: 2 additions & 84 deletions src/dialects/ibmi/query-generator.js
Expand Up @@ -14,7 +14,7 @@ import {
const Utils = require('../../utils');
const util = require('util');
const _ = require('lodash');
const { AbstractQueryGenerator } = require('../abstract/query-generator');
const { IBMiQueryGeneratorTypeScript } = require('./query-generator-typescript');
const DataTypes = require('../../data-types');
const { Model } = require('../../model');
const SqlString = require('../../sql-string');
Expand All @@ -26,7 +26,7 @@ const DROP_TABLE_QUERY_SUPPORTED_OPTIONS = new Set();
const ADD_COLUMN_QUERY_SUPPORTED_OPTIONS = new Set();
const REMOVE_COLUMN_QUERY_SUPPORTED_OPTIONS = new Set();

export class IBMiQueryGenerator extends AbstractQueryGenerator {
export class IBMiQueryGenerator extends IBMiQueryGeneratorTypeScript {

// Version queries
versionQuery() {
Expand Down Expand Up @@ -155,36 +155,6 @@ export class IBMiQueryGenerator extends AbstractQueryGenerator {
return `DROP TABLE IF EXISTS ${this.quoteTable(tableName)}`;
}

describeTableQuery(tableName, schema) {
if (typeof tableName === 'object') {
schema = tableName.schema || schema;
tableName = tableName.tableName;
}

const sql
= `SELECT
QSYS2.SYSCOLUMNS.*,
QSYS2.SYSCST.CONSTRAINT_NAME,
QSYS2.SYSCST.CONSTRAINT_TYPE
FROM
QSYS2.SYSCOLUMNS
LEFT OUTER JOIN
QSYS2.SYSCSTCOL
ON
QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
AND
QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
AND
QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
LEFT JOIN
QSYS2.SYSCST
ON
QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = ${schema ? `'${schema}'` : 'CURRENT SCHEMA'} AND QSYS2.SYSCOLUMNS.TABLE_NAME = '${tableName}'`;

return sql;
}

showTablesQuery(schema) {
return `SELECT TABLE_NAME FROM SYSIBM.SQLTABLES WHERE TABLE_TYPE = 'TABLE' AND TABLE_SCHEM = ${schema ? `'${schema}'` : 'CURRENT SCHEMA'}`;
}
Expand Down Expand Up @@ -601,58 +571,6 @@ export class IBMiQueryGenerator extends AbstractQueryGenerator {

// Indexes and constraints

showIndexesQuery(tableName) {
let table;
let schema;
if (typeof tableName === 'string') {
table = tableName;
} else {
table = tableName.tableName || tableName.table;
schema = tableName.schema;
}

const sql
= `select
QSYS2.SYSCSTCOL.CONSTRAINT_NAME as NAME,
QSYS2.SYSCSTCOL.COLUMN_NAME,
QSYS2.SYSCST.CONSTRAINT_TYPE,
QSYS2.SYSCST.TABLE_SCHEMA,
QSYS2.SYSCST.TABLE_NAME
from
QSYS2.SYSCSTCOL
left outer join
QSYS2.SYSCST
on
QSYS2.SYSCSTCOL.TABLE_SCHEMA = QSYS2.SYSCST.TABLE_SCHEMA
and
QSYS2.SYSCSTCOL.TABLE_NAME = QSYS2.SYSCST.TABLE_NAME
and
QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
where
QSYS2.SYSCSTCOL.TABLE_SCHEMA = ${schema ? `'${schema}'` : 'CURRENT SCHEMA'}
and
QSYS2.SYSCSTCOL.TABLE_NAME = '${table}'
union
select
QSYS2.SYSKEYS.INDEX_NAME AS NAME,
QSYS2.SYSKEYS.COLUMN_NAME,
CAST('INDEX' AS VARCHAR(11)),
QSYS2.SYSINDEXES.TABLE_SCHEMA,
QSYS2.SYSINDEXES.TABLE_NAME
from
QSYS2.SYSKEYS
left outer join
QSYS2.SYSINDEXES
on
QSYS2.SYSKEYS.INDEX_NAME = QSYS2.SYSINDEXES.INDEX_NAME
where
QSYS2.SYSINDEXES.TABLE_SCHEMA = ${schema ? `'${schema}'` : 'CURRENT SCHEMA'}
and
QSYS2.SYSINDEXES.TABLE_NAME = '${table}'`;

return sql;
}

showConstraintsQuery(table, constraintName) {
const tableName = table.tableName || table;
const schemaName = table.schema;
Expand Down