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,106 @@
|
|
|
1
|
+
import { Condition } from './conditions';
|
|
2
|
+
import { TableSchema } from '../schema/table-builder';
|
|
3
|
+
import type { DatabaseClient } from '../database/database-client.interface';
|
|
4
|
+
import type { QueryExecutor } from '../entity/db-context';
|
|
5
|
+
/**
|
|
6
|
+
* Join type
|
|
7
|
+
*/
|
|
8
|
+
export type JoinType = 'INNER' | 'LEFT';
|
|
9
|
+
/**
|
|
10
|
+
* Join definition
|
|
11
|
+
*/
|
|
12
|
+
export interface JoinDefinition {
|
|
13
|
+
type: JoinType;
|
|
14
|
+
table: string;
|
|
15
|
+
alias: string;
|
|
16
|
+
schema: TableSchema;
|
|
17
|
+
condition: Condition;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Query context for join queries
|
|
21
|
+
*/
|
|
22
|
+
export interface JoinQueryContext {
|
|
23
|
+
paramCounter: number;
|
|
24
|
+
allParams: any[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Join query builder with strong typing for joined tables
|
|
28
|
+
*/
|
|
29
|
+
export declare class JoinQueryBuilder<TLeft, TRight> {
|
|
30
|
+
private leftSchema;
|
|
31
|
+
private leftAlias;
|
|
32
|
+
private rightSchema;
|
|
33
|
+
private rightAlias;
|
|
34
|
+
private joinType;
|
|
35
|
+
private joinCondition;
|
|
36
|
+
private client;
|
|
37
|
+
private joins;
|
|
38
|
+
private selection?;
|
|
39
|
+
private whereCond?;
|
|
40
|
+
private limitValue?;
|
|
41
|
+
private offsetValue?;
|
|
42
|
+
private orderByFields;
|
|
43
|
+
private executor?;
|
|
44
|
+
constructor(leftSchema: TableSchema, leftAlias: string, rightSchema: TableSchema, rightAlias: string, joinType: JoinType, joinCondition: Condition, client: DatabaseClient, executor?: QueryExecutor);
|
|
45
|
+
/**
|
|
46
|
+
* Add another left join
|
|
47
|
+
*/
|
|
48
|
+
leftJoin<TThird>(rightTable: {
|
|
49
|
+
_schema: TableSchema;
|
|
50
|
+
_alias: string;
|
|
51
|
+
}, condition: (left: TLeft, right: TRight, third: TThird) => Condition, selector: (left: TLeft, right: TRight, third: TThird) => any): any;
|
|
52
|
+
/**
|
|
53
|
+
* Add another inner join
|
|
54
|
+
*/
|
|
55
|
+
innerJoin<TThird>(rightTable: {
|
|
56
|
+
_schema: TableSchema;
|
|
57
|
+
_alias: string;
|
|
58
|
+
}, condition: (left: TLeft, right: TRight, third: TThird) => Condition, selector: (left: TLeft, right: TRight, third: TThird) => any): any;
|
|
59
|
+
/**
|
|
60
|
+
* Add WHERE condition
|
|
61
|
+
*/
|
|
62
|
+
where(condition: (left: TLeft, right: TRight) => Condition): this;
|
|
63
|
+
/**
|
|
64
|
+
* Limit results
|
|
65
|
+
*/
|
|
66
|
+
limit(count: number): this;
|
|
67
|
+
/**
|
|
68
|
+
* Offset results
|
|
69
|
+
*/
|
|
70
|
+
offset(count: number): this;
|
|
71
|
+
/**
|
|
72
|
+
* Order by field(s) from joined tables
|
|
73
|
+
* @example
|
|
74
|
+
* .orderBy((l, r) => l.colName)
|
|
75
|
+
* .orderBy((l, r) => [l.colName, r.otherCol])
|
|
76
|
+
* .orderBy((l, r) => [[l.colName, 'ASC'], [r.otherCol, 'DESC']])
|
|
77
|
+
*/
|
|
78
|
+
orderBy(selector: (left: TLeft, right: TRight) => any): this;
|
|
79
|
+
orderBy(selector: (left: TLeft, right: TRight) => any[]): this;
|
|
80
|
+
orderBy(selector: (left: TLeft, right: TRight) => Array<[any, 'ASC' | 'DESC']>): this;
|
|
81
|
+
/**
|
|
82
|
+
* Execute query and return results
|
|
83
|
+
*/
|
|
84
|
+
toList(): Promise<any[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Execute query and return first result or null
|
|
87
|
+
*/
|
|
88
|
+
first(): Promise<any | null>;
|
|
89
|
+
/**
|
|
90
|
+
* Execute query and return first result or throw
|
|
91
|
+
*/
|
|
92
|
+
firstOrThrow(): Promise<any>;
|
|
93
|
+
/**
|
|
94
|
+
* Set the selection (called internally)
|
|
95
|
+
*/
|
|
96
|
+
_setSelection(selector: (left: TLeft, right: TRight) => any): void;
|
|
97
|
+
/**
|
|
98
|
+
* Create mock row for a table
|
|
99
|
+
*/
|
|
100
|
+
private createMockRow;
|
|
101
|
+
/**
|
|
102
|
+
* Build SQL query for the join
|
|
103
|
+
*/
|
|
104
|
+
private buildQuery;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=join-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-builder.d.ts","sourceRoot":"","sources":["../../src/query/join-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,GAAG,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAUvC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,MAAM;IAfhB,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAsC;IACxD,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA0E;IAC/F,OAAO,CAAC,QAAQ,CAAC,CAAgB;gBAGvB,UAAU,EAAE,WAAW,EACvB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE,cAAc,EAC9B,QAAQ,CAAC,EAAE,aAAa;IAc1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EACb,UAAU,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EACpD,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,EACnE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,GAC3D,GAAG;IAMN;;OAEG;IACH,SAAS,CAAC,MAAM,EACd,UAAU,EAAE;QAAE,OAAO,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EACpD,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,EACnE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,GAC3D,GAAG;IAIN;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,IAAI;IAOjE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,GAAG,IAAI;IAC5D,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI;IAC9D,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI;IA0CrF;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAqB9B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAKlC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IAQlC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,GAAG,IAAI;IAIlE;;OAEG;IACH,OAAO,CAAC,aAAa;IA2DrB;;OAEG;IACH,OAAO,CAAC,UAAU;CA+EnB"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JoinQueryBuilder = void 0;
|
|
4
|
+
const conditions_1 = require("./conditions");
|
|
5
|
+
/**
|
|
6
|
+
* Join query builder with strong typing for joined tables
|
|
7
|
+
*/
|
|
8
|
+
class JoinQueryBuilder {
|
|
9
|
+
constructor(leftSchema, leftAlias, rightSchema, rightAlias, joinType, joinCondition, client, executor) {
|
|
10
|
+
this.leftSchema = leftSchema;
|
|
11
|
+
this.leftAlias = leftAlias;
|
|
12
|
+
this.rightSchema = rightSchema;
|
|
13
|
+
this.rightAlias = rightAlias;
|
|
14
|
+
this.joinType = joinType;
|
|
15
|
+
this.joinCondition = joinCondition;
|
|
16
|
+
this.client = client;
|
|
17
|
+
this.joins = [];
|
|
18
|
+
this.orderByFields = [];
|
|
19
|
+
this.executor = executor;
|
|
20
|
+
// Store the first join
|
|
21
|
+
this.joins.push({
|
|
22
|
+
type: joinType,
|
|
23
|
+
table: rightSchema.name,
|
|
24
|
+
alias: rightAlias,
|
|
25
|
+
schema: rightSchema,
|
|
26
|
+
condition: joinCondition,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Add another left join
|
|
31
|
+
*/
|
|
32
|
+
leftJoin(rightTable, condition, selector) {
|
|
33
|
+
// This would require extending the type parameters dynamically
|
|
34
|
+
// For now, we'll support chaining up to 2 joins
|
|
35
|
+
throw new Error('Additional joins not yet implemented. Use the final selector after the first join.');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Add another inner join
|
|
39
|
+
*/
|
|
40
|
+
innerJoin(rightTable, condition, selector) {
|
|
41
|
+
throw new Error('Additional joins not yet implemented. Use the final selector after the first join.');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Add WHERE condition
|
|
45
|
+
*/
|
|
46
|
+
where(condition) {
|
|
47
|
+
const mockLeft = this.createMockRow(this.leftSchema, this.leftAlias);
|
|
48
|
+
const mockRight = this.createMockRow(this.rightSchema, this.rightAlias);
|
|
49
|
+
this.whereCond = condition(mockLeft, mockRight);
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Limit results
|
|
54
|
+
*/
|
|
55
|
+
limit(count) {
|
|
56
|
+
this.limitValue = count;
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Offset results
|
|
61
|
+
*/
|
|
62
|
+
offset(count) {
|
|
63
|
+
this.offsetValue = count;
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
orderBy(selector) {
|
|
67
|
+
const mockLeft = this.createMockRow(this.leftSchema, this.leftAlias);
|
|
68
|
+
const mockRight = this.createMockRow(this.rightSchema, this.rightAlias);
|
|
69
|
+
const result = selector(mockLeft, mockRight);
|
|
70
|
+
// Handle array of [field, direction] tuples
|
|
71
|
+
if (Array.isArray(result) && result.length > 0 && Array.isArray(result[0])) {
|
|
72
|
+
for (const [fieldRef, direction] of result) {
|
|
73
|
+
if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
|
|
74
|
+
this.orderByFields.push({
|
|
75
|
+
table: fieldRef.__tableAlias || this.leftAlias,
|
|
76
|
+
field: fieldRef.__dbColumnName || fieldRef.__fieldName,
|
|
77
|
+
direction: direction || 'ASC'
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Handle array of fields (all ASC)
|
|
83
|
+
else if (Array.isArray(result)) {
|
|
84
|
+
for (const fieldRef of result) {
|
|
85
|
+
if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
|
|
86
|
+
this.orderByFields.push({
|
|
87
|
+
table: fieldRef.__tableAlias || this.leftAlias,
|
|
88
|
+
field: fieldRef.__dbColumnName || fieldRef.__fieldName,
|
|
89
|
+
direction: 'ASC'
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Handle single field
|
|
95
|
+
else if (result && typeof result === 'object' && '__fieldName' in result) {
|
|
96
|
+
this.orderByFields.push({
|
|
97
|
+
table: result.__tableAlias || this.leftAlias,
|
|
98
|
+
field: result.__dbColumnName || result.__fieldName,
|
|
99
|
+
direction: 'ASC'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Execute query and return results
|
|
106
|
+
*/
|
|
107
|
+
async toList() {
|
|
108
|
+
if (!this.selection) {
|
|
109
|
+
throw new Error('Selection is required. Call the join method with a selector.');
|
|
110
|
+
}
|
|
111
|
+
const context = {
|
|
112
|
+
paramCounter: 1,
|
|
113
|
+
allParams: [],
|
|
114
|
+
};
|
|
115
|
+
// Build the query
|
|
116
|
+
const { sql, params } = this.buildQuery(context);
|
|
117
|
+
// Execute using executor if available (for logging), otherwise use client directly
|
|
118
|
+
const result = this.executor
|
|
119
|
+
? await this.executor.query(sql, params)
|
|
120
|
+
: await this.client.query(sql, params);
|
|
121
|
+
return result.rows;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Execute query and return first result or null
|
|
125
|
+
*/
|
|
126
|
+
async first() {
|
|
127
|
+
const results = await this.limit(1).toList();
|
|
128
|
+
return results.length > 0 ? results[0] : null;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Execute query and return first result or throw
|
|
132
|
+
*/
|
|
133
|
+
async firstOrThrow() {
|
|
134
|
+
const result = await this.first();
|
|
135
|
+
if (!result) {
|
|
136
|
+
throw new Error('No results found');
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Set the selection (called internally)
|
|
142
|
+
*/
|
|
143
|
+
_setSelection(selector) {
|
|
144
|
+
this.selection = selector;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create mock row for a table
|
|
148
|
+
*/
|
|
149
|
+
createMockRow(schema, alias) {
|
|
150
|
+
const mock = {};
|
|
151
|
+
// Add columns as FieldRef objects
|
|
152
|
+
for (const [colName, colBuilder] of Object.entries(schema.columns)) {
|
|
153
|
+
const dbColumnName = colBuilder.build().name;
|
|
154
|
+
Object.defineProperty(mock, colName, {
|
|
155
|
+
get: () => ({
|
|
156
|
+
__fieldName: colName,
|
|
157
|
+
__dbColumnName: dbColumnName,
|
|
158
|
+
__tableAlias: alias,
|
|
159
|
+
}),
|
|
160
|
+
enumerable: true,
|
|
161
|
+
configurable: true,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
// Add navigation properties for nested joins
|
|
165
|
+
for (const [relName, relConfig] of Object.entries(schema.relations)) {
|
|
166
|
+
if (relConfig.type === 'one') {
|
|
167
|
+
Object.defineProperty(mock, relName, {
|
|
168
|
+
get: () => {
|
|
169
|
+
const targetSchema = relConfig.targetTableBuilder?.build();
|
|
170
|
+
if (!targetSchema) {
|
|
171
|
+
// Fallback proxy
|
|
172
|
+
return new Proxy({}, {
|
|
173
|
+
get: (target, prop) => ({
|
|
174
|
+
__fieldName: prop,
|
|
175
|
+
__dbColumnName: prop,
|
|
176
|
+
__tableAlias: `${alias}_${relName}`,
|
|
177
|
+
})
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const nestedMock = {};
|
|
181
|
+
for (const [nestedColName, nestedColBuilder] of Object.entries(targetSchema.columns)) {
|
|
182
|
+
const nestedDbColumnName = nestedColBuilder.build().name;
|
|
183
|
+
Object.defineProperty(nestedMock, nestedColName, {
|
|
184
|
+
get: () => ({
|
|
185
|
+
__fieldName: nestedColName,
|
|
186
|
+
__dbColumnName: nestedDbColumnName,
|
|
187
|
+
__tableAlias: `${alias}_${relName}`,
|
|
188
|
+
__navigationPath: [alias, relName],
|
|
189
|
+
}),
|
|
190
|
+
enumerable: true,
|
|
191
|
+
configurable: true,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return nestedMock;
|
|
195
|
+
},
|
|
196
|
+
enumerable: true,
|
|
197
|
+
configurable: true,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return mock;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Build SQL query for the join
|
|
205
|
+
*/
|
|
206
|
+
buildQuery(context) {
|
|
207
|
+
if (!this.selection) {
|
|
208
|
+
throw new Error('Selection is required');
|
|
209
|
+
}
|
|
210
|
+
const selectParts = [];
|
|
211
|
+
// Analyze the selection
|
|
212
|
+
const mockLeft = this.createMockRow(this.leftSchema, this.leftAlias);
|
|
213
|
+
const mockRight = this.createMockRow(this.rightSchema, this.rightAlias);
|
|
214
|
+
const selectedFields = this.selection(mockLeft, mockRight);
|
|
215
|
+
// Process selection
|
|
216
|
+
for (const [key, value] of Object.entries(selectedFields)) {
|
|
217
|
+
if (typeof value === 'object' && value !== null && '__dbColumnName' in value) {
|
|
218
|
+
// FieldRef object
|
|
219
|
+
const tableAlias = value.__tableAlias || this.leftAlias;
|
|
220
|
+
selectParts.push(`"${tableAlias}"."${value.__dbColumnName}" as "${key}"`);
|
|
221
|
+
}
|
|
222
|
+
else if (typeof value === 'string') {
|
|
223
|
+
// Simple column reference
|
|
224
|
+
selectParts.push(`"${this.leftAlias}"."${value}" as "${key}"`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Literal value
|
|
228
|
+
selectParts.push(`$${context.paramCounter++} as "${key}"`);
|
|
229
|
+
context.allParams.push(value);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Build FROM clause
|
|
233
|
+
let fromClause = `FROM "${this.leftSchema.name}" AS "${this.leftAlias}"`;
|
|
234
|
+
// Add JOINs
|
|
235
|
+
for (const join of this.joins) {
|
|
236
|
+
const joinType = join.type === 'INNER' ? 'INNER JOIN' : 'LEFT JOIN';
|
|
237
|
+
// Build ON condition
|
|
238
|
+
const condBuilder = new conditions_1.ConditionBuilder();
|
|
239
|
+
const { sql: condSql, params: condParams } = condBuilder.build(join.condition, context.paramCounter);
|
|
240
|
+
context.paramCounter += condParams.length;
|
|
241
|
+
context.allParams.push(...condParams);
|
|
242
|
+
fromClause += `\n${joinType} "${join.table}" AS "${join.alias}" ON ${condSql}`;
|
|
243
|
+
}
|
|
244
|
+
// Build WHERE clause
|
|
245
|
+
let whereClause = '';
|
|
246
|
+
if (this.whereCond) {
|
|
247
|
+
const condBuilder = new conditions_1.ConditionBuilder();
|
|
248
|
+
const { sql, params } = condBuilder.build(this.whereCond, context.paramCounter);
|
|
249
|
+
whereClause = `WHERE ${sql}`;
|
|
250
|
+
context.paramCounter += params.length;
|
|
251
|
+
context.allParams.push(...params);
|
|
252
|
+
}
|
|
253
|
+
// Build ORDER BY clause
|
|
254
|
+
let orderByClause = '';
|
|
255
|
+
if (this.orderByFields.length > 0) {
|
|
256
|
+
const orderParts = this.orderByFields.map(({ table, field, direction }) => `"${table}"."${field}" ${direction}`);
|
|
257
|
+
orderByClause = `ORDER BY ${orderParts.join(', ')}`;
|
|
258
|
+
}
|
|
259
|
+
// Build LIMIT/OFFSET
|
|
260
|
+
let limitClause = '';
|
|
261
|
+
if (this.limitValue !== undefined) {
|
|
262
|
+
limitClause = `LIMIT ${this.limitValue}`;
|
|
263
|
+
}
|
|
264
|
+
if (this.offsetValue !== undefined) {
|
|
265
|
+
limitClause += ` OFFSET ${this.offsetValue}`;
|
|
266
|
+
}
|
|
267
|
+
const finalQuery = `SELECT ${selectParts.join(', ')}\n${fromClause}\n${whereClause}\n${orderByClause}\n${limitClause}`.trim();
|
|
268
|
+
return {
|
|
269
|
+
sql: finalQuery,
|
|
270
|
+
params: context.allParams,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.JoinQueryBuilder = JoinQueryBuilder;
|
|
275
|
+
//# sourceMappingURL=join-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-builder.js","sourceRoot":"","sources":["../../src/query/join-builder.ts"],"names":[],"mappings":"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"}
|