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.
- package/LICENSE +21 -21
- package/README.md +196 -196
- package/dist/entity/db-context.d.ts.map +1 -1
- package/dist/entity/db-context.js +7 -5
- package/dist/entity/db-context.js.map +1 -1
- package/dist/migration/db-schema-manager.d.ts +5 -0
- package/dist/migration/db-schema-manager.d.ts.map +1 -1
- package/dist/migration/db-schema-manager.js +147 -79
- package/dist/migration/db-schema-manager.js.map +1 -1
- package/dist/migration/enum-migrator.js +6 -6
- package/dist/query/collection-strategy.interface.d.ts +38 -0
- package/dist/query/collection-strategy.interface.d.ts.map +1 -1
- package/dist/query/cte-builder.d.ts +18 -1
- package/dist/query/cte-builder.d.ts.map +1 -1
- package/dist/query/cte-builder.js +102 -11
- package/dist/query/cte-builder.js.map +1 -1
- package/dist/query/grouped-query.d.ts +24 -1
- package/dist/query/grouped-query.d.ts.map +1 -1
- package/dist/query/grouped-query.js +260 -71
- package/dist/query/grouped-query.js.map +1 -1
- package/dist/query/join-builder.d.ts.map +1 -1
- package/dist/query/join-builder.js +10 -14
- package/dist/query/join-builder.js.map +1 -1
- package/dist/query/query-builder.d.ts +65 -1
- package/dist/query/query-builder.d.ts.map +1 -1
- package/dist/query/query-builder.js +566 -167
- package/dist/query/query-builder.js.map +1 -1
- package/dist/query/strategies/cte-collection-strategy.d.ts +4 -0
- package/dist/query/strategies/cte-collection-strategy.d.ts.map +1 -1
- package/dist/query/strategies/cte-collection-strategy.js +169 -78
- package/dist/query/strategies/cte-collection-strategy.js.map +1 -1
- package/dist/query/strategies/lateral-collection-strategy.d.ts +4 -0
- package/dist/query/strategies/lateral-collection-strategy.d.ts.map +1 -1
- package/dist/query/strategies/lateral-collection-strategy.js +86 -28
- package/dist/query/strategies/lateral-collection-strategy.js.map +1 -1
- package/dist/query/strategies/temptable-collection-strategy.js +97 -97
- package/dist/schema/table-builder.d.ts +16 -0
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +23 -1
- package/dist/schema/table-builder.js.map +1 -1
- 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":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,YAAY,EAMb,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,GAAG;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,QAAQ,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,oBAAoB,EAAE,CAAC;
|
|
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
|
-
|
|
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":";;;
|
|
1
|
+
{"version":3,"file":"table-builder.js","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED