Skip to content

Commit feed4fa

Browse files
authored
Merge pull request #198 from sebjulliand/fix/queryOrdering
Fixed schema objects ordering
2 parents ccf6e7b + 540b747 commit feed4fa

File tree

1 file changed

+95
-108
lines changed

1 file changed

+95
-108
lines changed

src/database/schemas.ts

Lines changed: 95 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11

22
import { getInstance } from "../base";
33

4-
import Statement from "./statement";
54
import { JobManager } from "../config";
65

7-
export type SQLType = "schemas"|"tables"|"views"|"aliases"|"constraints"|"functions"|"variables"|"indexes"|"procedures"|"sequences"|"packages"|"triggers"|"types";
8-
type PageData = {filter?: string, offset?: number, limit?: number};
6+
export type SQLType = "schemas" | "tables" | "views" | "aliases" | "constraints" | "functions" | "variables" | "indexes" | "procedures" | "sequences" | "packages" | "triggers" | "types";
7+
type PageData = { filter?: string, offset?: number, limit?: number };
98

109
const typeMap = {
1110
'tables': [`T`, `P`],
@@ -20,8 +19,7 @@ export default class Schemas {
2019
* @param schema Not user input
2120
*/
2221
static async getObjects(schema: string, types: SQLType[], details: PageData = {}): Promise<BasicSQLObject[]> {
23-
let selects: string[] = [];
24-
let query : string;
22+
const selects: string[] = [];
2523

2624
if (details.filter) {
2725
// This is so we can do a case insensitive filter
@@ -38,108 +36,97 @@ export default class Schemas {
3836
`select '${type}' as OBJ_TYPE, SCHEMA_NAME as NAME, SCHEMA_TEXT as TEXT, SYSTEM_SCHEMA_NAME as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
3937
`from QSYS2.SYSSCHEMAS`,
4038
details.filter ? `where UPPER(SCHEMA_NAME) = '${details.filter}' or UPPER(SYSTEM_SCHEMA_NAME) = '${details.filter}'` : ``,
41-
`order by QSYS2.DELIMIT_NAME(SCHEMA_NAME) asc`
4239
].join(` `));
43-
break;
44-
45-
case `tables`:
46-
case `views`:
47-
case `aliases`:
48-
selects.push([
49-
`select '${type}' as OBJ_TYPE, TABLE_NAME as NAME, TABLE_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, BASE_TABLE_SCHEMA as BASE_SCHEMA, BASE_TABLE_NAME as BASE_OBJ`,
50-
`from QSYS2.SYSTABLES`,
51-
`where TABLE_SCHEMA = '${schema}' and TABLE_TYPE in (${typeMap[type].map(item => `'${item}'`).join(`, `)}) ${details.filter ? `and UPPER(TABLE_NAME) like '%${details.filter}%'`: ``}`,
52-
`order by TABLE_NAME asc`
53-
].join(` `));
54-
break;
55-
56-
case `constraints`:
57-
selects.push([
58-
`select '${type}' as OBJ_TYPE, CONSTRAINT_NAME as NAME, CONSTRAINT_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
59-
`from QSYS2.SYSCST`,
60-
`where CONSTRAINT_SCHEMA = '${schema}' ${details.filter ? `and UPPER(CONSTRAINT_NAME) like '%${details.filter}%'`: ``}`,
61-
`order by CONSTRAINT_NAME asc`
62-
].join(` `));
63-
break;
64-
65-
case `functions`:
66-
selects.push([
67-
`select '${type}' as OBJ_TYPE, ROUTINE_NAME as NAME, coalesce(ROUTINE_TEXT, LONG_COMMENT) as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
68-
`from QSYS2.SYSFUNCS`,
69-
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(ROUTINE_NAME) like '%${details.filter}%'`: ``} and FUNCTION_ORIGIN in ('E','U')`,
70-
`order by ROUTINE_NAME asc`
71-
].join(` `));
72-
break;
73-
74-
case `variables`:
75-
selects.push([
76-
`select '${type}' as OBJ_TYPE, VARIABLE_NAME as NAME, VARIABLE_TEXT as TEXT, SYSTEM_VAR_NAME as SYS_NAME, SYSTEM_VAR_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
77-
`from QSYS2.SYSVARIABLES`,
78-
`where VARIABLE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(VARIABLE_NAME) like '%${details.filter}%'`: ``}`,
79-
`order by VARIABLE_NAME asc`
80-
].join(` `));
81-
break;
82-
83-
case `indexes`:
84-
selects.push([
85-
`select '${type}' as OBJ_TYPE, INDEX_NAME as NAME, INDEX_TEXT as TEXT, SYSTEM_INDEX_NAME as SYS_NAME, SYSTEM_INDEX_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
86-
`from QSYS2.SYSINDEXES`,
87-
`where INDEX_SCHEMA = '${schema}' ${details.filter ? `and UPPER(INDEX_NAME) like '%${details.filter}%'`: ``}`,
88-
`order by INDEX_NAME asc`
89-
].join(` `));
90-
break;
91-
92-
case `procedures`:
93-
selects.push([
94-
`select '${type}' as OBJ_TYPE, ROUTINE_NAME as NAME, ROUTINE_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
95-
`from QSYS2.SYSPROCS`,
96-
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(ROUTINE_NAME) like '%${details.filter}%'`: ``}`,
97-
`order by ROUTINE_NAME asc`
98-
].join(` `));
99-
break;
100-
101-
case `sequences`:
102-
selects.push([
103-
`select '${type}' as OBJ_TYPE, SEQUENCE_NAME as NAME, SEQUENCE_TEXT as TEXT, SYSTEM_SEQ_NAME as SYS_NAME, SYSTEM_SEQ_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
104-
`from QSYS2.SYSSEQUENCES`,
105-
`where SEQUENCE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(SEQUENCE_NAME) like '%${details.filter}%'`: ``}`,
106-
`order by SEQUENCE_NAME asc`
107-
].join(` `));
108-
break;
109-
110-
// case `packages`:
111-
// selects.push([
112-
// `select '${type}' as OBJ_TYPE, PACKAGE_NAME as NAME, PACKAGE_TEXT as TEXT, PROGRAM_SCHEMA as BASE_SCHEMA, PROGRAM_NAME as BASE_OBJ, `,
113-
// ` '' as SYS_SCHEMA, '' as SYS_NAME, '' as SPECNAME`,
114-
// `from QSYS2.SQLPACKAGE`,
115-
// `where PACKAGE_SCHEMA = '${schema}' ${details.filter ? `and PACKAGE_NAME like '%${details.filter}%'`: ``}`,
116-
// `order by PACKAGE_NAME asc`
117-
// ].join(` `));
118-
// break;
119-
120-
case `triggers`:
121-
selects.push([
122-
`select '${type}' as OBJ_TYPE, TRIGGER_NAME as NAME, TRIGGER_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, EVENT_OBJECT_SCHEMA as BASE_SCHEMA, EVENT_OBJECT_TABLE as BASE_OBJ`,
123-
`from QSYS2.SYSTRIGGERS`,
124-
`where TRIGGER_SCHEMA = '${schema}' ${details.filter ? `and UPPER(TRIGGER_NAME) like '%${details.filter}%'`: ``}`,
125-
`order by TRIGGER_NAME asc`
126-
].join(` `));
127-
break;
128-
129-
case `types`:
130-
selects.push([
131-
`select '${type}' as OBJ_TYPE, USER_DEFINED_TYPE_NAME as NAME, TYPE_TEXT as TEXT, SYSTEM_TYPE_NAME as SYS_NAME, SYSTEM_TYPE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
132-
`from QSYS2.SYSTYPES`,
133-
`where USER_DEFINED_TYPE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(USER_DEFINED_TYPE_NAME) like '%${details.filter}%'`: ``}`,
134-
`order by USER_DEFINED_TYPE_NAME asc`
135-
].join(` `));
136-
break;
40+
break;
41+
42+
case `tables`:
43+
case `views`:
44+
case `aliases`:
45+
selects.push([
46+
`select '${type}' as OBJ_TYPE, TABLE_NAME as NAME, TABLE_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, BASE_TABLE_SCHEMA as BASE_SCHEMA, BASE_TABLE_NAME as BASE_OBJ`,
47+
`from QSYS2.SYSTABLES`,
48+
`where TABLE_SCHEMA = '${schema}' and TABLE_TYPE in (${typeMap[type].map(item => `'${item}'`).join(`, `)}) ${details.filter ? `and UPPER(TABLE_NAME) like '%${details.filter}%'` : ``}`,
49+
].join(` `));
50+
break;
51+
52+
case `constraints`:
53+
selects.push([
54+
`select '${type}' as OBJ_TYPE, CONSTRAINT_NAME as NAME, CONSTRAINT_TEXT as TEXT, SYSTEM_TABLE_NAME as SYS_NAME, SYSTEM_TABLE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
55+
`from QSYS2.SYSCST`,
56+
`where CONSTRAINT_SCHEMA = '${schema}' ${details.filter ? `and UPPER(CONSTRAINT_NAME) like '%${details.filter}%'` : ``}`,
57+
].join(` `));
58+
break;
59+
60+
case `functions`:
61+
selects.push([
62+
`select '${type}' as OBJ_TYPE, ROUTINE_NAME as NAME, coalesce(ROUTINE_TEXT, LONG_COMMENT) as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
63+
`from QSYS2.SYSFUNCS`,
64+
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(ROUTINE_NAME) like '%${details.filter}%'` : ``} and FUNCTION_ORIGIN in ('E','U')`,
65+
].join(` `));
66+
break;
67+
68+
case `variables`:
69+
selects.push([
70+
`select '${type}' as OBJ_TYPE, VARIABLE_NAME as NAME, VARIABLE_TEXT as TEXT, SYSTEM_VAR_NAME as SYS_NAME, SYSTEM_VAR_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
71+
`from QSYS2.SYSVARIABLES`,
72+
`where VARIABLE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(VARIABLE_NAME) like '%${details.filter}%'` : ``}`,
73+
].join(` `));
74+
break;
75+
76+
case `indexes`:
77+
selects.push([
78+
`select '${type}' as OBJ_TYPE, INDEX_NAME as NAME, INDEX_TEXT as TEXT, SYSTEM_INDEX_NAME as SYS_NAME, SYSTEM_INDEX_SCHEMA as SYS_SCHEMA, '' as SPECNAME, TABLE_SCHEMA as BASE_SCHEMA, TABLE_NAME as BASE_OBJ`,
79+
`from QSYS2.SYSINDEXES`,
80+
`where INDEX_SCHEMA = '${schema}' ${details.filter ? `and UPPER(INDEX_NAME) like '%${details.filter}%'` : ``}`,
81+
].join(` `));
82+
break;
83+
84+
case `procedures`:
85+
selects.push([
86+
`select '${type}' as OBJ_TYPE, ROUTINE_NAME as NAME, ROUTINE_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, SPECIFIC_NAME as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
87+
`from QSYS2.SYSPROCS`,
88+
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(ROUTINE_NAME) like '%${details.filter}%'` : ``}`,
89+
].join(` `));
90+
break;
91+
92+
case `sequences`:
93+
selects.push([
94+
`select '${type}' as OBJ_TYPE, SEQUENCE_NAME as NAME, SEQUENCE_TEXT as TEXT, SYSTEM_SEQ_NAME as SYS_NAME, SYSTEM_SEQ_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
95+
`from QSYS2.SYSSEQUENCES`,
96+
`where SEQUENCE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(SEQUENCE_NAME) like '%${details.filter}%'` : ``}`,
97+
].join(` `));
98+
break;
99+
100+
// case `packages`:
101+
// selects.push([
102+
// `select '${type}' as OBJ_TYPE, PACKAGE_NAME as NAME, PACKAGE_TEXT as TEXT, PROGRAM_SCHEMA as BASE_SCHEMA, PROGRAM_NAME as BASE_OBJ, `,
103+
// ` '' as SYS_SCHEMA, '' as SYS_NAME, '' as SPECNAME`,
104+
// `from QSYS2.SQLPACKAGE`,
105+
// `where PACKAGE_SCHEMA = '${schema}' ${details.filter ? `and PACKAGE_NAME like '%${details.filter}%'`: ``}`,
106+
// ].join(` `));
107+
// break;
108+
109+
case `triggers`:
110+
selects.push([
111+
`select '${type}' as OBJ_TYPE, TRIGGER_NAME as NAME, TRIGGER_TEXT as TEXT, '' as SYS_NAME, '' as SYS_SCHEMA, '' as SPECNAME, EVENT_OBJECT_SCHEMA as BASE_SCHEMA, EVENT_OBJECT_TABLE as BASE_OBJ`,
112+
`from QSYS2.SYSTRIGGERS`,
113+
`where TRIGGER_SCHEMA = '${schema}' ${details.filter ? `and UPPER(TRIGGER_NAME) like '%${details.filter}%'` : ``}`,
114+
].join(` `));
115+
break;
116+
117+
case `types`:
118+
selects.push([
119+
`select '${type}' as OBJ_TYPE, USER_DEFINED_TYPE_NAME as NAME, TYPE_TEXT as TEXT, SYSTEM_TYPE_NAME as SYS_NAME, SYSTEM_TYPE_SCHEMA as SYS_SCHEMA, '' as SPECNAME, '' as BASE_SCHEMA, '' as BASE_OBJ`,
120+
`from QSYS2.SYSTYPES`,
121+
`where USER_DEFINED_TYPE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(USER_DEFINED_TYPE_NAME) like '%${details.filter}%'` : ``}`,
122+
].join(` `));
123+
break;
137124
}
138125
}
139126

140-
query = selects.map(s => `select * from (${s})`).join(`\n UNION ALL \n`);
127+
const query = `${selects.join(" UNION ALL ")} Order by QSYS2.DELIMIT_NAME(NAME) asc`;
141128

142-
let objects : any[] = await JobManager.runSQL([
129+
const objects: any[] = await JobManager.runSQL([
143130
query,
144131
`${details.limit ? `limit ${details.limit}` : ``} ${details.offset ? `offset ${details.offset}` : ``}`
145132
].join(` `));
@@ -166,20 +153,20 @@ export default class Schemas {
166153
* @param object Not user input
167154
*/
168155
static async generateSQL(schema: string, object: string, internalType: string): Promise<string> {
169-
const lines = await JobManager.runSQL<{SRCDTA: string}>([
156+
const lines = await JobManager.runSQL<{ SRCDTA: string }>([
170157
`CALL QSYS2.GENERATE_SQL(?, ?, ?, CREATE_OR_REPLACE_OPTION => '1', PRIVILEGES_OPTION => '0')`
171-
].join(` `), { parameters : [object, schema, internalType] });
158+
].join(` `), { parameters: [object, schema, internalType] });
172159

173160
const generatedStatement = lines.map(line => line.SRCDTA).join(`\n`);
174-
161+
175162
return generatedStatement;
176163
}
177-
178-
static async deleteObject(schema: string, name:string, type: string): Promise<void> {
164+
165+
static async deleteObject(schema: string, name: string, type: string): Promise<void> {
179166
const query = `DROP ${(this.isRoutineType(type) ? 'SPECIFIC ' : '') + type} IF EXISTS ${schema}.${name}`;
180167
await getInstance().getContent().runSQL(query);
181168
}
182-
169+
183170
static async renameObject(schema: string, oldName: string, newName: string, type: string): Promise<void> {
184171
const query = `RENAME ${type === 'view' ? 'table' : type} ${schema}.${oldName} TO ${newName}`;
185172
await getInstance().getContent().runSQL(query);

0 commit comments

Comments
 (0)