linkgress-orm 0.1.0 → 0.1.2

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.
Files changed (41) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +196 -196
  3. package/dist/entity/db-context.d.ts.map +1 -1
  4. package/dist/entity/db-context.js +7 -5
  5. package/dist/entity/db-context.js.map +1 -1
  6. package/dist/migration/db-schema-manager.d.ts +5 -0
  7. package/dist/migration/db-schema-manager.d.ts.map +1 -1
  8. package/dist/migration/db-schema-manager.js +147 -79
  9. package/dist/migration/db-schema-manager.js.map +1 -1
  10. package/dist/migration/enum-migrator.js +6 -6
  11. package/dist/query/collection-strategy.interface.d.ts +38 -0
  12. package/dist/query/collection-strategy.interface.d.ts.map +1 -1
  13. package/dist/query/cte-builder.d.ts +18 -1
  14. package/dist/query/cte-builder.d.ts.map +1 -1
  15. package/dist/query/cte-builder.js +102 -11
  16. package/dist/query/cte-builder.js.map +1 -1
  17. package/dist/query/grouped-query.d.ts +24 -1
  18. package/dist/query/grouped-query.d.ts.map +1 -1
  19. package/dist/query/grouped-query.js +260 -71
  20. package/dist/query/grouped-query.js.map +1 -1
  21. package/dist/query/join-builder.d.ts.map +1 -1
  22. package/dist/query/join-builder.js +10 -14
  23. package/dist/query/join-builder.js.map +1 -1
  24. package/dist/query/query-builder.d.ts +65 -1
  25. package/dist/query/query-builder.d.ts.map +1 -1
  26. package/dist/query/query-builder.js +566 -167
  27. package/dist/query/query-builder.js.map +1 -1
  28. package/dist/query/strategies/cte-collection-strategy.d.ts +4 -0
  29. package/dist/query/strategies/cte-collection-strategy.d.ts.map +1 -1
  30. package/dist/query/strategies/cte-collection-strategy.js +169 -78
  31. package/dist/query/strategies/cte-collection-strategy.js.map +1 -1
  32. package/dist/query/strategies/lateral-collection-strategy.d.ts +4 -0
  33. package/dist/query/strategies/lateral-collection-strategy.d.ts.map +1 -1
  34. package/dist/query/strategies/lateral-collection-strategy.js +86 -28
  35. package/dist/query/strategies/lateral-collection-strategy.js.map +1 -1
  36. package/dist/query/strategies/temptable-collection-strategy.js +97 -97
  37. package/dist/schema/table-builder.d.ts +16 -0
  38. package/dist/schema/table-builder.d.ts.map +1 -1
  39. package/dist/schema/table-builder.js +23 -1
  40. package/dist/schema/table-builder.js.map +1 -1
  41. package/package.json +1 -1
