rawsql-ts 0.20.0 → 0.21.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.
Files changed (83) hide show
  1. package/README.md +12 -13
  2. package/dist/esm/index.d.ts +1 -11
  3. package/dist/esm/index.js +1 -11
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/index.min.js +3 -39
  6. package/dist/esm/index.min.js.map +3 -3
  7. package/dist/esm/transformers/DynamicQueryBuilder.d.ts +4 -27
  8. package/dist/esm/transformers/DynamicQueryBuilder.js +10 -27
  9. package/dist/esm/transformers/DynamicQueryBuilder.js.map +1 -1
  10. package/dist/esm/transformers/SSSQLFilterBuilder.js +2 -1
  11. package/dist/esm/transformers/SSSQLFilterBuilder.js.map +1 -1
  12. package/dist/esm/utils/SchemaManager.d.ts +3 -19
  13. package/dist/esm/utils/SchemaManager.js +2 -62
  14. package/dist/esm/utils/SchemaManager.js.map +1 -1
  15. package/dist/index.js +2 -18
  16. package/dist/index.js.map +1 -1
  17. package/dist/index.min.js +3 -39
  18. package/dist/index.min.js.map +3 -3
  19. package/dist/src/index.d.ts +1 -11
  20. package/dist/src/transformers/DynamicQueryBuilder.d.ts +4 -27
  21. package/dist/src/utils/SchemaManager.d.ts +3 -19
  22. package/dist/transformers/DynamicQueryBuilder.js +10 -27
  23. package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
  24. package/dist/transformers/SSSQLFilterBuilder.js +2 -1
  25. package/dist/transformers/SSSQLFilterBuilder.js.map +1 -1
  26. package/dist/tsconfig.browser.tsbuildinfo +1 -1
  27. package/dist/utils/SchemaManager.js +2 -63
  28. package/dist/utils/SchemaManager.js.map +1 -1
  29. package/package.json +10 -2
  30. package/dist/esm/transformers/EnhancedJsonMapping.d.ts +0 -194
  31. package/dist/esm/transformers/EnhancedJsonMapping.js +0 -217
  32. package/dist/esm/transformers/EnhancedJsonMapping.js.map +0 -1
  33. package/dist/esm/transformers/JsonMappingConverter.d.ts +0 -200
  34. package/dist/esm/transformers/JsonMappingConverter.js +0 -388
  35. package/dist/esm/transformers/JsonMappingConverter.js.map +0 -1
  36. package/dist/esm/transformers/JsonMappingUnifier.d.ts +0 -100
  37. package/dist/esm/transformers/JsonMappingUnifier.js +0 -207
  38. package/dist/esm/transformers/JsonMappingUnifier.js.map +0 -1
  39. package/dist/esm/transformers/ModelDrivenJsonMapping.d.ts +0 -62
  40. package/dist/esm/transformers/ModelDrivenJsonMapping.js +0 -115
  41. package/dist/esm/transformers/ModelDrivenJsonMapping.js.map +0 -1
  42. package/dist/esm/transformers/PostgresArrayEntityCteBuilder.d.ts +0 -138
  43. package/dist/esm/transformers/PostgresArrayEntityCteBuilder.js +0 -454
  44. package/dist/esm/transformers/PostgresArrayEntityCteBuilder.js.map +0 -1
  45. package/dist/esm/transformers/PostgresJsonQueryBuilder.d.ts +0 -88
  46. package/dist/esm/transformers/PostgresJsonQueryBuilder.js +0 -241
  47. package/dist/esm/transformers/PostgresJsonQueryBuilder.js.map +0 -1
  48. package/dist/esm/transformers/PostgresObjectEntityCteBuilder.d.ts +0 -165
  49. package/dist/esm/transformers/PostgresObjectEntityCteBuilder.js +0 -343
  50. package/dist/esm/transformers/PostgresObjectEntityCteBuilder.js.map +0 -1
  51. package/dist/esm/transformers/TypeTransformationPostProcessor.d.ts +0 -108
  52. package/dist/esm/transformers/TypeTransformationPostProcessor.js +0 -354
  53. package/dist/esm/transformers/TypeTransformationPostProcessor.js.map +0 -1
  54. package/dist/esm/utils/JsonSchemaValidator.d.ts +0 -81
  55. package/dist/esm/utils/JsonSchemaValidator.js +0 -211
  56. package/dist/esm/utils/JsonSchemaValidator.js.map +0 -1
  57. package/dist/src/transformers/EnhancedJsonMapping.d.ts +0 -194
  58. package/dist/src/transformers/JsonMappingConverter.d.ts +0 -200
  59. package/dist/src/transformers/JsonMappingUnifier.d.ts +0 -100
  60. package/dist/src/transformers/ModelDrivenJsonMapping.d.ts +0 -62
  61. package/dist/src/transformers/PostgresArrayEntityCteBuilder.d.ts +0 -138
  62. package/dist/src/transformers/PostgresJsonQueryBuilder.d.ts +0 -88
  63. package/dist/src/transformers/PostgresObjectEntityCteBuilder.d.ts +0 -165
  64. package/dist/src/transformers/TypeTransformationPostProcessor.d.ts +0 -108
  65. package/dist/src/utils/JsonSchemaValidator.d.ts +0 -81
  66. package/dist/transformers/EnhancedJsonMapping.js +0 -223
  67. package/dist/transformers/EnhancedJsonMapping.js.map +0 -1
  68. package/dist/transformers/JsonMappingConverter.js +0 -392
  69. package/dist/transformers/JsonMappingConverter.js.map +0 -1
  70. package/dist/transformers/JsonMappingUnifier.js +0 -216
  71. package/dist/transformers/JsonMappingUnifier.js.map +0 -1
  72. package/dist/transformers/ModelDrivenJsonMapping.js +0 -122
  73. package/dist/transformers/ModelDrivenJsonMapping.js.map +0 -1
  74. package/dist/transformers/PostgresArrayEntityCteBuilder.js +0 -458
  75. package/dist/transformers/PostgresArrayEntityCteBuilder.js.map +0 -1
  76. package/dist/transformers/PostgresJsonQueryBuilder.js +0 -245
  77. package/dist/transformers/PostgresJsonQueryBuilder.js.map +0 -1
  78. package/dist/transformers/PostgresObjectEntityCteBuilder.js +0 -347
  79. package/dist/transformers/PostgresObjectEntityCteBuilder.js.map +0 -1
  80. package/dist/transformers/TypeTransformationPostProcessor.js +0 -363
  81. package/dist/transformers/TypeTransformationPostProcessor.js.map +0 -1
  82. package/dist/utils/JsonSchemaValidator.js +0 -215
  83. package/dist/utils/JsonSchemaValidator.js.map +0 -1
