Skip to content

Commit 7bc4d31

Browse files
fix: update transformers with improved field preservation and method signatures
Co-Authored-By: Dan Lynch <[email protected]>
1 parent 8e2f172 commit 7bc4d31

File tree

3 files changed

+135
-22
lines changed

3 files changed

+135
-22
lines changed

packages/transform/src/transformers/v13-to-v14.ts

Lines changed: 104 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { BaseTransformer, TransformerContext } from '../visitors/base';
22
import { Node as PG13Node } from '../13/types';
33
import { Node as PG14Node } from '../14/types';
4+
import * as PG13 from '../13/types';
5+
import * as PG14 from '../14/types';
6+
import * as pg13RuntimeSchema from '../13/runtime-schema';
7+
import * as pg14RuntimeSchema from '../14/runtime-schema';
48

59
export class V13ToV14Transformer extends BaseTransformer {
610
transform(node: any, context?: TransformerContext): any {
@@ -24,7 +28,7 @@ export class V13ToV14Transformer extends BaseTransformer {
2428

2529

2630

27-
SelectStmt(nodeData: any, context?: TransformerContext): any {
31+
SelectStmt(nodeData: PG13.SelectStmt, context?: TransformerContext): any {
2832
const transformedData: any = {};
2933

3034
for (const [key, value] of Object.entries(nodeData)) {
@@ -33,8 +37,8 @@ export class V13ToV14Transformer extends BaseTransformer {
3337

3438
const hasContent = (nodeData.targetList && nodeData.targetList.length > 0) ||
3539
nodeData.fromClause || nodeData.whereClause ||
36-
nodeData.groupClause || nodeData.havingClause || nodeData.orderClause ||
37-
nodeData.limitClause || nodeData.withClause || nodeData.larg || nodeData.rarg;
40+
nodeData.groupClause || nodeData.havingClause || nodeData.sortClause ||
41+
nodeData.limitOffset || nodeData.limitCount || nodeData.withClause || nodeData.larg || nodeData.rarg;
3842

3943
if (hasContent) {
4044
if (!('limitOption' in transformedData)) {
@@ -80,12 +84,16 @@ export class V13ToV14Transformer extends BaseTransformer {
8084
transformedData.havingClause = this.transform(transformedData.havingClause, context);
8185
}
8286

83-
if (transformedData.orderClause && Array.isArray(transformedData.orderClause)) {
84-
transformedData.orderClause = transformedData.orderClause.map((item: any) => this.transform(item, context));
87+
if (transformedData.sortClause && Array.isArray(transformedData.sortClause)) {
88+
transformedData.sortClause = transformedData.sortClause.map((item: any) => this.transform(item, context));
8589
}
8690

87-
if (transformedData.limitClause && typeof transformedData.limitClause === 'object') {
88-
transformedData.limitClause = this.transform(transformedData.limitClause, context);
91+
if (transformedData.limitOffset && typeof transformedData.limitOffset === 'object') {
92+
transformedData.limitOffset = this.transform(transformedData.limitOffset, context);
93+
}
94+
95+
if (transformedData.limitCount && typeof transformedData.limitCount === 'object') {
96+
transformedData.limitCount = this.transform(transformedData.limitCount, context);
8997
}
9098

9199
if (transformedData.valuesLists && Array.isArray(transformedData.valuesLists)) {
@@ -97,7 +105,7 @@ export class V13ToV14Transformer extends BaseTransformer {
97105

98106

99107

100-
FuncCall(nodeData: any, context?: TransformerContext): any {
108+
FuncCall(nodeData: PG13.FuncCall, context?: TransformerContext): any {
101109
const transformedData: any = { ...nodeData };
102110

103111
if (!('funcformat' in transformedData)) {
@@ -115,7 +123,7 @@ export class V13ToV14Transformer extends BaseTransformer {
115123
return transformedData;
116124
}
117125

118-
TypeName(nodeData: any, context?: TransformerContext): any {
126+
TypeName(nodeData: PG13.TypeName, context?: TransformerContext): any {
119127
const transformedData: any = {};
120128

121129
for (const [key, value] of Object.entries(nodeData)) {
@@ -138,7 +146,93 @@ export class V13ToV14Transformer extends BaseTransformer {
138146
return transformedData;
139147
}
140148

141-
Alias(nodeData: any, context?: TransformerContext): any {
149+
Alias(nodeData: PG13.Alias, context?: TransformerContext): any {
150+
const transformedData: any = {};
151+
152+
for (const [key, value] of Object.entries(nodeData)) {
153+
if (Array.isArray(value)) {
154+
transformedData[key] = value.map(item => this.transform(item, context));
155+
} else if (value && typeof value === 'object') {
156+
transformedData[key] = this.transform(value, context);
157+
} else {
158+
transformedData[key] = value;
159+
}
160+
}
161+
162+
return transformedData;
163+
}
164+
165+
FunctionParameter(nodeData: PG13.FunctionParameter, context?: TransformerContext): any {
166+
const transformedData: any = {};
167+
168+
for (const [key, value] of Object.entries(nodeData)) {
169+
if (Array.isArray(value)) {
170+
transformedData[key] = value.map(item => this.transform(item, context));
171+
} else if (value && typeof value === 'object') {
172+
transformedData[key] = this.transform(value, context);
173+
} else {
174+
transformedData[key] = value;
175+
}
176+
}
177+
178+
if ('mode' in nodeData && nodeData.mode === 'FUNC_PARAM_IN') {
179+
transformedData.mode = 'FUNC_PARAM_DEFAULT';
180+
}
181+
182+
return transformedData;
183+
}
184+
185+
DeclareCursorStmt(nodeData: PG13.DeclareCursorStmt, context?: TransformerContext): any {
186+
const transformedData: any = {};
187+
188+
for (const [key, value] of Object.entries(nodeData)) {
189+
if (Array.isArray(value)) {
190+
transformedData[key] = value.map(item => this.transform(item, context));
191+
} else if (value && typeof value === 'object') {
192+
transformedData[key] = this.transform(value, context);
193+
} else {
194+
transformedData[key] = value;
195+
}
196+
}
197+
198+
if ('options' in nodeData) {
199+
transformedData.options = nodeData.options;
200+
}
201+
202+
return transformedData;
203+
}
204+
205+
ObjectWithArgs(nodeData: PG13.ObjectWithArgs, context?: TransformerContext): any {
206+
const transformedData: any = {};
207+
208+
for (const [key, value] of Object.entries(nodeData)) {
209+
if (Array.isArray(value)) {
210+
transformedData[key] = value.map(item => this.transform(item, context));
211+
} else if (value && typeof value === 'object') {
212+
transformedData[key] = this.transform(value, context);
213+
} else {
214+
transformedData[key] = value;
215+
}
216+
}
217+
218+
if (transformedData.objargs && Array.isArray(transformedData.objargs)) {
219+
transformedData.objfuncargs = transformedData.objargs.map((arg: any) => {
220+
if (arg && typeof arg === 'object' && arg.TypeName) {
221+
return {
222+
FunctionParameter: {
223+
argType: arg.TypeName,
224+
mode: "FUNC_PARAM_DEFAULT"
225+
}
226+
};
227+
}
228+
return arg;
229+
});
230+
}
231+
232+
return transformedData;
233+
}
234+
235+
AlterFunctionStmt(nodeData: PG13.AlterFunctionStmt, context?: TransformerContext): any {
142236
const transformedData: any = {};
143237

144238
for (const [key, value] of Object.entries(nodeData)) {

packages/transform/src/transformers/v15-to-v16.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export class V15ToV16Transformer extends BaseTransformer {
2222
return super.transform(node, context);
2323
}
2424

25+
26+
2527
SelectStmt(nodeData: any, context?: TransformerContext): any {
2628
const transformedData: any = {};
2729

packages/transform/src/visitors/base.ts

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,37 @@ export abstract class BaseTransformer implements TransformerVisitor {
1818
return node.map(item => this.transform(item, context));
1919
}
2020

21-
const nodeType = Object.keys(node)[0];
22-
if (!nodeType) return node;
23-
24-
const nodeData = node[nodeType];
25-
const methodName = nodeType;
21+
const keys = Object.keys(node);
22+
if (keys.length === 0) return node;
23+
24+
if (keys.length === 1) {
25+
const nodeType = keys[0];
26+
const nodeData = node[nodeType];
27+
28+
if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {
29+
const methodName = nodeType;
30+
31+
if (typeof (this as any)[methodName] === 'function') {
32+
const transformedData = (this as any)[methodName](nodeData, context);
33+
return { [nodeType]: transformedData };
34+
}
2635

27-
if (typeof (this as any)[methodName] === 'function') {
28-
const transformedData = (this as any)[methodName](nodeData, context);
29-
return { [nodeType]: transformedData };
36+
return this.transformDefault(node, nodeType, nodeData, context);
37+
}
3038
}
3139

32-
return this.transformDefault(node, nodeType, nodeData, context);
40+
const result: any = {};
41+
for (const [key, value] of Object.entries(node)) {
42+
if (Array.isArray(value)) {
43+
result[key] = value.map(item => this.transform(item, context));
44+
} else if (value && typeof value === 'object') {
45+
result[key] = this.transform(value, context);
46+
} else {
47+
result[key] = value;
48+
}
49+
}
50+
51+
return result;
3352
}
3453

3554
protected transformDefault(node: any, nodeType: string, nodeData: any, context?: TransformerContext): any {
@@ -41,7 +60,7 @@ export abstract class BaseTransformer implements TransformerVisitor {
4160
return { [nodeType]: nodeData.map(item => this.transform(item, context)) };
4261
}
4362

44-
const result: any = {};
63+
const result: any = { ...nodeData };
4564

4665
for (const [key, value] of Object.entries(nodeData)) {
4766
if (Array.isArray(value)) {
@@ -54,8 +73,6 @@ export abstract class BaseTransformer implements TransformerVisitor {
5473
} else {
5574
result[key] = this.transform(value, context);
5675
}
57-
} else {
58-
result[key] = value;
5976
}
6077
}
6178

0 commit comments

Comments
 (0)