@@ -24,6 +24,7 @@ import {
2424 Parameter ,
2525 Column ,
2626 File ,
27+ Query ,
2728} from "./gen/plugin/codegen_pb" ;
2829
2930import { argName , colName } from "./drivers/utlis" ;
@@ -44,7 +45,7 @@ interface Options {
4445}
4546
4647interface Driver {
47- preamble : ( ) => Node [ ] ;
48+ preamble : ( queries : Query [ ] ) => Node [ ] ;
4849 columnType : ( c ?: Column ) => TypeNode ;
4950 execDecl : (
5051 name : string ,
@@ -98,104 +99,101 @@ function codegen(input: GenerateRequest): GenerateResponse {
9899
99100 // TODO: Verify options, parse them from protobuf honestly
100101
101- const querymap = new Map < string , Node [ ] > ( ) ;
102-
103- const filenames = new Set ( input . queries . map ( ( q ) => q . filename ) ) ;
104- for ( const filename of filenames ) {
105- const nodes = driver . preamble ( ) ;
106- querymap . set ( filename , nodes ) ;
107- }
102+ const querymap = new Map < string , Query [ ] > ( ) ;
108103
109104 for ( const query of input . queries ) {
110- let nodes = querymap . get ( query . filename ) ;
111- if ( ! nodes ) {
112- continue ;
105+ if ( ! querymap . has ( query . filename ) ) {
106+ querymap . set ( query . filename , [ ] ) ;
113107 }
108+ const qs = querymap . get ( query . filename ) ;
109+ qs ?. push ( query ) ;
110+ }
114111
115- const colmap = new Map < string , number > ( ) ;
116- for ( let column of query . columns ) {
117- if ( ! column . name ) {
118- continue ;
119- }
120- const count = colmap . get ( column . name ) || 0 ;
121- if ( count > 0 ) {
122- column . name = `${ column . name } _${ count + 1 } ` ;
112+ for ( const [ filename , queries ] of querymap . entries ( ) ) {
113+ const nodes = driver . preamble ( queries ) ;
114+
115+ for ( const query of queries ) {
116+ const colmap = new Map < string , number > ( ) ;
117+ for ( let column of query . columns ) {
118+ if ( ! column . name ) {
119+ continue ;
120+ }
121+ const count = colmap . get ( column . name ) || 0 ;
122+ if ( count > 0 ) {
123+ column . name = `${ column . name } _${ count + 1 } ` ;
124+ }
125+ colmap . set ( column . name , count + 1 ) ;
123126 }
124- colmap . set ( column . name , count + 1 ) ;
125- }
126127
127- const lowerName = query . name [ 0 ] . toLowerCase ( ) + query . name . slice ( 1 ) ;
128- const textName = `${ lowerName } Query` ;
128+ const lowerName = query . name [ 0 ] . toLowerCase ( ) + query . name . slice ( 1 ) ;
129+ const textName = `${ lowerName } Query` ;
129130
130- nodes . push (
131- queryDecl (
132- textName ,
133- `-- name: ${ query . name } ${ query . cmd }
131+ nodes . push (
132+ queryDecl (
133+ textName ,
134+ `-- name: ${ query . name } ${ query . cmd }
134135${ query . text } `
135- )
136- ) ;
136+ )
137+ ) ;
137138
138- const ctype = driver . columnType ;
139+ const ctype = driver . columnType ;
139140
140- let argIface = undefined ;
141- let returnIface = undefined ;
142- if ( query . params . length > 0 ) {
143- argIface = `${ query . name } Args` ;
144- nodes . push ( argsDecl ( argIface , ctype , query . params ) ) ;
145- }
146- if ( query . columns . length > 0 ) {
147- returnIface = `${ query . name } Row` ;
148- nodes . push ( rowDecl ( returnIface , ctype , query . columns ) ) ;
149- }
150-
151- switch ( query . cmd ) {
152- case ":exec" : {
153- nodes . push (
154- driver . execDecl ( lowerName , textName , argIface , query . params )
155- ) ;
156- break ;
141+ let argIface = undefined ;
142+ let returnIface = undefined ;
143+ if ( query . params . length > 0 ) {
144+ argIface = `${ query . name } Args` ;
145+ nodes . push ( argsDecl ( argIface , ctype , query . params ) ) ;
157146 }
158- case ":one" : {
159- nodes . push (
160- driver . oneDecl (
161- lowerName ,
162- textName ,
163- argIface ,
164- returnIface ?? "void" ,
165- query . params ,
166- query . columns
167- )
168- ) ;
169- break ;
147+ if ( query . columns . length > 0 ) {
148+ returnIface = `${ query . name } Row` ;
149+ nodes . push ( rowDecl ( returnIface , ctype , query . columns ) ) ;
150+ }
151+
152+ switch ( query . cmd ) {
153+ case ":exec" : {
154+ nodes . push (
155+ driver . execDecl ( lowerName , textName , argIface , query . params )
156+ ) ;
157+ break ;
158+ }
159+ case ":one" : {
160+ nodes . push (
161+ driver . oneDecl (
162+ lowerName ,
163+ textName ,
164+ argIface ,
165+ returnIface ?? "void" ,
166+ query . params ,
167+ query . columns
168+ )
169+ ) ;
170+ break ;
171+ }
172+ case ":many" : {
173+ nodes . push (
174+ driver . manyDecl (
175+ lowerName ,
176+ textName ,
177+ argIface ,
178+ returnIface ?? "void" ,
179+ query . params ,
180+ query . columns
181+ )
182+ ) ;
183+ break ;
184+ }
170185 }
171- case ":many" : {
172- nodes . push (
173- driver . manyDecl (
174- lowerName ,
175- textName ,
176- argIface ,
177- returnIface ?? "void" ,
178- query . params ,
179- query . columns
180- )
186+ if ( nodes ) {
187+ files . push (
188+ new File ( {
189+ name : `${ filename . replace ( "." , "_" ) } .ts` ,
190+ contents : new TextEncoder ( ) . encode ( printNode ( nodes ) ) ,
191+ } )
181192 ) ;
182- break ;
183193 }
184194 }
185195 }
186196
187- for ( const filename of filenames ) {
188- const nodes = querymap . get ( filename ) ;
189- if ( nodes ) {
190- files . push (
191- new File ( {
192- name : `${ filename . replace ( "." , "_" ) } .ts` ,
193- contents : new TextEncoder ( ) . encode ( printNode ( nodes ) ) ,
194- } )
195- ) ;
196- }
197- }
198-
199197 return new GenerateResponse ( {
200198 files : files ,
201199 } ) ;
0 commit comments