Skip to content

Commit c797ced

Browse files
committed
Refactoring
1 parent c954d45 commit c797ced

File tree

3 files changed

+54
-46
lines changed

3 files changed

+54
-46
lines changed

src/views/results/codegen.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { assert, expect, test } from 'vitest'
2+
import { columnToRpgDefinition } from './codegen';
3+
4+
test('Basic tokens', () => {
5+
const rpgdef = columnToRpgDefinition({display_size: 0, label: '', name: '', type: 'VARCHAR', precision: 60, scale: 0});
6+
expect(rpgdef).toBe('varchar(60)');
7+
});
8+

src/views/results/codegen.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { ColumnMetaData, QueryResult } from "@ibm/mapepire-js";
2+
3+
export function queryResultToRpgDs(result: QueryResult<any>) : string {
4+
let content = `dcl-ds row_t qualified template;\n`;
5+
for (let i = 0; i < result.metadata.column_count; i++) {
6+
const name = `${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()}`
7+
content += ` ${name} ${columnToRpgDefinition(result.metadata.columns[i])};\n`;
8+
}
9+
content += `end-ds;\n`;
10+
return content;
11+
}
12+
13+
export function columnToRpgDefinition(column: ColumnMetaData) : string {
14+
switch (column.type) {
15+
case `NUMERIC`:
16+
return `zoned(${column.precision}${column.scale > 0 ? ' : ' + column.scale : ''})`;
17+
case `DECIMAL`:
18+
return `packed(${column.precision}${column.scale > 0 ? ' : ' + column.scale : ''})`;
19+
case `CHAR`:
20+
return `char(${column.precision})`;
21+
case `VARCHAR`:
22+
return `varchar(${column.precision})`;
23+
case `DATE`:
24+
return `date`;
25+
case `TIME`:
26+
return `time`;
27+
case `TIMESTAMP`:
28+
return `timestamp`;
29+
case `SMALLINT`:
30+
return `int(5)`;
31+
case `INTEGER`:
32+
return `int(10)`;
33+
case `BIGINT`:
34+
return `int(20)`;
35+
case `BOOLEAN`:
36+
return `ind`;
37+
default:
38+
return `// type:${column.type} precision:${column.precision} scale:${column.scale}`;
39+
}
40+
}

src/views/results/index.ts

Lines changed: 6 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { generateSqlForAdvisedIndexes } from "./explain/advice";
1717
import { updateStatusBar } from "../jobManager/statusBar";
1818
import { DbCache } from "../../language/providers/logic/cache";
1919
import { ExplainType } from "../../connection/types";
20-
import { ColumnMetaData, QueryResult } from "@ibm/mapepire-js";
20+
import { queryResultToRpgDs } from "./codegen";
2121

2222
export type StatementQualifier = "statement" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql" | "rpg";
2323

@@ -386,10 +386,13 @@ async function runHandler(options?: StatementInfo) {
386386
updateStatusBar({executing: true});
387387
const result = await JobManager.runSQLVerbose(statementDetail.content, undefined, 1);
388388
setCancelButtonVisibility(false);
389-
let content: string = await statementToRpgDs(result, statementDetail.content);
389+
updateStatusBar({executing: false});
390+
let content = `**free\n\n`
391+
+ `// statement: ${statementDetail.content}\n\n`
392+
+ `// Row data structure\n`
393+
+ queryResultToRpgDs(result);
390394
const textDoc = await vscode.workspace.openTextDocument({ language: 'rpgle', content });
391395
await vscode.window.showTextDocument(textDoc);
392-
updateStatusBar({executing: false});
393396
chosenView.setLoadingText(`RPG data structure generated.`, false);
394397
}
395398

@@ -497,49 +500,6 @@ async function runHandler(options?: StatementInfo) {
497500
}
498501
}
499502

500-
function statementToRpgDs(result: QueryResult<any>, statement: string) : string {
501-
502-
let content = `**free\n\n`
503-
+ `// statement: ${statement}\n\n`
504-
+ `// Row data structure\ndcl-ds row_t qualified template;\n`;
505-
506-
for (let i = 0; i < result.metadata.column_count; i++) {
507-
const name = `${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()}`
508-
content += ` ${name} ${columnToRpgDefinition(result.metadata.columns[i])};\n`;
509-
}
510-
content += `end-ds;\n`;
511-
return content;
512-
}
513-
514-
function columnToRpgDefinition(column: ColumnMetaData) : string {
515-
switch (column.type) {
516-
case `NUMERIC`:
517-
return `zoned(${column.precision}${column.scale > 0 ? ' : ' + column.scale : ''})`;
518-
case `DECIMAL`:
519-
return `packed(${column.precision}${column.scale > 0 ? ' : ' + column.scale : ''})`;
520-
case `CHAR`:
521-
return `char(${column.precision})`;
522-
case `VARCHAR`:
523-
return `varchar(${column.precision})`;
524-
case `DATE`:
525-
return `date`;
526-
case `TIME`:
527-
return `time`;
528-
case `TIMESTAMP`:
529-
return `timestamp`;
530-
case `SMALLINT`:
531-
return `int(5)`;
532-
case `INTEGER`:
533-
return `int(10)`;
534-
case `BIGINT`:
535-
return `int(20)`;
536-
case `BOOLEAN`:
537-
return `ind`;
538-
default:
539-
return `// type:${column.type} precision:${column.precision} scale:${column.scale}`;
540-
}
541-
}
542-
543503
export function parseStatement(editor?: vscode.TextEditor, existingInfo?: StatementInfo): ParsedStatementInfo {
544504
let statementInfo: ParsedStatementInfo = {
545505
content: ``,

0 commit comments

Comments
 (0)