@@ -74,20 +74,20 @@ class TempTableCollectionStrategy {
74
74
  // Determine if we're doing client-side grouping (JSONB/array) or server-side (scalar)
75
75
  const isClientSideGrouping = config.aggregationType === 'jsonb' || config.aggregationType === 'array';
76
76
  // Combine everything into a single multi-statement query
77
- const multiStatementSQL = `
78
- -- Create temporary table for parent IDs
79
- CREATE TEMP TABLE ${tempTableName} (
80
- id integer PRIMARY KEY
81
- ) ON COMMIT DROP;
82
-
83
- -- Insert parent IDs
84
- INSERT INTO ${tempTableName} VALUES ${valuePlaceholders};
85
-
86
- -- Query and return the data
87
- ${aggregationSQL};
88
-
89
- -- Cleanup
90
- DROP TABLE IF EXISTS ${tempTableName};
77
+ const multiStatementSQL = `
78
+ -- Create temporary table for parent IDs
79
+ CREATE TEMP TABLE ${tempTableName} (
80
+ id integer PRIMARY KEY
81
+ ) ON COMMIT DROP;
82
+
83
+ -- Insert parent IDs
84
+ INSERT INTO ${tempTableName} VALUES ${valuePlaceholders};
85
+
86
+ -- Query and return the data
87
+ ${aggregationSQL};
88
+
89
+ -- Cleanup
90
+ DROP TABLE IF EXISTS ${tempTableName};
91
91
  `.trim();
92
92
  // Execute multi-statement query using querySimple (no parameters)
93
93
  const executor = context.executor || client;
@@ -158,10 +158,10 @@ DROP TABLE IF EXISTS ${tempTableName};
158
158
  async buildAggregationLegacy(config, context, client) {
159
159
  const tempTableName = `tmp_parent_ids_${config.counter}`;
160
160
  // Create temp table (without ON COMMIT DROP to persist across queries in the same session)
161
- const createTableSQL = `
162
- CREATE TEMP TABLE IF NOT EXISTS ${tempTableName} (
163
- id integer PRIMARY KEY
164
- )
161
+ const createTableSQL = `
162
+ CREATE TEMP TABLE IF NOT EXISTS ${tempTableName} (
163
+ id integer PRIMARY KEY
164
+ )
165
165
  `.trim();
166
166
  // Use executor from context if available for query logging
167
167
  if (context.executor) {
@@ -186,9 +186,9 @@ CREATE TEMP TABLE IF NOT EXISTS ${tempTableName} (
186
186
  const selectExpression = `"${tempTableName}_agg".data`;
187
187
  // Execute aggregation query and store results in another temp table
188
188
  const aggTempTableName = `${tempTableName}_agg`;
189
- const createAggTableSQL = `
190
- CREATE TEMP TABLE ${aggTempTableName} AS
191
- ${aggregationSQL}
189
+ const createAggTableSQL = `
190
+ CREATE TEMP TABLE ${aggTempTableName} AS
191
+ ${aggregationSQL}
192
192
  `.trim();
193
193
  // Use executor from context if available for query logging
194
194
  if (context.executor) {
@@ -301,13 +301,13 @@ ${aggregationSQL}
301
301
  return this.buildSimpleSelectSQLWithRowNumber(config, tempTableName, selectFields, additionalWhere, orderBySQL);
302
302
  }
303
303
  // No LIMIT/OFFSET - use simple SELECT
304
- const sql = `
305
- SELECT
306
- "${foreignKey}" as parent_id,
307
- ${selectFields}
308
- FROM "${targetTable}"
309
- WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
310
- ${orderBySQL}
304
+ const sql = `
305
+ SELECT
306
+ "${foreignKey}" as parent_id,
307
+ ${selectFields}
308
+ FROM "${targetTable}"
309
+ WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
310
+ ${orderBySQL}
311
311
  `.trim();
312
312
  return sql;
313
313
  }
@@ -327,24 +327,24 @@ ${orderBySQL}
327
327
  else {
328
328
  rowNumberFilter = `WHERE "__rn" > ${offset}`;
329
329
  }
330
- const sql = `
331
- SELECT
332
- parent_id,
330
+ const sql = `
331
+ SELECT
332
+ parent_id,
333
333
  ${selectFields.split(', ').map(f => {
334
334
  // Extract just the alias part for outer select
335
335
  const match = f.match(/as "([^"]+)"$/);
336
336
  return match ? `"${match[1]}"` : f;
337
- }).join(', ')}
338
- FROM (
339
- SELECT
340
- "${foreignKey}" as parent_id,
341
- ${selectFields},
342
- ROW_NUMBER() OVER (PARTITION BY "${foreignKey}" ORDER BY ${rowNumberOrderBy}) as "__rn"
343
- FROM "${targetTable}"
344
- WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
345
- ) sub
346
- ${rowNumberFilter}
347
- ${orderBySQL.replace(/ORDER BY/i, 'ORDER BY')}
337
+ }).join(', ')}
338
+ FROM (
339
+ SELECT
340
+ "${foreignKey}" as parent_id,
341
+ ${selectFields},
342
+ ROW_NUMBER() OVER (PARTITION BY "${foreignKey}" ORDER BY ${rowNumberOrderBy}) as "__rn"
343
+ FROM "${targetTable}"
344
+ WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
345
+ ) sub
346
+ ${rowNumberFilter}
347
+ ${orderBySQL.replace(/ORDER BY/i, 'ORDER BY')}
348
348
  `.trim();
349
349
  return sql;
350
350
  }
@@ -424,19 +424,19 @@ ${orderBySQL.replace(/ORDER BY/i, 'ORDER BY')}
424
424
  return this.buildJsonbAggregationSQLWithRowNumber(config, tempTableName, jsonbObjectExpr, additionalWhere);
425
425
  }
426
426
  // No LIMIT/OFFSET - use simple aggregation
427
- const sql = `
428
- SELECT
429
- t."${foreignKey}" as parent_id,
430
- jsonb_agg(
431
- ${jsonbObjectExpr}${jsonbAggOrderBy}
432
- ) as data
433
- FROM (
434
- SELECT *
435
- FROM "${targetTable}"
436
- WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
437
- ${orderBySQL}
438
- ) t
439
- GROUP BY t."${foreignKey}"
427
+ const sql = `
428
+ SELECT
429
+ t."${foreignKey}" as parent_id,
430
+ jsonb_agg(
431
+ ${jsonbObjectExpr}${jsonbAggOrderBy}
432
+ ) as data
433
+ FROM (
434
+ SELECT *
435
+ FROM "${targetTable}"
436
+ WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
437
+ ${orderBySQL}
438
+ ) t
439
+ GROUP BY t."${foreignKey}"
440
440
  `.trim();