@@ -1,241 +0,0 @@
1
- import { CommonTable, SourceAliasExpression, SelectItem, SelectClause, FromClause, SourceExpression, TableSource, WithClause, LimitClause } from '../models/Clause';
2
- import { SimpleSelectQuery } from '../models/SimpleSelectQuery';
3
- import { IdentifierString, ColumnReference, FunctionCall, ValueList, LiteralValue, RawString } from '../models/ValueComponent';
4
- import { SelectValueCollector } from "./SelectValueCollector";
5
- import { PostgresObjectEntityCteBuilder } from './PostgresObjectEntityCteBuilder';
6
- import { PostgresArrayEntityCteBuilder } from './PostgresArrayEntityCteBuilder';
7
- import { QueryBuilder } from './QueryBuilder';
8
- /**
9
- * PostgreSQL JSON query builder that transforms SimpleSelectQuery into queries
10
- * that return JSON arrays or single JSON objects using PostgreSQL JSON functions.
11
- */
12
- export class PostgresJsonQueryBuilder {
13
- constructor() {
14
- this.selectValueCollector = new SelectValueCollector(null);
15
- this.objectEntityCteBuilder = new PostgresObjectEntityCteBuilder();
16
- this.arrayEntityCteBuilder = new PostgresArrayEntityCteBuilder();
17
- }
18
- /**
19
- * Validates the JSON mapping and the original query.
20
- * @param query Original query to transform
21
- * @param mapping JSON mapping configuration
22
- */
23
- validateMapping(query, mapping) {
24
- var _a, _b;
25
- const collector = new SelectValueCollector();
26
- const selectedValues = collector.collect(query);
27
- // sv.name is the alias or derived name
28
- const availableColumns = new Set(selectedValues.map(sv => sv.name)); // Check root entity columns
29
- for (const jsonKey in mapping.rootEntity.columns) {
30
- const columnDef = mapping.rootEntity.columns[jsonKey];
31
- // Handle both string and object formats
32
- const sourceColumn = typeof columnDef === 'string' ? columnDef : columnDef.column;
33
- if (!availableColumns.has(sourceColumn)) {
34
- throw new Error(`Validation Error: Column "${sourceColumn}" for JSON key "${jsonKey}" in root entity "${mapping.rootEntity.name}" not found in the query's select list.`);
35
- }
36
- }
37
- // Check nested entity columns and parent-child relationships
38
- const entityIds = new Set([mapping.rootEntity.id]);
39
- const parentToChildrenMap = new Map();
40
- mapping.nestedEntities.forEach(ne => {
41
- entityIds.add(ne.id);
42
- if (!parentToChildrenMap.has(ne.parentId)) {
43
- parentToChildrenMap.set(ne.parentId, []);
44
- }
45
- parentToChildrenMap.get(ne.parentId).push(ne.id);
46
- });
47
- for (const entity of mapping.nestedEntities) {
48
- if (!entityIds.has(entity.parentId)) {
49
- throw new Error(`Validation Error: Parent entity with ID "${entity.parentId}" for nested entity "${entity.name}" (ID: ${entity.id}) not found.`);
50
- }
51
- for (const jsonKey in entity.columns) {
52
- const columnDef = entity.columns[jsonKey];
53
- // Handle both string and object formats
54
- const sourceColumn = typeof columnDef === 'string' ? columnDef : columnDef.column;
55
- if (!availableColumns.has(sourceColumn)) {
56
- throw new Error(`Validation Error: Column "${sourceColumn}" for JSON key "${jsonKey}" in nested entity "${entity.name}" (ID: ${entity.id}) not found in the query's select list.`);
57
- }
58
- }
59
- }
60
- // Validate: An entity should not have multiple direct array children.
61
- // Validate: Child propertyNames under a single parent must be unique.
62
- const allParentIds = new Set([mapping.rootEntity.id, ...mapping.nestedEntities.map(ne => ne.parentId)]);
63
- for (const parentId of allParentIds) {
64
- const directChildren = mapping.nestedEntities.filter(ne => ne.parentId === parentId);
65
- const directArrayChildrenCount = directChildren.filter(c => c.relationshipType === 'array').length;
66
- if (directArrayChildrenCount > 1) {
67
- const parentName = parentId === mapping.rootEntity.id ? mapping.rootEntity.name : (_a = mapping.nestedEntities.find(ne => ne.id === parentId)) === null || _a === void 0 ? void 0 : _a.name;
68
- throw new Error(`Validation Error: Parent entity "${parentName}" (ID: ${parentId}) has multiple direct array children. This is not supported.`);
69
- }
70
- const propertyNames = new Set();
71
- for (const child of directChildren) {
72
- if (propertyNames.has(child.propertyName)) {
73
- const parentName = parentId === mapping.rootEntity.id ? mapping.rootEntity.name : (_b = mapping.nestedEntities.find(ne => ne.id === parentId)) === null || _b === void 0 ? void 0 : _b.name;
74
- throw new Error(`Validation Error: Parent entity "${parentName}" (ID: ${parentId}) has duplicate property name "${child.propertyName}" for its children.`);
75
- }
76
- propertyNames.add(child.propertyName);
77
- }
78
- }
79
- }
80
- buildJsonQuery(originalQuery, mapping, options) {
81
- // Check jsonb option - must be true (or undefined/default) for GROUP BY compatibility
82
- if ((options === null || options === void 0 ? void 0 : options.jsonb) === false) {
83
- throw new Error('JSONB must be enabled for PostgreSQL GROUP BY compatibility. ' +
84
- 'JSON type cannot be used in GROUP BY clauses. ' +
85
- 'Please set jsonb: true or omit the jsonb option (defaults to true).');
86
- }
87
- // Convert any SelectQuery to SimpleSelectQuery using QueryBuilder
88
- const simpleQuery = originalQuery instanceof SimpleSelectQuery
89
- ? originalQuery
90
- : QueryBuilder.buildSimpleQuery(originalQuery);
91
- return this.buildJsonWithCteStrategy(simpleQuery, mapping);
92
- }
93
- /**
94
- * Build JSON query from original query and mapping configuration.
95
- * @deprecated Use buildJsonQuery instead. This method will be removed in a future version.
96
- * @param originalQuery Original query to transform
97
- * @param mapping JSON mapping configuration
98
- * @returns Transformed query with JSON aggregation
99
- */
100
- buildJson(originalQuery, mapping) {
101
- console.warn('buildJson is deprecated. Use buildJsonQuery instead.');
102
- return this.buildJsonQuery(originalQuery, mapping);
103
- }
104
- /**
105
- * Builds the JSON structure using a unified CTE-based strategy.
106
- * @param originalQuery Original query
107
- * @param mapping JSON mapping configuration
108
- * @returns Query with CTE-based JSON aggregation
109
- */
110
- buildJsonWithCteStrategy(originalQuery, mapping) {
111
- this.validateMapping(originalQuery, mapping);
112
- // Step 1: Create the initial CTE from the original query
113
- const { initialCte, initialCteAlias } = this.createInitialCte(originalQuery);
114
- let ctesForProcessing = [initialCte];
115
- let currentAliasToBuildUpon = initialCteAlias;
116
- // Step 2: Prepare entity information
117
- const allEntities = new Map();
118
- allEntities.set(mapping.rootEntity.id, Object.assign(Object.assign({}, mapping.rootEntity), { isRoot: true, propertyName: mapping.rootName }));
119
- mapping.nestedEntities.forEach(ne => allEntities.set(ne.id, Object.assign(Object.assign({}, ne), { isRoot: false, propertyName: ne.propertyName }))); // Step 2.5: Build CTEs for object entities using dedicated builder
120
- const objectEntityResult = this.objectEntityCteBuilder.buildObjectEntityCtes(initialCte, allEntities, mapping);
121
- // Important: Replace the entire CTE list with the result from object entity builder
122
- // The object entity builder returns all CTEs including the initial one
123
- ctesForProcessing = objectEntityResult.ctes;
124
- currentAliasToBuildUpon = objectEntityResult.lastCteAlias;
125
- // Store column mappings for later use
126
- const columnMappings = objectEntityResult.columnMappings;
127
- // Step 3: Build CTEs for array entities using dedicated builder
128
- const arrayCteBuildResult = this.arrayEntityCteBuilder.buildArrayEntityCtes(ctesForProcessing, currentAliasToBuildUpon, allEntities, mapping, columnMappings);
129
- ctesForProcessing = arrayCteBuildResult.updatedCtes;
130
- currentAliasToBuildUpon = arrayCteBuildResult.lastCteAlias;
131
- // Step 4: Build the final SELECT query using all generated CTEs
132
- return this.buildFinalSelectQuery(ctesForProcessing, currentAliasToBuildUpon, allEntities, mapping, columnMappings);
133
- }
134
- /**
135
- * Creates the initial Common Table Expression (CTE) from the original query.
136
- * @param originalQuery The base SimpleSelectQuery.
137
- * @returns An object containing the initial CTE and its alias.
138
- */
139
- createInitialCte(originalQuery) {
140
- const originCteAlias = "origin_query";
141
- const originCte = new CommonTable(originalQuery, new SourceAliasExpression(originCteAlias, null), null);
142
- return { initialCte: originCte, initialCteAlias: originCteAlias };
143
- }
144
- /**
145
- * Builds the final SELECT query that constructs the root JSON object (or array of objects).
146
- * This query uses all previously generated CTEs.
147
- * @param finalCtesList The complete list of all CTEs (initial and array CTEs).
148
- * @param lastCteAliasForFromClause Alias of the final CTE from which the root object will be built.
149
- * @param allEntities Map of all processable entities.
150
- * @param mapping JSON mapping configuration.
151
- * @returns The final SimpleSelectQuery.
152
- */
153
- buildFinalSelectQuery(finalCtesList, lastCteAliasForFromClause, allEntities, mapping, columnMappings) {
154
- const currentCtes = [...finalCtesList];
155
- // Define rootObjectCteAlias outside of if block
156
- const rootObjectCteAlias = `cte_root_${mapping.rootName.toLowerCase().replace(/[^a-z0-9_]/g, '_')}`;
157
- const rootEntity = allEntities.get(mapping.rootEntity.id);
158
- if (!rootEntity) {
159
- throw new Error(`Root entity ${mapping.rootEntity.id} not found`);
160
- }
161
- if (mapping.resultFormat === "array" || !mapping.resultFormat) {
162
- // Step 4.1a: Create a CTE that wraps the final result as the root object // No alias needed for single table SELECT
163
- const rootObjectBuilderExpression = this.buildEntityJsonObject(rootEntity, null, // No source alias for single table
164
- mapping.nestedEntities, allEntities, columnMappings);
165
- const rootObjectSelectItem = new SelectItem(rootObjectBuilderExpression, mapping.rootName);
166
- const rootObjectCte = new CommonTable(new SimpleSelectQuery({
167
- selectClause: new SelectClause([rootObjectSelectItem]),
168
- fromClause: new FromClause(new SourceExpression(new TableSource(null, new IdentifierString(lastCteAliasForFromClause)), null // No alias
169
- ), null),
170
- }), new SourceAliasExpression(rootObjectCteAlias, null), null);
171
- currentCtes.push(rootObjectCte);
172
- // Step 4.1b: Aggregate all the root objects
173
- const aggregationFunc = "jsonb_agg"; // Always use JSONB
174
- const aggregateExpression = new FunctionCall(null, new RawString(aggregationFunc), new ValueList([new ColumnReference(null, new IdentifierString(mapping.rootName))]), null);
175
- return new SimpleSelectQuery({
176
- withClause: new WithClause(false, currentCtes),
177
- selectClause: new SelectClause([
178
- new SelectItem(aggregateExpression, `${mapping.rootName}_array`)
179
- ]),
180
- fromClause: new FromClause(new SourceExpression(new TableSource(null, new IdentifierString(rootObjectCteAlias)), null), null),
181
- });
182
- }
183
- else {
184
- // For a single object result, create root object CTE without alias
185
- const rootObjectBuilderExpression = this.buildEntityJsonObject(rootEntity, null, // No source alias for single table
186
- mapping.nestedEntities, allEntities, columnMappings);
187
- const rootObjectSelectItem = new SelectItem(rootObjectBuilderExpression, mapping.rootName);
188
- const rootObjectCte = new CommonTable(new SimpleSelectQuery({
189
- selectClause: new SelectClause([rootObjectSelectItem]),
190
- fromClause: new FromClause(new SourceExpression(new TableSource(null, new IdentifierString(lastCteAliasForFromClause)), null // No alias
191
- ), null),
192
- }), new SourceAliasExpression(rootObjectCteAlias, null), null);
193
- currentCtes.push(rootObjectCte);
194
- // Select directly from the root_object_cte with LIMIT 1
195
- return new SimpleSelectQuery({
196
- withClause: new WithClause(false, currentCtes),
197
- selectClause: new SelectClause([
198
- new SelectItem(new ColumnReference(null, new IdentifierString(mapping.rootName)), mapping.rootName)
199
- ]),
200
- fromClause: new FromClause(new SourceExpression(new TableSource(null, new IdentifierString(rootObjectCteAlias)), null), null),
201
- limitClause: new LimitClause(new LiteralValue(1)) // Correctly use LimitClause
202
- });
203
- }
204
- }
205
- /**
206
- * Build JSON object for entity, using parent JSON columns when available
207
- */
208
- buildEntityJsonObject(entity, sourceAlias, nestedEntities, allEntities, columnMappings) {
209
- const jsonBuildFunction = "jsonb_build_object";
210
- const args = [];
211
- // Add the entity's own columns
212
- Object.entries(entity.columns).forEach(([jsonKey, columnDef]) => {
213
- // Handle both string and object formats
214
- const sqlColumn = typeof columnDef === 'string' ? columnDef : columnDef.column;
215
- args.push(new LiteralValue(jsonKey, undefined, true));
216
- args.push(new ColumnReference(null, new IdentifierString(sqlColumn)));
217
- });
218
- // Find and process child entities (both object and array types)
219
- const childEntities = nestedEntities.filter((ne) => ne.parentId === entity.id);
220
- childEntities.forEach((childEntity) => {
221
- const child = allEntities.get(childEntity.id);
222
- if (!child)
223
- return;
224
- args.push(new LiteralValue(childEntity.propertyName, undefined, true));
225
- if (childEntity.relationshipType === "object") {
226
- // For object relationships, use pre-computed JSON column from column mappings
227
- const mapping = columnMappings.find(m => m.entityId === child.id);
228
- if (!mapping) {
229
- throw new Error(`Column mapping not found for entity: ${child.id}`);
230
- }
231
- args.push(new ColumnReference(null, new IdentifierString(mapping.generatedColumnName)));
232
- }
233
- else if (childEntity.relationshipType === "array") {
234
- // For array relationships, use the column directly
235
- args.push(new ColumnReference(null, new IdentifierString(childEntity.propertyName)));
236
- }
237
- });
238
- return new FunctionCall(null, new RawString(jsonBuildFunction), new ValueList(args), null);
239
- }
240
- }
241
- //# sourceMappingURL=PostgresJsonQueryBuilder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostgresJsonQueryBuilder.js","sourceRoot":"","sources":["../../../src/transformers/PostgresJsonQueryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAiB,UAAU,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACnM,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAkB,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAA0E,SAAS,EAAmB,MAAM,0BAA0B,CAAC;AACxO,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,8BAA8B,EAA0D,MAAM,kCAAkC,CAAC;AAC1I,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0B9C;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAKjC;QACI,IAAI,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,sBAAsB,GAAG,IAAI,8BAA8B,EAAE,CAAC;QACnE,IAAI,CAAC,qBAAqB,GAAG,IAAI,6BAA6B,EAAE,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACK,eAAe,CAAC,KAAwB,EAAE,OAAoB;;QAClE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhD,uCAAuC;QACvC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAQ,4BAA4B;QACxG,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,wCAAwC;YACxC,MAAM,YAAY,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,SAAiB,CAAC,MAAM,CAAC;YAC3F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,mBAAmB,OAAO,qBAAqB,OAAO,CAAC,UAAU,CAAC,IAAI,yCAAyC,CAAC,CAAC;YAC9K,CAAC;QACL,CAAC;QAED,6DAA6D;QAC7D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAoB,CAAC;QAExD,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAChC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,4CAA4C,MAAM,CAAC,QAAQ,wBAAwB,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;YACrJ,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAC1C,wCAAwC;gBACxC,MAAM,YAAY,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,SAAiB,CAAC,MAAM,CAAC;gBAC3F,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBACtC,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,mBAAmB,OAAO,uBAAuB,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,EAAE,yCAAyC,CAAC,CAAC;gBACvL,CAAC;YACL,CAAC;QACL,CAAC;QAED,sEAAsE;QACtE,sEAAsE;QACtE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxG,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACrF,MAAM,wBAAwB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;YACnG,IAAI,wBAAwB,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,0CAAE,IAAI,CAAC;gBAC9I,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,UAAU,QAAQ,8DAA8D,CAAC,CAAC;YACpJ,CAAC;YAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACjC,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;oBACxC,MAAM,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,0CAAE,IAAI,CAAC;oBAC9I,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,UAAU,QAAQ,kCAAkC,KAAK,CAAC,YAAY,qBAAqB,CAAC,CAAC;gBAC/J,CAAC;gBACD,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC;IAUM,cAAc,CAAC,aAA8C,EAAE,OAAoB,EAAE,OAA2B;QACnH,sFAAsF;QACtF,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,MAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACX,+DAA+D;gBAC/D,gDAAgD;gBAChD,qEAAqE,CACxE,CAAC;QACN,CAAC;QAED,kEAAkE;QAClE,MAAM,WAAW,GAAG,aAAa,YAAY,iBAAiB;YAC1D,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAEnD,OAAO,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;;OAMG;IACI,SAAS,CAAC,aAAgC,EAAE,OAAoB;QACnE,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;;;;OAKG;IACK,wBAAwB,CAC5B,aAAgC,EAChC,OAAoB;QAEpB,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE7C,yDAAyD;QACzD,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAE7E,IAAI,iBAAiB,GAAkB,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,uBAAuB,GAAG,eAAe,CAAC;QAE9C,qCAAqC;QACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;QACzD,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kCAAO,OAAO,CAAC,UAAU,KAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,QAAQ,IAAG,CAAC;QAChH,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,kCAAO,EAAE,KAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,YAAY,IAAG,CAAC,CAAC,CAAQ,mEAAmE;QACjM,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,CACxE,UAAU,EACV,WAAW,EACX,OAAO,CACV,CAAC;QACF,oFAAoF;QACpF,uEAAuE;QACvE,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC;QAC5C,uBAAuB,GAAG,kBAAkB,CAAC,YAAY,CAAC;QAC1D,sCAAsC;QACtC,MAAM,cAAc,GAAG,kBAAkB,CAAC,cAAc,CAAC;QAEzD,gEAAgE;QAChE,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CACvE,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACX,OAAO,EACP,cAAc,CACjB,CAAC;QACF,iBAAiB,GAAG,mBAAmB,CAAC,WAAW,CAAC;QACpD,uBAAuB,GAAG,mBAAmB,CAAC,YAAY,CAAC;QAE3D,gEAAgE;QAChE,OAAO,IAAI,CAAC,qBAAqB,CAC7B,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACX,OAAO,EACP,cAAc,CACjB,CAAC;IACN,CAAC;IAED;;;;OAIG;IACK,gBAAgB,CAAC,aAAgC;QACrD,MAAM,cAAc,GAAG,cAAc,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,WAAW,CAC7B,aAAa,EACb,IAAI,qBAAqB,CAAC,cAAc,EAAE,IAAI,CAAC,EAC/C,IAAI,CACP,CAAC;QACF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;IACtE,CAAC;IAED;;;;;;;;OAQG;IACK,qBAAqB,CACzB,aAA4B,EAC5B,yBAAiC,EACjC,WAA2C,EAC3C,OAAoB,EACpB,cAAmC;QAEnC,MAAM,WAAW,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;QAEvC,gDAAgD;QAChD,MAAM,kBAAkB,GAAG,YAAY,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC;QACpG,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5D,+HAA+H;YAC/H,MAAM,2BAA2B,GAAG,IAAI,CAAC,qBAAqB,CAC1D,UAAU,EACV,IAAI,EAAG,mCAAmC;YAC1C,OAAO,CAAC,cAAc,EACtB,WAAW,EACX,cAAc,CACjB,CAAC;YAEF,MAAM,oBAAoB,GAAG,IAAI,UAAU,CAAC,2BAA2B,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3F,MAAM,aAAa,GAAG,IAAI,WAAW,CACjC,IAAI,iBAAiB,CAAC;gBAClB,YAAY,EAAE,IAAI,YAAY,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBACtD,UAAU,EAAE,IAAI,UAAU,CACtB,IAAI,gBAAgB,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,EACtE,IAAI,CAAE,WAAW;iBACpB,EACD,IAAI,CACP;aACJ,CAAC,EACF,IAAI,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,EACnD,IAAI,CACP,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEhC,4CAA4C;YAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,CAAE,mBAAmB;YACzD,MAAM,mBAAmB,GAAG,IAAI,YAAY,CACxC,IAAI,EACJ,IAAI,SAAS,CAAC,eAAe,CAAC,EAC9B,IAAI,SAAS,CAAC,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAClF,IAAI,CACP,CAAC;YAEF,OAAO,IAAI,iBAAiB,CAAC;gBACzB,UAAU,EAAE,IAAI,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC;gBAC9C,YAAY,EAAE,IAAI,YAAY,CAAC;oBAC3B,IAAI,UAAU,CAAC,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,QAAQ,CAAC;iBACnE,CAAC;gBACF,UAAU,EAAE,IAAI,UAAU,CACtB,IAAI,gBAAgB,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,EAC3F,IAAI,CACP;aACJ,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,mEAAmE;YACnE,MAAM,2BAA2B,GAAG,IAAI,CAAC,qBAAqB,CAC1D,UAAU,EACV,IAAI,EAAG,mCAAmC;YAC1C,OAAO,CAAC,cAAc,EACtB,WAAW,EACX,cAAc,CACjB,CAAC;YAEF,MAAM,oBAAoB,GAAG,IAAI,UAAU,CAAC,2BAA2B,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3F,MAAM,aAAa,GAAG,IAAI,WAAW,CACjC,IAAI,iBAAiB,CAAC;gBAClB,YAAY,EAAE,IAAI,YAAY,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBACtD,UAAU,EAAE,IAAI,UAAU,CACtB,IAAI,gBAAgB,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,EACtE,IAAI,CAAE,WAAW;iBACpB,EACD,IAAI,CACP;aACJ,CAAC,EACF,IAAI,qBAAqB,CAAC,kBAAkB,EAAE,IAAI,CAAC,EACnD,IAAI,CACP,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEhC,wDAAwD;YACxD,OAAO,IAAI,iBAAiB,CAAC;gBACzB,UAAU,EAAE,IAAI,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC;gBAC9C,YAAY,EAAE,IAAI,YAAY,CAAC;oBAC3B,IAAI,UAAU,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;iBACtG,CAAC;gBACF,UAAU,EAAE,IAAI,UAAU,CACtB,IAAI,gBAAgB,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,EAC3F,IAAI,CACP;gBACD,WAAW,EAAE,IAAI,WAAW,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;aACjF,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CACzB,MAAyB,EACzB,WAA0B,EAC1B,cAA6C,EAC7C,WAA2C,EAC3C,cAAmC;QAEnC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;QAC/C,MAAM,IAAI,GAAqB,EAAE,CAAC;QAElC,+BAA+B;QAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,wCAAwC;YACxC,MAAM,SAAS,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,SAAiB,CAAC,MAAM,CAAC;YACxF,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,gEAAgE;QAChE,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/E,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAAC,IAAI,WAAW,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBACpH,8EAA8E;gBAC9E,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,wCAAwC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxE,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC5F,CAAC;iBAAM,IAAI,WAAW,CAAC,gBAAgB,KAAK,OAAO,EAAE,CAAC;gBAClD,mDAAmD;gBACnD,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACzF,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,iBAAiB,CAAC,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/F,CAAC;CACJ"}
@@ -1,165 +0,0 @@
1
- import { CommonTable } from '../models/Clause';
2
- import { JsonMapping } from './PostgresJsonQueryBuilder';
3
- /**
4
- * Entity with processing metadata
5
- */
6
- export interface ProcessableEntity {
7
- id: string;
8
- name: string;
9
- columns: {
10
- [jsonKey: string]: string;
11
- };
12
- isRoot: boolean;
13
- propertyName: string;
14
- parentId?: string;
15
- relationshipType?: "object" | "array";
16
- }
17
- /**
18
- * JSON column mapping information
19
- */
20
- export interface JsonColumnMapping {
21
- entityId: string;
22
- entityName: string;
23
- generatedColumnName: string;
24
- depth: number;
25
- }
26
- /**
27
- * Result from CTE builder including column mappings
28
- */
29
- export interface CteBuilderResult {
30
- ctes: CommonTable[];
31
- lastCteAlias: string;
32
- columnMappings: JsonColumnMapping[];
33
- }
34
- /**
35
- * PostgreSQL-specific builder for creating CTEs for object entities (object relationships).
36
- * This class handles the creation of CTEs that build JSON/JSONB objects for object entities,
37
- * processing them from the deepest level up to ensure proper dependency ordering.
38
- *
39
- * Features:
40
- * - Depth-based CTE naming (cte_object_depth_N)
41
- * - NULL handling for entity columns
42
- * - JSONB/JSON object construction
43
- * - Hierarchical processing of nested objects
44
- *
45
- * Why depth calculation is critical:
46
- * 1. Object entities can be nested at multiple levels. We must process the deepest
47
- * (most distant) objects first to ensure their JSON representations are available
48
- * when building their parent entities.
49
- * 2. Object entity processing is essentially a column compression operation. Entities
50
- * at the same depth level can be processed simultaneously since they don't depend
51
- * on each other.
52
- *
53
- * Example hierarchy:
54
- * Order (root, depth 0)
55
- * └─ Customer (depth 1)
56
- * └─ Address (depth 2)
57
- * └─ Shipping (depth 1)
58
- * └─ Carrier (depth 2)
59
- *
60
- * Processing order: depth 2 → depth 1 → depth 0
61
- */
62
- export declare class PostgresObjectEntityCteBuilder {
63
- private static readonly CTE_OBJECT_PREFIX;
64
- private static readonly WILDCARD_COLUMN;
65
- private jsonColumnCounter;
66
- private entityToJsonColumnMap;
67
- private columnMappings;
68
- /**
69
- * Build CTEs for all object entities in the correct dependency order
70
- * @param initialCte The starting CTE containing all raw data
71
- * @param allEntities Map of all entities in the mapping
72
- * @param mapping The JSON mapping configuration
73
- * @returns Array of CTEs and the alias of the last CTE created
74
- */
75
- buildObjectEntityCtes(initialCte: CommonTable, allEntities: Map<string, ProcessableEntity>, mapping: JsonMapping): CteBuilderResult;
76
- /**
77
- * Generate unique JSON column name with entity name and counter
78
- */
79
- private generateUniqueJsonColumnName; /**
80
- * Collect all object entities and calculate their depth from root.
81
- *
82
- * Depth calculation is crucial because:
83
- * - It determines the processing order (deepest first)
84
- * - It ensures dependencies are resolved before an entity is processed
85
- * - It allows parallel processing of entities at the same depth level
86
- *
87
- * @param mapping The JSON mapping configuration
88
- * @param allEntities Map of all entities in the mapping
89
- * @returns Array of object entity information with calculated depths
90
- */
91
- private collectAndSortObjectEntities;
92
- /**
93
- * Group entities by their depth level.
94
- *
95
- * Grouping by depth allows us to:
96
- * - Process all entities at the same level in a single CTE
97
- * - Optimize query performance by reducing the number of CTEs
98
- * - Maintain clear dependency ordering
99
- *
100
- * @param parentInfos Array of parent entity information with depths
101
- * @returns Map of depth level to entities at that depth
102
- */ private groupEntitiesByDepth;
103
- /**
104
- * Build a CTE that processes all entities at a specific depth level
105
- */
106
- private buildDepthCte;
107
- /**
108
- * Build JSON column for a single entity with NULL handling
109
- */
110
- private buildEntityJsonColumn;
111
- /**
112
- * Calculate approximate depth for an entity (for mapping purposes)
113
- */
114
- private calculateApproximateDepth;
115
- /**
116
- * Prepare entity columns and NULL checks.
117
- *
118
- * This method extracts column data and creates NULL checks for each column.
119
- * The NULL checking is essential for handling outer joins correctly.
120
- *
121
- * In outer join scenarios, when there's no matching row in the joined table,
122
- * all columns from that table will be NULL. Instead of creating an empty object
123
- * with all NULL properties (e.g., {id: null, name: null, email: null}),
124
- * we want to represent the absence of the entity as NULL itself.
125
- *
126
- * This ensures cleaner JSON output where missing relationships are represented
127
- * as NULL rather than objects with all NULL fields.
128
- *
129
- * @param entity The entity whose columns are being processed
130
- * @returns Object containing arrays of JSON object arguments and NULL check conditions
131
- */
132
- private prepareEntityColumns;
133
- /**
134
- * Add child object relationships to JSON object arguments.
135
- *
136
- * This method processes nested object-type entities that are direct children of the current entity.
137
- * For each child entity, it adds the property name and corresponding JSON column reference
138
- * to the arguments array that will be used to build the parent's JSON object.
139
- *
140
- * The child JSON columns are expected to already exist in the data source (created by deeper
141
- * level CTEs), as we process from the deepest level up to the root.
142
- *
143
- * Note: In this context, "child" refers to entities that have an object relationship (0..1)
144
- * with their parent. From a data perspective, these are typically entities referenced via
145
- * foreign keys, representing "parent" entities in traditional database terminology.
146
- *
147
- * @param entity The current entity being processed
148
- * @param jsonObjectArgs Array to which JSON object arguments will be added
149
- * @param mapping The JSON mapping configuration
150
- * @param allEntities Map of all entities in the mapping
151
- */
152
- private addChildObjectRelationships;
153
- /**
154
- * Create JSON object function call
155
- */
156
- private createJsonObject;
157
- /**
158
- * Build NULL condition from NULL checks
159
- */
160
- private buildNullCondition;
161
- /**
162
- * Create CASE expression with NULL handling
163
- */
164
- private createCaseExpression;
165
- }