linkgress-orm 0.0.1
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 -0
- package/README.md +196 -0
- package/dist/database/database-client.interface.d.ts +45 -0
- package/dist/database/database-client.interface.d.ts.map +1 -0
- package/dist/database/database-client.interface.js +20 -0
- package/dist/database/database-client.interface.js.map +1 -0
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +10 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/pg-client.d.ts +30 -0
- package/dist/database/pg-client.d.ts.map +1 -0
- package/dist/database/pg-client.js +76 -0
- package/dist/database/pg-client.js.map +1 -0
- package/dist/database/postgres-client.d.ts +44 -0
- package/dist/database/postgres-client.d.ts.map +1 -0
- package/dist/database/postgres-client.js +111 -0
- package/dist/database/postgres-client.js.map +1 -0
- package/dist/database/types.d.ts +200 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +8 -0
- package/dist/database/types.js.map +1 -0
- package/dist/entity/base-entity.d.ts +21 -0
- package/dist/entity/base-entity.d.ts.map +1 -0
- package/dist/entity/base-entity.js +27 -0
- package/dist/entity/base-entity.js.map +1 -0
- package/dist/entity/db-column.d.ts +61 -0
- package/dist/entity/db-column.d.ts.map +1 -0
- package/dist/entity/db-column.js +35 -0
- package/dist/entity/db-column.js.map +1 -0
- package/dist/entity/db-context.d.ts +665 -0
- package/dist/entity/db-context.d.ts.map +1 -0
- package/dist/entity/db-context.js +1463 -0
- package/dist/entity/db-context.js.map +1 -0
- package/dist/entity/entity-base.d.ts +76 -0
- package/dist/entity/entity-base.d.ts.map +1 -0
- package/dist/entity/entity-base.js +42 -0
- package/dist/entity/entity-base.js.map +1 -0
- package/dist/entity/entity-builder.d.ts +171 -0
- package/dist/entity/entity-builder.d.ts.map +1 -0
- package/dist/entity/entity-builder.js +376 -0
- package/dist/entity/entity-builder.js.map +1 -0
- package/dist/entity/model-config.d.ts +18 -0
- package/dist/entity/model-config.d.ts.map +1 -0
- package/dist/entity/model-config.js +157 -0
- package/dist/entity/model-config.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +142 -0
- package/dist/index.js.map +1 -0
- package/dist/migration/db-schema-manager.d.ts +228 -0
- package/dist/migration/db-schema-manager.d.ts.map +1 -0
- package/dist/migration/db-schema-manager.js +1055 -0
- package/dist/migration/db-schema-manager.js.map +1 -0
- package/dist/migration/enum-migrator.d.ts +29 -0
- package/dist/migration/enum-migrator.d.ts.map +1 -0
- package/dist/migration/enum-migrator.js +137 -0
- package/dist/migration/enum-migrator.js.map +1 -0
- package/dist/query/collection-strategy.factory.d.ts +16 -0
- package/dist/query/collection-strategy.factory.d.ts.map +1 -0
- package/dist/query/collection-strategy.factory.js +37 -0
- package/dist/query/collection-strategy.factory.js.map +1 -0
- package/dist/query/collection-strategy.interface.d.ts +146 -0
- package/dist/query/collection-strategy.interface.d.ts.map +1 -0
- package/dist/query/collection-strategy.interface.js +3 -0
- package/dist/query/collection-strategy.interface.js.map +1 -0
- package/dist/query/conditions.d.ts +222 -0
- package/dist/query/conditions.d.ts.map +1 -0
- package/dist/query/conditions.js +446 -0
- package/dist/query/conditions.js.map +1 -0
- package/dist/query/cte-builder.d.ts +95 -0
- package/dist/query/cte-builder.d.ts.map +1 -0
- package/dist/query/cte-builder.js +172 -0
- package/dist/query/cte-builder.js.map +1 -0
- package/dist/query/grouped-query.d.ts +186 -0
- package/dist/query/grouped-query.d.ts.map +1 -0
- package/dist/query/grouped-query.js +588 -0
- package/dist/query/grouped-query.js.map +1 -0
- package/dist/query/join-builder.d.ts +106 -0
- package/dist/query/join-builder.d.ts.map +1 -0
- package/dist/query/join-builder.js +275 -0
- package/dist/query/join-builder.js.map +1 -0
- package/dist/query/query-builder.d.ts +543 -0
- package/dist/query/query-builder.d.ts.map +1 -0
- package/dist/query/query-builder.js +2649 -0
- package/dist/query/query-builder.js.map +1 -0
- package/dist/query/strategies/jsonb-collection-strategy.d.ts +51 -0
- package/dist/query/strategies/jsonb-collection-strategy.d.ts.map +1 -0
- package/dist/query/strategies/jsonb-collection-strategy.js +210 -0
- package/dist/query/strategies/jsonb-collection-strategy.js.map +1 -0
- package/dist/query/strategies/temptable-collection-strategy.d.ts +95 -0
- package/dist/query/strategies/temptable-collection-strategy.d.ts.map +1 -0
- package/dist/query/strategies/temptable-collection-strategy.js +456 -0
- package/dist/query/strategies/temptable-collection-strategy.js.map +1 -0
- package/dist/query/subquery.d.ts +152 -0
- package/dist/query/subquery.d.ts.map +1 -0
- package/dist/query/subquery.js +206 -0
- package/dist/query/subquery.js.map +1 -0
- package/dist/schema/column-builder.d.ts +127 -0
- package/dist/schema/column-builder.d.ts.map +1 -0
- package/dist/schema/column-builder.js +184 -0
- package/dist/schema/column-builder.js.map +1 -0
- package/dist/schema/inference.d.ts +26 -0
- package/dist/schema/inference.d.ts.map +1 -0
- package/dist/schema/inference.js +3 -0
- package/dist/schema/inference.js.map +1 -0
- package/dist/schema/navigation.d.ts +215 -0
- package/dist/schema/navigation.d.ts.map +1 -0
- package/dist/schema/navigation.js +233 -0
- package/dist/schema/navigation.js.map +1 -0
- package/dist/schema/row-type.d.ts +26 -0
- package/dist/schema/row-type.d.ts.map +1 -0
- package/dist/schema/row-type.js +3 -0
- package/dist/schema/row-type.js.map +1 -0
- package/dist/schema/sequence-builder.d.ts +87 -0
- package/dist/schema/sequence-builder.d.ts.map +1 -0
- package/dist/schema/sequence-builder.js +123 -0
- package/dist/schema/sequence-builder.js.map +1 -0
- package/dist/schema/table-builder.d.ts +122 -0
- package/dist/schema/table-builder.d.ts.map +1 -0
- package/dist/schema/table-builder.js +132 -0
- package/dist/schema/table-builder.js.map +1 -0
- package/dist/schema/typed-schema.d.ts +22 -0
- package/dist/schema/typed-schema.d.ts.map +1 -0
- package/dist/schema/typed-schema.js +28 -0
- package/dist/schema/typed-schema.js.map +1 -0
- package/dist/types/column-types.d.ts +20 -0
- package/dist/types/column-types.d.ts.map +1 -0
- package/dist/types/column-types.js +14 -0
- package/dist/types/column-types.js.map +1 -0
- package/dist/types/custom-types.d.ts +85 -0
- package/dist/types/custom-types.d.ts.map +1 -0
- package/dist/types/custom-types.js +132 -0
- package/dist/types/custom-types.js.map +1 -0
- package/dist/types/enum-builder.d.ts +31 -0
- package/dist/types/enum-builder.d.ts.map +1 -0
- package/dist/types/enum-builder.js +46 -0
- package/dist/types/enum-builder.js.map +1 -0
- package/dist/types/metadata.d.ts +67 -0
- package/dist/types/metadata.d.ts.map +1 -0
- package/dist/types/metadata.js +57 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/type-mapper.d.ts +49 -0
- package/dist/types/type-mapper.d.ts.map +1 -0
- package/dist/types/type-mapper.js +49 -0
- package/dist/types/type-mapper.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GroupedSelectQueryBuilder = exports.GroupedQueryBuilder = void 0;
|
|
4
|
+
const conditions_1 = require("./conditions");
|
|
5
|
+
const subquery_1 = require("./subquery");
|
|
6
|
+
/**
|
|
7
|
+
* Create an aggregate field reference that can be used in conditions
|
|
8
|
+
*/
|
|
9
|
+
function createAggregateFieldRef(aggregateType, selector) {
|
|
10
|
+
return {
|
|
11
|
+
__fieldName: aggregateType.toLowerCase(),
|
|
12
|
+
__dbColumnName: aggregateType.toLowerCase(),
|
|
13
|
+
__isAggregate: true,
|
|
14
|
+
__aggregateType: aggregateType,
|
|
15
|
+
__aggregateSelector: selector,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Grouped query builder - result of calling groupBy()
|
|
20
|
+
* Provides type-safe access to grouping keys and aggregate functions
|
|
21
|
+
*/
|
|
22
|
+
class GroupedQueryBuilder {
|
|
23
|
+
constructor(schema, client, originalSelector, groupingKeySelector, whereCond, executor, manualJoins, joinCounter) {
|
|
24
|
+
this.orderByFields = [];
|
|
25
|
+
this.manualJoins = [];
|
|
26
|
+
this.joinCounter = 0;
|
|
27
|
+
this.schema = schema;
|
|
28
|
+
this.client = client;
|
|
29
|
+
this.originalSelector = originalSelector;
|
|
30
|
+
this.groupingKeySelector = groupingKeySelector;
|
|
31
|
+
this.whereCond = whereCond;
|
|
32
|
+
this.executor = executor;
|
|
33
|
+
this.manualJoins = manualJoins || [];
|
|
34
|
+
this.joinCounter = joinCounter || 0;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Select from grouped results
|
|
38
|
+
* The selector receives a GroupedItem with key and aggregate functions
|
|
39
|
+
*/
|
|
40
|
+
select(selector) {
|
|
41
|
+
return new GroupedSelectQueryBuilder(this.schema, this.client, this.originalSelector, this.groupingKeySelector, selector, this.whereCond, this.havingCond, this.limitValue, this.offsetValue, this.orderByFields, this.executor, this.manualJoins, this.joinCounter);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add HAVING condition (filter groups after aggregation)
|
|
45
|
+
*/
|
|
46
|
+
having(condition) {
|
|
47
|
+
const mockGroup = this.createMockGroupedItem();
|
|
48
|
+
this.havingCond = condition(mockGroup);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a mock GroupedItem for type inference and condition building
|
|
53
|
+
*/
|
|
54
|
+
createMockGroupedItem() {
|
|
55
|
+
// Create mock for the original row
|
|
56
|
+
const mockOriginalRow = this.createMockRow();
|
|
57
|
+
// Evaluate the grouping key selector to get the key structure
|
|
58
|
+
const mockKey = this.groupingKeySelector(mockOriginalRow);
|
|
59
|
+
return {
|
|
60
|
+
key: mockKey,
|
|
61
|
+
count: () => {
|
|
62
|
+
return createAggregateFieldRef('COUNT');
|
|
63
|
+
},
|
|
64
|
+
sum: (selector) => {
|
|
65
|
+
return createAggregateFieldRef('SUM', selector);
|
|
66
|
+
},
|
|
67
|
+
min: (selector) => {
|
|
68
|
+
return createAggregateFieldRef('MIN', selector);
|
|
69
|
+
},
|
|
70
|
+
max: (selector) => {
|
|
71
|
+
return createAggregateFieldRef('MAX', selector);
|
|
72
|
+
},
|
|
73
|
+
avg: (selector) => {
|
|
74
|
+
return createAggregateFieldRef('AVG', selector);
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create mock row for the original table
|
|
80
|
+
*/
|
|
81
|
+
createMockRow() {
|
|
82
|
+
const mock = {};
|
|
83
|
+
// Add columns as FieldRef objects
|
|
84
|
+
for (const [colName, colBuilder] of Object.entries(this.schema.columns)) {
|
|
85
|
+
const dbColumnName = colBuilder.build().name;
|
|
86
|
+
Object.defineProperty(mock, colName, {
|
|
87
|
+
get: () => ({
|
|
88
|
+
__fieldName: colName,
|
|
89
|
+
__dbColumnName: dbColumnName,
|
|
90
|
+
__tableAlias: this.schema.name,
|
|
91
|
+
}),
|
|
92
|
+
enumerable: true,
|
|
93
|
+
configurable: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Add columns from manually joined tables
|
|
97
|
+
for (const join of this.manualJoins) {
|
|
98
|
+
if (join.isSubquery || !join.schema) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
for (const [colName, colBuilder] of Object.entries(join.schema.columns)) {
|
|
102
|
+
const dbColumnName = colBuilder.build().name;
|
|
103
|
+
if (!mock[join.alias]) {
|
|
104
|
+
mock[join.alias] = {};
|
|
105
|
+
}
|
|
106
|
+
Object.defineProperty(mock[join.alias], colName, {
|
|
107
|
+
get: () => ({
|
|
108
|
+
__fieldName: colName,
|
|
109
|
+
__dbColumnName: dbColumnName,
|
|
110
|
+
__tableAlias: join.alias,
|
|
111
|
+
}),
|
|
112
|
+
enumerable: true,
|
|
113
|
+
configurable: true,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return mock;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.GroupedQueryBuilder = GroupedQueryBuilder;
|
|
121
|
+
/**
|
|
122
|
+
* Grouped select query builder - result of calling select() on a GroupedQueryBuilder
|
|
123
|
+
*/
|
|
124
|
+
class GroupedSelectQueryBuilder {
|
|
125
|
+
constructor(schema, client, originalSelector, groupingKeySelector, resultSelector, whereCond, havingCond, limit, offset, orderBy, executor, manualJoins, joinCounter) {
|
|
126
|
+
this.orderByFields = [];
|
|
127
|
+
this.manualJoins = [];
|
|
128
|
+
this.joinCounter = 0;
|
|
129
|
+
this.schema = schema;
|
|
130
|
+
this.client = client;
|
|
131
|
+
this.originalSelector = originalSelector;
|
|
132
|
+
this.groupingKeySelector = groupingKeySelector;
|
|
133
|
+
this.resultSelector = resultSelector;
|
|
134
|
+
this.whereCond = whereCond;
|
|
135
|
+
this.havingCond = havingCond;
|
|
136
|
+
this.limitValue = limit;
|
|
137
|
+
this.offsetValue = offset;
|
|
138
|
+
this.orderByFields = orderBy || [];
|
|
139
|
+
this.executor = executor;
|
|
140
|
+
this.manualJoins = manualJoins || [];
|
|
141
|
+
this.joinCounter = joinCounter || 0;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Add HAVING condition (filter groups after aggregation)
|
|
145
|
+
*/
|
|
146
|
+
having(condition) {
|
|
147
|
+
const mockGroup = this.createMockGroupedItem();
|
|
148
|
+
this.havingCond = condition(mockGroup);
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Limit results
|
|
153
|
+
*/
|
|
154
|
+
limit(count) {
|
|
155
|
+
this.limitValue = count;
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Offset results
|
|
160
|
+
*/
|
|
161
|
+
offset(count) {
|
|
162
|
+
this.offsetValue = count;
|
|
163
|
+
return this;
|
|
164
|
+
}
|
|
165
|
+
orderBy(selector) {
|
|
166
|
+
const mockGroup = this.createMockGroupedItem();
|
|
167
|
+
const mockResult = this.resultSelector(mockGroup);
|
|
168
|
+
const result = selector(mockResult);
|
|
169
|
+
// Handle array of [field, direction] tuples
|
|
170
|
+
if (Array.isArray(result) && result.length > 0 && Array.isArray(result[0])) {
|
|
171
|
+
for (const [fieldRef, direction] of result) {
|
|
172
|
+
if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
|
|
173
|
+
this.orderByFields.push({
|
|
174
|
+
field: fieldRef.__dbColumnName || fieldRef.__fieldName,
|
|
175
|
+
direction: direction || 'ASC'
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Handle array of fields (all ASC)
|
|
181
|
+
else if (Array.isArray(result)) {
|
|
182
|
+
for (const fieldRef of result) {
|
|
183
|
+
if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
|
|
184
|
+
this.orderByFields.push({
|
|
185
|
+
field: fieldRef.__dbColumnName || fieldRef.__fieldName,
|
|
186
|
+
direction: 'ASC'
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Handle single field
|
|
192
|
+
else if (result && typeof result === 'object' && '__fieldName' in result) {
|
|
193
|
+
this.orderByFields.push({
|
|
194
|
+
field: result.__dbColumnName || result.__fieldName,
|
|
195
|
+
direction: 'ASC'
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return this;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Execute query and return results
|
|
202
|
+
*/
|
|
203
|
+
async toList() {
|
|
204
|
+
const context = {
|
|
205
|
+
ctes: new Map(),
|
|
206
|
+
cteCounter: 0,
|
|
207
|
+
paramCounter: 1,
|
|
208
|
+
allParams: [],
|
|
209
|
+
};
|
|
210
|
+
const { sql, params } = this.buildQuery(context);
|
|
211
|
+
// Execute using executor if available, otherwise use client directly
|
|
212
|
+
const result = this.executor
|
|
213
|
+
? await this.executor.query(sql, params)
|
|
214
|
+
: await this.client.query(sql, params);
|
|
215
|
+
// Transform results: convert aggregate string values to numbers
|
|
216
|
+
return this.transformResults(result.rows);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Transform database results - convert aggregate values from strings to numbers
|
|
220
|
+
*/
|
|
221
|
+
transformResults(rows) {
|
|
222
|
+
// Get the mock result to identify which fields are aggregates
|
|
223
|
+
const mockGroup = this.createMockGroupedItem();
|
|
224
|
+
const mockResult = this.resultSelector(mockGroup);
|
|
225
|
+
return rows.map(row => {
|
|
226
|
+
const transformed = {};
|
|
227
|
+
for (const [key, value] of Object.entries(row)) {
|
|
228
|
+
const mockValue = mockResult[key];
|
|
229
|
+
// Check if this field is an aggregate
|
|
230
|
+
if (mockValue && typeof mockValue === 'object' && '__isAggregate' in mockValue && mockValue.__isAggregate) {
|
|
231
|
+
const aggType = mockValue.__aggregateType;
|
|
232
|
+
// Convert string to number for numeric aggregates
|
|
233
|
+
if (aggType === 'COUNT' || aggType === 'SUM' || aggType === 'AVG' || aggType === 'MIN' || aggType === 'MAX') {
|
|
234
|
+
transformed[key] = value === null ? null : Number(value);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
transformed[key] = value;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
// Non-aggregate field - keep as is
|
|
242
|
+
transformed[key] = value;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return transformed;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Execute query and return first result or null
|
|
250
|
+
*/
|
|
251
|
+
async first() {
|
|
252
|
+
const results = await this.limit(1).toList();
|
|
253
|
+
return results.length > 0 ? results[0] : null;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Execute query and return first result or throw
|
|
257
|
+
*/
|
|
258
|
+
async firstOrThrow() {
|
|
259
|
+
const result = await this.first();
|
|
260
|
+
if (!result) {
|
|
261
|
+
throw new Error('No results found');
|
|
262
|
+
}
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Convert to subquery for use in other queries
|
|
267
|
+
*/
|
|
268
|
+
asSubquery(mode = 'table') {
|
|
269
|
+
const sqlBuilder = (outerContext) => {
|
|
270
|
+
const context = {
|
|
271
|
+
ctes: new Map(),
|
|
272
|
+
cteCounter: 0,
|
|
273
|
+
paramCounter: outerContext.paramCounter,
|
|
274
|
+
allParams: outerContext.params,
|
|
275
|
+
};
|
|
276
|
+
const { sql } = this.buildQuery(context);
|
|
277
|
+
outerContext.paramCounter = context.paramCounter;
|
|
278
|
+
return sql;
|
|
279
|
+
};
|
|
280
|
+
return new subquery_1.Subquery(sqlBuilder, mode);
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Build the SQL query for grouped results
|
|
284
|
+
*/
|
|
285
|
+
buildQuery(context) {
|
|
286
|
+
// Create mocks for evaluation
|
|
287
|
+
const mockRow = this.createMockRow();
|
|
288
|
+
const mockOriginalSelection = this.originalSelector(mockRow);
|
|
289
|
+
const mockGroupingKey = this.groupingKeySelector(mockOriginalSelection);
|
|
290
|
+
const mockGroup = this.createMockGroupedItem();
|
|
291
|
+
const mockResult = this.resultSelector(mockGroup);
|
|
292
|
+
// Extract GROUP BY fields from the grouping key
|
|
293
|
+
const groupByFields = [];
|
|
294
|
+
for (const [key, value] of Object.entries(mockGroupingKey)) {
|
|
295
|
+
if (typeof value === 'object' && value !== null && '__dbColumnName' in value) {
|
|
296
|
+
const field = value;
|
|
297
|
+
const tableAlias = field.__tableAlias || this.schema.name;
|
|
298
|
+
groupByFields.push(`"${tableAlias}"."${field.__dbColumnName}"`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Build SELECT clause from result selector
|
|
302
|
+
const selectParts = [];
|
|
303
|
+
for (const [alias, value] of Object.entries(mockResult)) {
|
|
304
|
+
if (typeof value === 'object' && value !== null && '__isAggregate' in value && value.__isAggregate) {
|
|
305
|
+
// This is an AggregateFieldRef (from our mock GroupedItem)
|
|
306
|
+
const aggField = value;
|
|
307
|
+
const aggType = aggField.__aggregateType;
|
|
308
|
+
if (aggType === 'COUNT') {
|
|
309
|
+
// COUNT always returns bigint, cast to integer for cleaner results
|
|
310
|
+
selectParts.push(`CAST(COUNT(*) AS INTEGER) as "${alias}"`);
|
|
311
|
+
}
|
|
312
|
+
else if (aggField.__aggregateSelector) {
|
|
313
|
+
// SUM, MIN, MAX, AVG with selector
|
|
314
|
+
const mockOriginalRow = this.createMockRow();
|
|
315
|
+
const field = aggField.__aggregateSelector(mockOriginalRow);
|
|
316
|
+
if (typeof field === 'object' && field !== null && '__dbColumnName' in field) {
|
|
317
|
+
const fieldRef = field;
|
|
318
|
+
const tableAlias = fieldRef.__tableAlias || this.schema.name;
|
|
319
|
+
// Cast numeric aggregates to appropriate types
|
|
320
|
+
if (aggType === 'SUM' || aggType === 'AVG') {
|
|
321
|
+
// SUM and AVG return numeric - cast to double precision for JavaScript number
|
|
322
|
+
selectParts.push(`CAST(${aggType}("${tableAlias}"."${fieldRef.__dbColumnName}") AS DOUBLE PRECISION) as "${alias}"`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
// MIN/MAX preserve the field's type - no cast needed usually, but could be added if needed
|
|
326
|
+
selectParts.push(`${aggType}("${tableAlias}"."${fieldRef.__dbColumnName}") as "${alias}"`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
// Aggregate without selector (shouldn't happen for SUM/MIN/MAX/AVG, but handle it)
|
|
332
|
+
selectParts.push(`${aggType}(*) as "${alias}"`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
else if (typeof value === 'object' && value !== null && '__aggregateType' in value) {
|
|
336
|
+
// Backward compatibility: Old AggregateMarker style (if any still exist)
|
|
337
|
+
const agg = value;
|
|
338
|
+
if (agg.__aggregateType === 'COUNT') {
|
|
339
|
+
selectParts.push(`CAST(COUNT(*) AS INTEGER) as "${alias}"`);
|
|
340
|
+
}
|
|
341
|
+
else if (agg.__selector) {
|
|
342
|
+
const mockOriginalRow = this.createMockRow();
|
|
343
|
+
const field = agg.__selector(mockOriginalRow);
|
|
344
|
+
if (typeof field === 'object' && field !== null && '__dbColumnName' in field) {
|
|
345
|
+
const fieldRef = field;
|
|
346
|
+
const tableAlias = fieldRef.__tableAlias || this.schema.name;
|
|
347
|
+
if (agg.__aggregateType === 'SUM' || agg.__aggregateType === 'AVG') {
|
|
348
|
+
selectParts.push(`CAST(${agg.__aggregateType}("${tableAlias}"."${fieldRef.__dbColumnName}") AS DOUBLE PRECISION) as "${alias}"`);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
selectParts.push(`${agg.__aggregateType}("${tableAlias}"."${fieldRef.__dbColumnName}") as "${alias}"`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else if (typeof value === 'object' && value !== null && '__dbColumnName' in value) {
|
|
357
|
+
// Direct field reference from the grouping key
|
|
358
|
+
const field = value;
|
|
359
|
+
const tableAlias = field.__tableAlias || this.schema.name;
|
|
360
|
+
selectParts.push(`"${tableAlias}"."${field.__dbColumnName}" as "${alias}"`);
|
|
361
|
+
}
|
|
362
|
+
else if (value instanceof conditions_1.SqlFragment) {
|
|
363
|
+
// SQL fragment
|
|
364
|
+
const sqlBuildContext = {
|
|
365
|
+
paramCounter: context.paramCounter,
|
|
366
|
+
params: context.allParams,
|
|
367
|
+
};
|
|
368
|
+
const fragmentSql = value.buildSql(sqlBuildContext);
|
|
369
|
+
context.paramCounter = sqlBuildContext.paramCounter;
|
|
370
|
+
selectParts.push(`${fragmentSql} as "${alias}"`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Build FROM clause with JOINs
|
|
374
|
+
let fromClause = `FROM "${this.schema.name}"`;
|
|
375
|
+
// Add manual JOINs
|
|
376
|
+
for (const manualJoin of this.manualJoins) {
|
|
377
|
+
const joinTypeStr = manualJoin.type === 'INNER' ? 'INNER JOIN' : 'LEFT JOIN';
|
|
378
|
+
const condBuilder = new conditions_1.ConditionBuilder();
|
|
379
|
+
const { sql: condSql, params: condParams } = condBuilder.build(manualJoin.condition, context.paramCounter);
|
|
380
|
+
context.paramCounter += condParams.length;
|
|
381
|
+
context.allParams.push(...condParams);
|
|
382
|
+
// Check if this is a subquery join
|
|
383
|
+
if (manualJoin.isSubquery && manualJoin.subquery) {
|
|
384
|
+
const subqueryBuildContext = {
|
|
385
|
+
paramCounter: context.paramCounter,
|
|
386
|
+
params: context.allParams,
|
|
387
|
+
};
|
|
388
|
+
const subquerySql = manualJoin.subquery.buildSql(subqueryBuildContext);
|
|
389
|
+
context.paramCounter = subqueryBuildContext.paramCounter;
|
|
390
|
+
fromClause += `\n${joinTypeStr} (${subquerySql}) AS "${manualJoin.alias}" ON ${condSql}`;
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
fromClause += `\n${joinTypeStr} "${manualJoin.table}" AS "${manualJoin.alias}" ON ${condSql}`;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// Build WHERE clause
|
|
397
|
+
let whereClause = '';
|
|
398
|
+
if (this.whereCond) {
|
|
399
|
+
const condBuilder = new conditions_1.ConditionBuilder();
|
|
400
|
+
const { sql, params } = condBuilder.build(this.whereCond, context.paramCounter);
|
|
401
|
+
whereClause = `WHERE ${sql}`;
|
|
402
|
+
context.paramCounter += params.length;
|
|
403
|
+
context.allParams.push(...params);
|
|
404
|
+
}
|
|
405
|
+
// Build GROUP BY clause
|
|
406
|
+
const groupByClause = `GROUP BY ${groupByFields.join(', ')}`;
|
|
407
|
+
// Build HAVING clause
|
|
408
|
+
let havingClause = '';
|
|
409
|
+
if (this.havingCond) {
|
|
410
|
+
// Build the HAVING condition, but we need to substitute aggregate markers with actual SQL
|
|
411
|
+
const havingSql = this.buildHavingCondition(this.havingCond, context);
|
|
412
|
+
havingClause = `HAVING ${havingSql}`;
|
|
413
|
+
}
|
|
414
|
+
// Build ORDER BY clause
|
|
415
|
+
let orderByClause = '';
|
|
416
|
+
if (this.orderByFields.length > 0) {
|
|
417
|
+
const orderParts = this.orderByFields.map(({ field, direction }) => `"${field}" ${direction}`);
|
|
418
|
+
orderByClause = `ORDER BY ${orderParts.join(', ')}`;
|
|
419
|
+
}
|
|
420
|
+
// Build LIMIT/OFFSET
|
|
421
|
+
let limitClause = '';
|
|
422
|
+
if (this.limitValue !== undefined) {
|
|
423
|
+
limitClause = `LIMIT ${this.limitValue}`;
|
|
424
|
+
}
|
|
425
|
+
if (this.offsetValue !== undefined) {
|
|
426
|
+
limitClause += ` OFFSET ${this.offsetValue}`;
|
|
427
|
+
}
|
|
428
|
+
const finalQuery = `SELECT ${selectParts.join(', ')}\n${fromClause}\n${whereClause}\n${groupByClause}\n${havingClause}\n${orderByClause}\n${limitClause}`.trim();
|
|
429
|
+
return {
|
|
430
|
+
sql: finalQuery,
|
|
431
|
+
params: context.allParams,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Create mock row for the original table
|
|
436
|
+
*/
|
|
437
|
+
createMockRow() {
|
|
438
|
+
const mock = {};
|
|
439
|
+
// Add columns as FieldRef objects
|
|
440
|
+
for (const [colName, colBuilder] of Object.entries(this.schema.columns)) {
|
|
441
|
+
const dbColumnName = colBuilder.build().name;
|
|
442
|
+
Object.defineProperty(mock, colName, {
|
|
443
|
+
get: () => ({
|
|
444
|
+
__fieldName: colName,
|
|
445
|
+
__dbColumnName: dbColumnName,
|
|
446
|
+
__tableAlias: this.schema.name,
|
|
447
|
+
}),
|
|
448
|
+
enumerable: true,
|
|
449
|
+
configurable: true,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
// Add columns from manually joined tables
|
|
453
|
+
for (const join of this.manualJoins) {
|
|
454
|
+
if (join.isSubquery || !join.schema) {
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
for (const [colName, colBuilder] of Object.entries(join.schema.columns)) {
|
|
458
|
+
const dbColumnName = colBuilder.build().name;
|
|
459
|
+
if (!mock[join.alias]) {
|
|
460
|
+
mock[join.alias] = {};
|
|
461
|
+
}
|
|
462
|
+
Object.defineProperty(mock[join.alias], colName, {
|
|
463
|
+
get: () => ({
|
|
464
|
+
__fieldName: colName,
|
|
465
|
+
__dbColumnName: dbColumnName,
|
|
466
|
+
__tableAlias: join.alias,
|
|
467
|
+
}),
|
|
468
|
+
enumerable: true,
|
|
469
|
+
configurable: true,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return mock;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Create a mock GroupedItem for type inference
|
|
477
|
+
*/
|
|
478
|
+
createMockGroupedItem() {
|
|
479
|
+
const mockRow = this.createMockRow();
|
|
480
|
+
const mockOriginalSelection = this.originalSelector(mockRow);
|
|
481
|
+
const mockKey = this.groupingKeySelector(mockOriginalSelection);
|
|
482
|
+
return {
|
|
483
|
+
key: mockKey,
|
|
484
|
+
count: () => {
|
|
485
|
+
return createAggregateFieldRef('COUNT');
|
|
486
|
+
},
|
|
487
|
+
sum: (selector) => {
|
|
488
|
+
return createAggregateFieldRef('SUM', selector);
|
|
489
|
+
},
|
|
490
|
+
min: (selector) => {
|
|
491
|
+
return createAggregateFieldRef('MIN', selector);
|
|
492
|
+
},
|
|
493
|
+
max: (selector) => {
|
|
494
|
+
return createAggregateFieldRef('MAX', selector);
|
|
495
|
+
},
|
|
496
|
+
avg: (selector) => {
|
|
497
|
+
return createAggregateFieldRef('AVG', selector);
|
|
498
|
+
},
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Build HAVING condition SQL - handles aggregate field refs specially
|
|
503
|
+
*/
|
|
504
|
+
buildHavingCondition(condition, context) {
|
|
505
|
+
// Replace aggregate field refs with SQL fragments in the condition
|
|
506
|
+
const transformedCondition = this.transformHavingCondition(condition);
|
|
507
|
+
// Now build the condition normally
|
|
508
|
+
const condBuilder = new conditions_1.ConditionBuilder();
|
|
509
|
+
const { sql, params } = condBuilder.build(transformedCondition, context.paramCounter);
|
|
510
|
+
context.paramCounter += params.length;
|
|
511
|
+
context.allParams.push(...params);
|
|
512
|
+
return sql;
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Transform a HAVING condition by replacing aggregate field refs with SQL fragments
|
|
516
|
+
*/
|
|
517
|
+
transformHavingCondition(condition) {
|
|
518
|
+
// If the condition has field references, check if they're aggregate refs
|
|
519
|
+
const cond = condition;
|
|
520
|
+
// Handle different condition types
|
|
521
|
+
if (cond.field && typeof cond.field === 'object' && '__isAggregate' in cond.field) {
|
|
522
|
+
// This is an aggregate comparison (e.g., COUNT(*) > 5)
|
|
523
|
+
const aggField = cond.field;
|
|
524
|
+
const aggSql = this.buildAggregateFieldSql(aggField);
|
|
525
|
+
// Create a new SQL fragment condition
|
|
526
|
+
// Since we can't easily replace the field, we'll create a SqlFragment
|
|
527
|
+
// that represents the whole expression
|
|
528
|
+
const operator = this.getOperatorForCondition(cond);
|
|
529
|
+
const value = cond.value;
|
|
530
|
+
// Build the full comparison SQL using SqlFragment's template literal style
|
|
531
|
+
// SqlFragment expects an array of strings (the template parts) and an array of values
|
|
532
|
+
return new conditions_1.SqlFragment([`${aggSql} ${operator} `, ''], [value]);
|
|
533
|
+
}
|
|
534
|
+
return condition;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Build SQL for an aggregate field reference
|
|
538
|
+
*/
|
|
539
|
+
buildAggregateFieldSql(aggField) {
|
|
540
|
+
const aggType = aggField.__aggregateType;
|
|
541
|
+
if (aggType === 'COUNT') {
|
|
542
|
+
return 'COUNT(*)';
|
|
543
|
+
}
|
|
544
|
+
else if (aggField.__aggregateSelector) {
|
|
545
|
+
// Evaluate the selector to get the actual field
|
|
546
|
+
const mockRow = this.createMockRow();
|
|
547
|
+
const selectedField = aggField.__aggregateSelector(mockRow);
|
|
548
|
+
if (typeof selectedField === 'object' && selectedField !== null && '__dbColumnName' in selectedField) {
|
|
549
|
+
const field = selectedField;
|
|
550
|
+
const tableAlias = field.__tableAlias || this.schema.name;
|
|
551
|
+
return `${aggType}("${tableAlias}"."${field.__dbColumnName}")`;
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
return `${aggType}(*)`;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
return `${aggType}(*)`;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Get the operator string from a condition object
|
|
563
|
+
*/
|
|
564
|
+
getOperatorForCondition(cond) {
|
|
565
|
+
// Try to get the operator - this is a bit of a hack
|
|
566
|
+
// Different condition types have different ways to get the operator
|
|
567
|
+
if (cond.getOperator && typeof cond.getOperator === 'function') {
|
|
568
|
+
return cond.getOperator();
|
|
569
|
+
}
|
|
570
|
+
// Map common condition types to operators
|
|
571
|
+
const condName = cond.constructor?.name || '';
|
|
572
|
+
if (condName.includes('Eq'))
|
|
573
|
+
return '=';
|
|
574
|
+
if (condName.includes('Ne'))
|
|
575
|
+
return '!=';
|
|
576
|
+
if (condName.includes('Gt') && !condName.includes('Gte'))
|
|
577
|
+
return '>';
|
|
578
|
+
if (condName.includes('Gte'))
|
|
579
|
+
return '>=';
|
|
580
|
+
if (condName.includes('Lt') && !condName.includes('Lte'))
|
|
581
|
+
return '<';
|
|
582
|
+
if (condName.includes('Lte'))
|
|
583
|
+
return '<=';
|
|
584
|
+
return '='; // Default fallback
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
exports.GroupedSelectQueryBuilder = GroupedSelectQueryBuilder;
|
|
588
|
+
//# sourceMappingURL=grouped-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouped-query.js","sourceRoot":"","sources":["../../src/query/grouped-query.ts"],"names":[],"mappings":"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"}
|