441
441
  return sql;
442
442
  }
@@ -456,19 +456,19 @@ GROUP BY t."${foreignKey}"
456
456
  else {
457
457
  rowNumberFilter = `WHERE "__rn" > ${offset}`;
458
458
  }
459
- const sql = `
460
- SELECT
461
- t."${foreignKey}" as parent_id,
462
- jsonb_agg(
463
- ${jsonbObjectExpr}
464
- ) as data
465
- FROM (
466
- SELECT *, ROW_NUMBER() OVER (PARTITION BY "${foreignKey}" ORDER BY ${rowNumberOrderBy}) as "__rn"
467
- FROM "${targetTable}"
468
- WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
469
- ) t
470
- ${rowNumberFilter}
471
- GROUP BY t."${foreignKey}"
459
+ const sql = `
460
+ SELECT
461
+ t."${foreignKey}" as parent_id,
462
+ jsonb_agg(
463
+ ${jsonbObjectExpr}
464
+ ) as data
465
+ FROM (
466
+ SELECT *, ROW_NUMBER() OVER (PARTITION BY "${foreignKey}" ORDER BY ${rowNumberOrderBy}) as "__rn"
467
+ FROM "${targetTable}"
468
+ WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
469
+ ) t
470
+ ${rowNumberFilter}
471
+ GROUP BY t."${foreignKey}"
472
472
  `.trim();
473
473
  return sql;
474
474
  }
@@ -494,17 +494,17 @@ GROUP BY t."${foreignKey}"
494
494
  return this.buildArrayAggregationSQLWithRowNumber(config, tempTableName, additionalWhere);
495
495
  }
496
496
  // No LIMIT/OFFSET - use simple aggregation
497
- const sql = `
498
- SELECT
499
- t."${foreignKey}" as parent_id,
500
- array_agg(t."${arrayField}"${arrayAggOrderBy}) as data
501
- FROM (
502
- SELECT "${foreignKey}", "${arrayField}"
503
- FROM "${targetTable}"
504
- WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
505
- ${orderBySQL}
506
- ) t
507
- GROUP BY t."${foreignKey}"
497
+ const sql = `
498
+ SELECT
499
+ t."${foreignKey}" as parent_id,
500
+ array_agg(t."${arrayField}"${arrayAggOrderBy}) as data
501
+ FROM (
502
+ SELECT "${foreignKey}", "${arrayField}"
503
+ FROM "${targetTable}"
504
+ WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
505
+ ${orderBySQL}
506
+ ) t
507
+ GROUP BY t."${foreignKey}"
508
508
  `.trim();
509
509
  return sql;
510
510
  }
@@ -524,17 +524,17 @@ GROUP BY t."${foreignKey}"
524
524
  else {
525
525
  rowNumberFilter = `WHERE "__rn" > ${offset}`;
526
526
  }
