@@ -24,6 +24,7 @@ import {
24
24
Parameter ,
25
25
Column ,
26
26
File ,
27
+ Query ,
27
28
} from "./gen/plugin/codegen_pb" ;
28
29
29
30
import { argName , colName } from "./drivers/utlis" ;
@@ -44,7 +45,7 @@ interface Options {
44
45
}
45
46
46
47
interface Driver {
47
- preamble : ( ) => Node [ ] ;
48
+ preamble : ( queries : Query [ ] ) => Node [ ] ;
48
49
columnType : ( c ?: Column ) => TypeNode ;
49
50
execDecl : (
50
51
name : string ,
@@ -98,104 +99,101 @@ function codegen(input: GenerateRequest): GenerateResponse {
98
99
99
100
// TODO: Verify options, parse them from protobuf honestly
100
101
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 [ ] > ( ) ;
108
103
109
104
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 , [ ] ) ;
113
107
}
108
+ const qs = querymap . get ( query . filename ) ;
109
+ qs ?. push ( query ) ;
110
+ }
114
111
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 ) ;
123
126
}
124
- colmap . set ( column . name , count + 1 ) ;
125
- }
126
127
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` ;
129
130
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 }
134
135
${ query . text } `
135
- )
136
- ) ;
136
+ )
137
+ ) ;
137
138
138
- const ctype = driver . columnType ;
139
+ const ctype = driver . columnType ;
139
140
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 ) ) ;
157
146
}
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
+ }
170
185
}
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
+ } )
181
192
) ;
182
- break ;
183
193
}
184
194
}
185
195
}
186
196
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
-
199
197
return new GenerateResponse ( {
200
198
files : files ,
201
199
} ) ;
0 commit comments