Skip to content

Commit b35adf8

Browse files
authored
Merge pull request #249 from codefori/feature/improved_filter
Improved filtering schemas
2 parents 1e2c546 + d79e619 commit b35adf8

File tree

3 files changed

+34
-18
lines changed

3 files changed

+34
-18
lines changed

src/database/schemas.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,33 @@ const typeMap = {
1414

1515
export const AllSQLTypes: SQLType[] = ["tables", "views", "aliases", "constraints", "functions", "variables", "indexes", "procedures", "sequences", "packages", "triggers", "types"];
1616

17+
export const SQL_ESCAPE_CHAR = `\\`;
18+
19+
function getFilterClause(againstColumn: string, filter: string|undefined, noAnd?: boolean): string {
20+
if (!filter) {
21+
return ``;
22+
}
23+
24+
let clause = `${noAnd ? '' : 'AND '} UPPER(${againstColumn})`;
25+
26+
if (filter.endsWith(`*`)) {
27+
clause += ` LIKE '${filter.slice(0, -1).toUpperCase()}%'`;
28+
} else {
29+
clause += ` LIKE '%${filter.toUpperCase()}%'`;
30+
}
31+
32+
clause += ` ESCAPE '${SQL_ESCAPE_CHAR}'`;
33+
34+
return clause;
35+
}
36+
1737
export default class Schemas {
1838
/**
1939
* @param schema Not user input
2040
*/
2141
static async getObjects(schema: string, types: SQLType[], details: PageData = {}): Promise<BasicSQLObject[]> {
2242
const selects: string[] = [];
2343

24-
if (details.filter) {
25-
// This is so we can do a case insensitive filter
26-
details.filter = details.filter.toUpperCase();
27-
}
28-
2944
// If there are multiple types, we build a union. It's important that the ordering of the columns in the selects are consistant:
3045
// OBJ_TYPE, NAME, TEXT, SYS_NAME, SYS_SCHEMA, SPECNAME, BASE_SCHEMA, BASE_OBJ
3146

@@ -45,55 +60,55 @@ export default class Schemas {
4560
selects.push([
4661
`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`,
4762
`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}%'` : ``}`,
63+
`where TABLE_SCHEMA = '${schema}' and TABLE_TYPE in (${typeMap[type].map(item => `'${item}'`).join(`, `)}) ${getFilterClause(`TABLE_NAME`, details.filter)}`,
4964
].join(` `));
5065
break;
5166

5267
case `constraints`:
5368
selects.push([
5469
`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`,
5570
`from QSYS2.SYSCST`,
56-
`where CONSTRAINT_SCHEMA = '${schema}' ${details.filter ? `and UPPER(CONSTRAINT_NAME) like '%${details.filter}%'` : ``}`,
71+
`where CONSTRAINT_SCHEMA = '${schema}' ${getFilterClause(`CONSTRAINT_NAME`, details.filter)}`,
5772
].join(` `));
5873
break;
5974

6075
case `functions`:
6176
selects.push([
6277
`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`,
6378
`from QSYS2.SYSFUNCS`,
64-
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(ROUTINE_NAME) like '%${details.filter}%'` : ``} and FUNCTION_ORIGIN in ('E','U')`,
79+
`where ROUTINE_SCHEMA = '${schema}' ${getFilterClause(`ROUTINE_NAME`, details.filter)} and FUNCTION_ORIGIN in ('E','U')`,
6580
].join(` `));
6681
break;
6782

6883
case `variables`:
6984
selects.push([
7085
`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`,
7186
`from QSYS2.SYSVARIABLES`,
72-
`where VARIABLE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(VARIABLE_NAME) like '%${details.filter}%'` : ``}`,
87+
`where VARIABLE_SCHEMA = '${schema}' ${getFilterClause(`VARIABLE_NAME`, details.filter)}`,
7388
].join(` `));
7489
break;
7590

7691
case `indexes`:
7792
selects.push([
7893
`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`,
7994
`from QSYS2.SYSINDEXES`,
80-
`where INDEX_SCHEMA = '${schema}' ${details.filter ? `and UPPER(INDEX_NAME) like '%${details.filter}%'` : ``}`,
95+
`where INDEX_SCHEMA = '${schema}' ${getFilterClause(`INDEX_NAME`, details.filter)}`,
8196
].join(` `));
8297
break;
8398

8499
case `procedures`:
85100
selects.push([
86101
`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`,
87102
`from QSYS2.SYSPROCS`,
88-
`where ROUTINE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(ROUTINE_NAME) like '%${details.filter}%'` : ``}`,
103+
`where ROUTINE_SCHEMA = '${schema}' ${getFilterClause(`ROUTINE_NAME`, details.filter)}`,
89104
].join(` `));
90105
break;
91106

92107
case `sequences`:
93108
selects.push([
94109
`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`,
95110
`from QSYS2.SYSSEQUENCES`,
96-
`where SEQUENCE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(SEQUENCE_NAME) like '%${details.filter}%'` : ``}`,
111+
`where SEQUENCE_SCHEMA = '${schema}' ${getFilterClause(`SEQUENCE_NAME`, details.filter)}`,
97112
].join(` `));
98113
break;
99114

@@ -110,15 +125,15 @@ export default class Schemas {
110125
selects.push([
111126
`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`,
112127
`from QSYS2.SYSTRIGGERS`,
113-
`where TRIGGER_SCHEMA = '${schema}' ${details.filter ? `and UPPER(TRIGGER_NAME) like '%${details.filter}%'` : ``}`,
128+
`where TRIGGER_SCHEMA = '${schema}' ${getFilterClause(`TRIGGER_NAME`, details.filter)}`,
114129
].join(` `));
115130
break;
116131

117132
case `types`:
118133
selects.push([
119134
`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`,
120135
`from QSYS2.SYSTYPES`,
121-
`where USER_DEFINED_TYPE_SCHEMA = '${schema}' ${details.filter ? `and UPPER(USER_DEFINED_TYPE_NAME) like '%${details.filter}%'` : ``}`,
136+
`where USER_DEFINED_TYPE_SCHEMA = '${schema}' ${getFilterClause(`USER_DEFINED_TYPE_NAME`, details.filter)}`,
122137
].join(` `));
123138
break;
124139
}

src/testing/manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ export const ManagerSuite: TestSuite = {
8383
assert.strictEqual(runningJobs.length, 2);
8484

8585
// Returns false due to bad name
86-
assert.strictEqual(JobManager.setSelection(`badName`), false);
86+
assert.strictEqual(JobManager.setSelection(`badName`), undefined);
8787

88-
assert.strictEqual(JobManager.setSelection(runningJobs[0].name), true);
88+
assert.notStrictEqual(JobManager.setSelection(runningJobs[0].name), undefined);
8989

9090
assert.strictEqual(JobManager.getSelection().name, runningJobs[0].name);
9191

src/views/schemaBrowser/schemaBrowser.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
import { ThemeIcon, TreeItem } from "vscode"
33
import * as vscode from "vscode"
4-
import Schemas, { AllSQLTypes, SQLType } from "../../database/schemas";
4+
import Schemas, { AllSQLTypes, SQL_ESCAPE_CHAR, SQLType } from "../../database/schemas";
55
import Table from "../../database/table";
66
import { getInstance, loadBase } from "../../base";
77

@@ -360,7 +360,8 @@ export default class schemaBrowser {
360360
const value = await vscode.window.showInputBox({
361361
title: `Set filter for ${node.schema}`,
362362
value: this.filters[node.schema],
363-
prompt: `Show objects that start with this value. Blank to reset.`
363+
placeHolder: `COOL_IEW, COOL*, COOL\\_, etc`,
364+
prompt: `Show objects that contain this value (case-insensitive). Blank to reset. When using '_', escape it with '${SQL_ESCAPE_CHAR}'. Use '*' for wildcard at end.`,
364365
});
365366

366367
if (value !== undefined) {

0 commit comments

Comments
 (0)