527
- const sql = `
528
- SELECT
529
- t."${foreignKey}" as parent_id,
530
- array_agg(t."${arrayField}") as data
531
- FROM (
532
- SELECT "${foreignKey}", "${arrayField}", ROW_NUMBER() OVER (PARTITION BY "${foreignKey}" ORDER BY ${rowNumberOrderBy}) as "__rn"
533
- FROM "${targetTable}"
534
- WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
535
- ) t
536
- ${rowNumberFilter}
537
- GROUP BY t."${foreignKey}"
527
+ const sql = `
528
+ SELECT
529
+ t."${foreignKey}" as parent_id,
530
+ array_agg(t."${arrayField}") as data
531
+ FROM (
532
+ SELECT "${foreignKey}", "${arrayField}", ROW_NUMBER() OVER (PARTITION BY "${foreignKey}" ORDER BY ${rowNumberOrderBy}) as "__rn"
533
+ FROM "${targetTable}"
534
+ WHERE "${foreignKey}" IN (SELECT id FROM ${tempTableName})${additionalWhere}
535
+ ) t
536
+ ${rowNumberFilter}
537
+ GROUP BY t."${foreignKey}"
538
538
  `.trim();
539
539
  return sql;
540
540
  }
@@ -563,13 +563,13 @@ GROUP BY t."${foreignKey}"
563
563
  default:
564
564
  throw new Error(`Unknown aggregation type: ${aggregationType}`);
565
565
  }
566
- const sql = `
567
- SELECT
568
- tmp.id as parent_id,
569
- COALESCE(${aggregateExpression}, ${config.defaultValue}) as data
570
- FROM ${tempTableName} tmp
571
- LEFT JOIN "${targetTable}" t ON t."${foreignKey}" = tmp.id${additionalWhere}
572
- GROUP BY tmp.id
566
+ const sql = `
567
+ SELECT
568
+ tmp.id as parent_id,
569
+ COALESCE(${aggregateExpression}, ${config.defaultValue}) as data
570
+ FROM ${tempTableName} tmp
571
+ LEFT JOIN "${targetTable}" t ON t."${foreignKey}" = tmp.id${additionalWhere}
572
+ GROUP BY tmp.id
573
573
  `.trim();
574
574
  return sql;
575
575
  }
@@ -49,6 +49,21 @@ export interface TableSchema<TColumns extends Record<string, ColumnBuilder> = an
49
49
  relations: Record<string, RelationConfig>;
50
50
  indexes: IndexDefinition[];
51
51
  foreignKeys: ForeignKeyConstraint[];
52
+ /**
53
+ * Performance optimization: Pre-computed map of property names to database column names
54
+ * Avoids repeated .build().name calls during query building
55
+ */
56
+ columnNameMap?: Map<string, string>;
57
+ /**
58
+ * Performance optimization: Pre-computed array of relation entries
59
+ * Avoids repeated Object.entries() calls during query building
60
+ */
61
+ relationEntries?: Array<[string, RelationConfig]>;
62
+ /**
63
+ * Performance optimization: Cache of built target schemas for relations
64
+ * Avoids repeated targetTableBuilder.build() calls
65
+ */
66
+ relationSchemaCache?: Map<string, TableSchema>;
52
67
  }
53
68
  /**
54
69
  * Extract TypeScript type from column builders
@@ -88,6 +103,7 @@ export declare class TableBuilder<TSchema extends SchemaDefinition = any> {
88
103
  private indexDefs;
89
104
  private foreignKeyDefs;
90
105
  constructor(name: string, schema: TSchema, indexes?: IndexDefinition[], foreignKeys?: ForeignKeyConstraint[], schemaName?: string);
106
+ private _cachedSchema?;
91
107
  /**
92
108
  * Build the final table schema
93
109
  */
@@ -1 +1 @@
1
- {"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"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"}
@@ -72,14 +72,36 @@ class TableBuilder {
72
72
  * Build the final table schema
73
73
  */
74
74
  build() {
75
- return {
75
+ // Return cached schema if available
76
+ if (this._cachedSchema) {
77
+ return this._cachedSchema;
78
+ }
79
+ // Performance: Pre-compute column name map once during build
80
+ const columnNameMap = new Map();
81
+ for (const [propName, colBuilder] of Object.entries(this.columnDefs)) {
82
+ columnNameMap.set(propName, colBuilder.build().name);
83
+ }
84
+ // Performance: Pre-compute relation entries array
85
+ const relationEntries = Object.entries(this.relationDefs);
86
+ // Performance: Pre-build and cache target schemas for all relations
87
+ const relationSchemaCache = new Map();
88
+ for (const [relName, relConfig] of relationEntries) {
89
+ if (relConfig.targetTableBuilder) {
90
+ relationSchemaCache.set(relName, relConfig.targetTableBuilder.build());
91
+ }
92
+ }
93
+ this._cachedSchema = {
76
94
  name: this.tableName,
77
95
  schema: this.schemaName,
78
96
  columns: this.columnDefs,
79
97
  relations: this.relationDefs,
80
98
  indexes: this.indexDefs,
81
99
  foreignKeys: this.foreignKeyDefs,
100
+ columnNameMap,
101
+ relationEntries,
102
+ relationSchemaCache,
82
103
  };
104
+ return this._cachedSchema;
83
105
  }
84
106
  /**
85
107
  * Get table name
@@ -1 +1 @@
1
- {"version":3,"file":"table-builder.js","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-builder.js","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linkgress-orm",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A lightweight, type-safe ORM for PostgreSQL with LINQ-style queries and automatic type inference",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",