@sqg/sqg 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sqg.mjs CHANGED
@@ -1201,10 +1201,10 @@ const postgres = new class {
1201
1201
  return value;
1202
1202
  });
1203
1203
  if (statement.parameters.length > 0) try {
1204
- await db.query(`DEALLOCATE ALL`);
1204
+ await db.query("DEALLOCATE ALL");
1205
1205
  await db.query(`PREPARE sqg_param_check AS ${statement.sql}`);
1206
1206
  const paramTypeResult = await db.query(`SELECT unnest(parameter_types)::oid AS oid FROM pg_prepared_statements WHERE name = 'sqg_param_check'`);
1207
- await db.query(`DEALLOCATE sqg_param_check`);
1207
+ await db.query("DEALLOCATE sqg_param_check");
1208
1208
  if (paramTypeResult.rows.length === statement.parameters.length) {
1209
1209
  const paramTypes = /* @__PURE__ */ new Map();
1210
1210
  for (let i = 0; i < statement.parameters.length; i++) {
@@ -1459,7 +1459,7 @@ var JavaTypeMapper = class JavaTypeMapper extends TypeMapper {
1459
1459
  TIMESTAMP_S: "Instant",
1460
1460
  TIMESTAMP_MS: "Instant",
1461
1461
  TIMESTAMP_NS: "Instant",
1462
- "TIMESTAMP WITH TIME ZONE": "Instant",
1462
+ "TIMESTAMP WITH TIME ZONE": "OffsetDateTime",
1463
1463
  UUID: "UUID",
1464
1464
  INTERVAL: "String",
1465
1465
  BIT: "String",
@@ -1600,6 +1600,7 @@ var JavaTypeMapper = class JavaTypeMapper extends TypeMapper {
1600
1600
  const upperType = column.type?.toString().toUpperCase() ?? "";
1601
1601
  if (upperType === "TIMESTAMP" || upperType === "DATETIME") return `toLocalDateTime((java.sql.Timestamp)${value})`;
1602
1602
  if (upperType === "TIMESTAMPTZ") return `toOffsetDateTime((java.sql.Timestamp)${value})`;
1603
+ if (upperType === "TIMESTAMP WITH TIME ZONE") return `(OffsetDateTime)${value}`;
1603
1604
  if (upperType === "DATE") return `toLocalDate((java.sql.Date)${value})`;
1604
1605
  if (upperType === "TIME") return `toLocalTime((java.sql.Time)${value})`;
1605
1606
  if (upperType.startsWith("_")) {
@@ -1857,6 +1858,9 @@ var JavaGenerator = class extends BaseGenerator {
1857
1858
  }, " ");
1858
1859
  return queryHelper.typeMapper.getDeclarations(query.allColumns);
1859
1860
  });
1861
+ Handlebars.registerHelper("appenderType", (column) => {
1862
+ return this.mapType(column);
1863
+ });
1860
1864
  Handlebars.registerHelper("readColumns", (queryHelper) => {
1861
1865
  const query = queryHelper.query;
1862
1866
  if (queryHelper.isPluck) return this.readColumn({
@@ -2346,10 +2350,24 @@ var SqlQueryHelper = class {
2346
2350
  }
2347
2351
  get parameters() {
2348
2352
  const vars = new Map(this.variables.map((param) => [param.name, param.type]));
2349
- return this.statement.parameters.map((param) => ({
2350
- name: param.name,
2351
- type: vars.get(param.name)
2352
- }));
2353
+ return this.statement.parameters.map((param) => {
2354
+ const rawType = this.query.parameterTypes?.get(param.name);
2355
+ let isArray = false;
2356
+ let arrayBaseType = null;
2357
+ if (rawType instanceof ListType) {
2358
+ isArray = true;
2359
+ arrayBaseType = rawType.baseType.toString();
2360
+ } else if (typeof rawType === "string" && rawType.startsWith("_")) {
2361
+ isArray = true;
2362
+ arrayBaseType = rawType.substring(1);
2363
+ }
2364
+ return {
2365
+ name: param.name,
2366
+ type: vars.get(param.name),
2367
+ isArray,
2368
+ arrayBaseType
2369
+ };
2370
+ });
2353
2371
  }
2354
2372
  get columns() {
2355
2373
  if (!(this.query.allColumns.type instanceof StructType)) throw new Error(`Expected StructType ${this.query.allColumns.type}`);
@@ -2725,7 +2743,7 @@ async function processProject(projectPath) {
2725
2743
  //#region src/mcp-server.ts
2726
2744
  const server = new Server({
2727
2745
  name: "sqg-mcp",
2728
- version: process.env.npm_package_version ?? "0.10.0"
2746
+ version: process.env.npm_package_version ?? "0.11.0"
2729
2747
  }, { capabilities: {
2730
2748
  tools: {},
2731
2749
  resources: {}
@@ -3054,7 +3072,7 @@ async function startMcpServer() {
3054
3072
 
3055
3073
  //#endregion
3056
3074
  //#region src/sqg.ts
3057
- const version = process.env.npm_package_version ?? "0.10.0";
3075
+ const version = process.env.npm_package_version ?? "0.11.0";
3058
3076
  const description = process.env.npm_package_description ?? "SQG - SQL Query Generator - Type-safe code generation from SQL (https://sqg.dev)";
3059
3077
  consola.level = LogLevels.info;
3060
3078
  const program = new Command().name("sqg").description(`${description}
@@ -212,8 +212,9 @@ public class {{className}} {
212
212
  {{#if isQuery}}{{#unless isOne}}
213
213
  public Stream<{{rowType}}> {{functionName}}Stream({{#each variables}}{{{type}}} {{name}}{{#unless @last}}, {{/unless}}{{/each}}) throws SQLException {
214
214
  var stmt = connection.prepareStatement({{{partsToString sqlQueryParts}}});
215
- {{#each parameterNames}}stmt.setObject({{plusOne @index}}, {{this}});
216
- {{/each}}
215
+ {{#each parameters}}{{#if isArray}}stmt.setArray({{plusOne @index}}, connection.createArrayOf("{{arrayBaseType}}", {{name}}.toArray()));
216
+ {{else}}stmt.setObject({{plusOne @index}}, {{name}});
217
+ {{/if}}{{/each}}
217
218
  var rs = stmt.executeQuery();
218
219
  var iter = new Iterator<{{rowType}}>() {
219
220
  private Boolean hasNext = null;
@@ -256,7 +257,7 @@ public class {{className}} {
256
257
 
257
258
  {{#each tables}}
258
259
  /** Row type for {{tableName}} appender */
259
- public record {{rowTypeName}}({{#each columns}}{{{mapType this}}} {{name}}{{#unless @last}}, {{/unless}}{{/each}}) {}
260
+ public record {{rowTypeName}}({{#each columns}}{{{appenderType this}}} {{name}}{{#unless @last}}, {{/unless}}{{/each}}) {}
260
261
 
261
262
  /** Appender for bulk inserts into {{tableName}} */
262
263
  public static class {{className}} implements AutoCloseable {
@@ -282,7 +283,7 @@ public static class {{className}} implements AutoCloseable {
282
283
  }
283
284
 
284
285
  /** Append a single row with individual values */
285
- public {{className}} append({{#each columns}}{{{mapType this}}} {{name}}{{#unless @last}}, {{/unless}}{{/each}}) throws SQLException {
286
+ public {{className}} append({{#each columns}}{{{appenderType this}}} {{name}}{{#unless @last}}, {{/unless}}{{/each}}) throws SQLException {
286
287
  appender.beginRow();
287
288
  {{#each columns}}
288
289
  appender.append({{name}});
@@ -327,8 +328,9 @@ int
327
328
  {{/inline~}}
328
329
 
329
330
  {{#*inline "execute"}}
330
- {{#each parameterNames}}stmt.setObject({{plusOne @index}}, {{this}});
331
- {{/each}}
331
+ {{#each parameters}}{{#if isArray}}stmt.setArray({{plusOne @index}}, connection.createArrayOf("{{arrayBaseType}}", {{name}}.toArray()));
332
+ {{else}}stmt.setObject({{plusOne @index}}, {{name}});
333
+ {{/if}}{{/each}}
332
334
  {{#if isQuery}}
333
335
  try(var rs = stmt.executeQuery()) {
334
336
  {{#if isOne}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sqg/sqg",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "SQG - SQL Query Generator - Type-safe code generation from SQL (https://sqg.dev)",
5
5
  "type": "module",
6
6
  "bin": {