@@ -3,36 +3,55 @@ import { Node as PG14Node } from '../14/types';
33import { Node as PG15Node } from '../15/types' ;
44
55export class V14ToV15Transformer extends BaseTransformer {
6- A_Const ( node : any , context ?: TransformerContext ) : any {
7- const transformedData : any = { ...node } ;
6+ transform ( node : any , context ?: TransformerContext ) : any {
7+ if ( node && typeof node === 'object' && 'version' in node && 'stmts' in node ) {
8+ return {
9+ version : 150004 , // PG15 version
10+ stmts : node . stmts . map ( ( stmt : any ) => {
11+ if ( stmt && typeof stmt === 'object' && 'stmt' in stmt ) {
12+ return {
13+ ...stmt ,
14+ stmt : this . transform ( stmt . stmt , context )
15+ } ;
16+ }
17+ return this . transform ( stmt , context ) ;
18+ } )
19+ } ;
20+ }
21+
22+ return super . transform ( node , context ) ;
23+ }
24+
25+ A_Const ( nodeData : any , context ?: TransformerContext ) : any {
26+ const transformedData : any = { ...nodeData } ;
827
9- if ( node . val ) {
10- if ( node . val . String ) {
11- transformedData . sval = { sval : node . val . String . str } ;
28+ if ( nodeData . val ) {
29+ if ( nodeData . val . String ) {
30+ transformedData . sval = { sval : nodeData . val . String . str } ;
1231 delete transformedData . val ;
13- } else if ( node . val . Float ) {
14- transformedData . fval = { fval : node . val . Float . str } ;
32+ } else if ( nodeData . val . Float ) {
33+ transformedData . fval = { fval : nodeData . val . Float . str } ;
1534 delete transformedData . val ;
16- } else if ( node . val . BitString ) {
17- transformedData . bsval = { bsval : node . val . BitString . str } ;
35+ } else if ( nodeData . val . BitString ) {
36+ transformedData . bsval = { bsval : nodeData . val . BitString . str } ;
1837 delete transformedData . val ;
19- } else if ( node . val . Integer ) {
20- const intVal = node . val . Integer . ival ;
38+ } else if ( nodeData . val . Integer ) {
39+ const intVal = nodeData . val . Integer . ival ;
2140 if ( intVal === 0 || intVal === undefined ) {
2241 transformedData . ival = { } ;
2342 } else {
2443 transformedData . ival = { ival : intVal } ;
2544 }
2645 delete transformedData . val ;
27- } else if ( node . val . Boolean ) {
28- transformedData . boolval = node . val . Boolean . boolval ;
46+ } else if ( nodeData . val . Boolean ) {
47+ transformedData . boolval = nodeData . val . Boolean . boolval ;
2948 delete transformedData . val ;
3049 }
3150 }
3251
33- if ( node . ival && typeof node . ival === 'object' ) {
34- if ( 'ival' in node . ival ) {
35- transformedData . ival = node . ival ;
52+ if ( nodeData . ival && typeof nodeData . ival === 'object' ) {
53+ if ( 'ival' in nodeData . ival ) {
54+ transformedData . ival = nodeData . ival ;
3655 } else {
3756 transformedData . ival = { } ;
3857 }
@@ -185,39 +204,70 @@ export class V14ToV15Transformer extends BaseTransformer {
185204 return transformedData ;
186205 }
187206
188- SelectStmt ( node : any , context ?: TransformerContext ) : any {
189- const transformedData : any = { ... node } ;
207+ SelectStmt ( nodeData : any , context ?: TransformerContext ) : any {
208+ const transformedData : any = { } ;
190209
191- if ( ! ( 'limitOption' in transformedData ) ) {
192- transformedData . limitOption = "LIMIT_OPTION_DEFAULT" ;
210+ for ( const [ key , value ] of Object . entries ( nodeData ) ) {
211+ transformedData [ key ] = value ;
193212 }
194- if ( ! ( 'op' in transformedData ) ) {
195- transformedData . op = "SETOP_NONE" ;
213+
214+ const hasContent = ( nodeData . targetList && nodeData . targetList . length > 0 ) ||
215+ nodeData . fromClause || nodeData . whereClause ||
216+ nodeData . groupClause || nodeData . havingClause || nodeData . orderClause ||
217+ nodeData . limitClause || nodeData . withClause || nodeData . larg || nodeData . rarg ;
218+
219+ if ( hasContent ) {
220+ if ( ! ( 'limitOption' in transformedData ) ) {
221+ transformedData . limitOption = "LIMIT_OPTION_DEFAULT" ;
222+ }
223+ if ( ! ( 'op' in transformedData ) ) {
224+ transformedData . op = "SETOP_NONE" ;
225+ }
196226 }
197227
198- for ( const [ key , value ] of Object . entries ( node ) ) {
199- if ( key === 'limitOption' || key === 'op' ) {
200- continue ;
201- } else if ( key === 'withClause' && value && typeof value === 'object' ) {
202- transformedData [ key ] = { ...value } ;
203- if ( transformedData [ key ] . ctes && Array . isArray ( transformedData [ key ] . ctes ) ) {
204- transformedData [ key ] . ctes = transformedData [ key ] . ctes . map ( ( cte : any ) => this . transform ( cte , context ) ) ;
205- }
206- } else if ( key === 'larg' || key === 'rarg' ) {
207- if ( value && typeof value === 'object' ) {
208- transformedData [ key ] = this . SelectStmt ( value , context ) ;
209- } else {
210- transformedData [ key ] = value ;
211- }
212- } else if ( Array . isArray ( value ) ) {
213- transformedData [ key ] = value . map ( item => this . transform ( item , context ) ) ;
214- } else if ( value && typeof value === 'object' ) {
215- transformedData [ key ] = this . transform ( value , context ) ;
216- } else {
217- transformedData [ key ] = value ;
228+ if ( transformedData . withClause && typeof transformedData . withClause === 'object' ) {
229+ transformedData . withClause = { ...transformedData . withClause } ;
230+ if ( transformedData . withClause . ctes && Array . isArray ( transformedData . withClause . ctes ) ) {
231+ transformedData . withClause . ctes = transformedData . withClause . ctes . map ( ( cte : any ) => this . transform ( cte , context ) ) ;
218232 }
219233 }
220234
235+ if ( transformedData . larg && typeof transformedData . larg === 'object' ) {
236+ transformedData . larg = this . SelectStmt ( transformedData . larg , context ) ;
237+ }
238+
239+ if ( transformedData . rarg && typeof transformedData . rarg === 'object' ) {
240+ transformedData . rarg = this . SelectStmt ( transformedData . rarg , context ) ;
241+ }
242+
243+ if ( transformedData . targetList && Array . isArray ( transformedData . targetList ) ) {
244+ transformedData . targetList = transformedData . targetList . map ( ( item : any ) => this . transform ( item , context ) ) ;
245+ }
246+
247+ if ( transformedData . fromClause && Array . isArray ( transformedData . fromClause ) ) {
248+ transformedData . fromClause = transformedData . fromClause . map ( ( item : any ) => this . transform ( item , context ) ) ;
249+ }
250+
251+ if ( transformedData . whereClause && typeof transformedData . whereClause === 'object' ) {
252+ transformedData . whereClause = this . transform ( transformedData . whereClause , context ) ;
253+ }
254+
255+ if ( transformedData . groupClause && Array . isArray ( transformedData . groupClause ) ) {
256+ transformedData . groupClause = transformedData . groupClause . map ( ( item : any ) => this . transform ( item , context ) ) ;
257+ }
258+
259+ if ( transformedData . havingClause && typeof transformedData . havingClause === 'object' ) {
260+ transformedData . havingClause = this . transform ( transformedData . havingClause , context ) ;
261+ }
262+
263+ if ( transformedData . orderClause && Array . isArray ( transformedData . orderClause ) ) {
264+ transformedData . orderClause = transformedData . orderClause . map ( ( item : any ) => this . transform ( item , context ) ) ;
265+ }
266+
267+ if ( transformedData . limitClause && typeof transformedData . limitClause === 'object' ) {
268+ transformedData . limitClause = this . transform ( transformedData . limitClause , context ) ;
269+ }
270+
221271 return transformedData ;
222272 }
223273
0 commit comments