@decaf-ts/for-typeorm 0.0.6
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.md +21 -0
- package/README.md +93 -0
- package/dist/for-typeorm.cjs +2553 -0
- package/dist/for-typeorm.esm.cjs +2538 -0
- package/lib/TypeORMAdapter.cjs +1129 -0
- package/lib/TypeORMAdapter.d.ts +221 -0
- package/lib/TypeORMDispatch.cjs +134 -0
- package/lib/TypeORMDispatch.d.ts +87 -0
- package/lib/TypeORMEventSubscriber.cjs +96 -0
- package/lib/TypeORMEventSubscriber.d.ts +56 -0
- package/lib/TypeORMRepository.cjs +209 -0
- package/lib/TypeORMRepository.d.ts +125 -0
- package/lib/constants.cjs +43 -0
- package/lib/constants.d.ts +39 -0
- package/lib/errors.cjs +28 -0
- package/lib/errors.d.ts +21 -0
- package/lib/esm/TypeORMAdapter.d.ts +221 -0
- package/lib/esm/TypeORMAdapter.js +1124 -0
- package/lib/esm/TypeORMDispatch.d.ts +87 -0
- package/lib/esm/TypeORMDispatch.js +130 -0
- package/lib/esm/TypeORMEventSubscriber.d.ts +56 -0
- package/lib/esm/TypeORMEventSubscriber.js +93 -0
- package/lib/esm/TypeORMRepository.d.ts +125 -0
- package/lib/esm/TypeORMRepository.js +206 -0
- package/lib/esm/constants.d.ts +39 -0
- package/lib/esm/constants.js +40 -0
- package/lib/esm/errors.d.ts +21 -0
- package/lib/esm/errors.js +24 -0
- package/lib/esm/index.d.ts +22 -0
- package/lib/esm/index.js +25 -0
- package/lib/esm/indexes/generator.d.ts +50 -0
- package/lib/esm/indexes/generator.js +95 -0
- package/lib/esm/indexes/index.d.ts +1 -0
- package/lib/esm/indexes/index.js +2 -0
- package/lib/esm/overrides/Column.d.ts +74 -0
- package/lib/esm/overrides/Column.js +70 -0
- package/lib/esm/overrides/CreateDateColumn.d.ts +2 -0
- package/lib/esm/overrides/CreateDateColumn.js +9 -0
- package/lib/esm/overrides/Entity.d.ts +11 -0
- package/lib/esm/overrides/Entity.js +28 -0
- package/lib/esm/overrides/PrimaryColumn.d.ts +20 -0
- package/lib/esm/overrides/PrimaryColumn.js +53 -0
- package/lib/esm/overrides/PrimaryGeneratedColumn.d.ts +24 -0
- package/lib/esm/overrides/PrimaryGeneratedColumn.js +51 -0
- package/lib/esm/overrides/UpdateDateColumn.d.ts +2 -0
- package/lib/esm/overrides/UpdateDateColumn.js +9 -0
- package/lib/esm/overrides/utils.d.ts +2 -0
- package/lib/esm/overrides/utils.js +29 -0
- package/lib/esm/query/Paginator.d.ts +86 -0
- package/lib/esm/query/Paginator.js +124 -0
- package/lib/esm/query/Statement.d.ts +131 -0
- package/lib/esm/query/Statement.js +242 -0
- package/lib/esm/query/constants.d.ts +52 -0
- package/lib/esm/query/constants.js +74 -0
- package/lib/esm/query/index.d.ts +4 -0
- package/lib/esm/query/index.js +5 -0
- package/lib/esm/query/translate.d.ts +34 -0
- package/lib/esm/query/translate.js +42 -0
- package/lib/esm/raw/postgres.d.ts +36 -0
- package/lib/esm/raw/postgres.js +2 -0
- package/lib/esm/sequences/Sequence.d.ts +67 -0
- package/lib/esm/sequences/Sequence.js +117 -0
- package/lib/esm/sequences/index.d.ts +1 -0
- package/lib/esm/sequences/index.js +2 -0
- package/lib/esm/types.d.ts +67 -0
- package/lib/esm/types.js +28 -0
- package/lib/esm/utils.d.ts +16 -0
- package/lib/esm/utils.js +29 -0
- package/lib/index.cjs +42 -0
- package/lib/index.d.ts +22 -0
- package/lib/indexes/generator.cjs +98 -0
- package/lib/indexes/generator.d.ts +50 -0
- package/lib/indexes/index.cjs +18 -0
- package/lib/indexes/index.d.ts +1 -0
- package/lib/overrides/Column.cjs +73 -0
- package/lib/overrides/Column.d.ts +74 -0
- package/lib/overrides/CreateDateColumn.cjs +12 -0
- package/lib/overrides/CreateDateColumn.d.ts +2 -0
- package/lib/overrides/Entity.cjs +31 -0
- package/lib/overrides/Entity.d.ts +11 -0
- package/lib/overrides/PrimaryColumn.cjs +56 -0
- package/lib/overrides/PrimaryColumn.d.ts +20 -0
- package/lib/overrides/PrimaryGeneratedColumn.cjs +54 -0
- package/lib/overrides/PrimaryGeneratedColumn.d.ts +24 -0
- package/lib/overrides/UpdateDateColumn.cjs +12 -0
- package/lib/overrides/UpdateDateColumn.d.ts +2 -0
- package/lib/overrides/utils.cjs +32 -0
- package/lib/overrides/utils.d.ts +2 -0
- package/lib/query/Paginator.cjs +128 -0
- package/lib/query/Paginator.d.ts +86 -0
- package/lib/query/Statement.cjs +246 -0
- package/lib/query/Statement.d.ts +131 -0
- package/lib/query/constants.cjs +77 -0
- package/lib/query/constants.d.ts +52 -0
- package/lib/query/index.cjs +21 -0
- package/lib/query/index.d.ts +4 -0
- package/lib/query/translate.cjs +45 -0
- package/lib/query/translate.d.ts +34 -0
- package/lib/raw/postgres.cjs +3 -0
- package/lib/raw/postgres.d.ts +36 -0
- package/lib/sequences/Sequence.cjs +121 -0
- package/lib/sequences/Sequence.d.ts +67 -0
- package/lib/sequences/index.cjs +18 -0
- package/lib/sequences/index.d.ts +1 -0
- package/lib/types.cjs +31 -0
- package/lib/types.d.ts +67 -0
- package/lib/utils.cjs +32 -0
- package/lib/utils.d.ts +16 -0
- package/package.json +128 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Paginator, PagingError } from "@decaf-ts/core";
|
|
2
|
+
import { ModelKeys } from "@decaf-ts/decorator-validation";
|
|
3
|
+
import { findPrimaryKey } from "@decaf-ts/db-decorators";
|
|
4
|
+
/**
|
|
5
|
+
* @description Paginator for TypeORM query results.
|
|
6
|
+
* @summary Implements pagination for TypeORM-built queries using take/skip for efficient navigation through result sets.
|
|
7
|
+
* @template M The model type that extends Model.
|
|
8
|
+
* @template R The result type.
|
|
9
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter.
|
|
10
|
+
* @param {TypeORMQuery} query The query container to paginate.
|
|
11
|
+
* @param {number} size The page size.
|
|
12
|
+
* @param {Constructor<M>} clazz The model constructor.
|
|
13
|
+
* @class TypeORMPaginator
|
|
14
|
+
* @example
|
|
15
|
+
* // Example of using TypeORMPaginator
|
|
16
|
+
* const paginator = new TypeORMPaginator(adapter, { query: qb }, 10, User);
|
|
17
|
+
* const page1 = await paginator.page(1);
|
|
18
|
+
* const page2 = await paginator.page(2);
|
|
19
|
+
*/
|
|
20
|
+
export class TypeORMPaginator extends Paginator {
|
|
21
|
+
/**
|
|
22
|
+
* @description Gets the total number of pages
|
|
23
|
+
* @summary Returns the total number of pages based on the record count and page size
|
|
24
|
+
* @return {number} The total number of pages
|
|
25
|
+
*/
|
|
26
|
+
get total() {
|
|
27
|
+
return this._totalPages;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @description Gets the total record count
|
|
31
|
+
* @summary Returns the total number of records matching the query
|
|
32
|
+
* @return {number} The total record count
|
|
33
|
+
*/
|
|
34
|
+
get count() {
|
|
35
|
+
return this._recordCount;
|
|
36
|
+
}
|
|
37
|
+
get repo() {
|
|
38
|
+
if (!this.__repo) {
|
|
39
|
+
this.__repo = this.adapter.dataSource.getRepository(this.clazz[ModelKeys.ANCHOR]);
|
|
40
|
+
}
|
|
41
|
+
return this.__repo;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @description Creates a new TypeORMPaginator instance.
|
|
45
|
+
* @summary Initializes a paginator for TypeORM query results.
|
|
46
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter.
|
|
47
|
+
* @param {TypeORMQuery} query The TypeORM query container to paginate.
|
|
48
|
+
* @param {number} size The page size.
|
|
49
|
+
* @param {Constructor<M>} clazz The model constructor.
|
|
50
|
+
*/
|
|
51
|
+
constructor(adapter, query, size, clazz) {
|
|
52
|
+
super(adapter, query, size, clazz);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @description Prepares a query for pagination
|
|
56
|
+
* @summary Modifies the raw query to include pagination parameters
|
|
57
|
+
* @param {TypeORMQuery} rawStatement - The original PostgreSQL query
|
|
58
|
+
* @return {TypeORMQuery} The prepared query with pagination parameters
|
|
59
|
+
*/
|
|
60
|
+
prepare(rawStatement) {
|
|
61
|
+
const query = { ...rawStatement };
|
|
62
|
+
return query;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* @description Retrieves a specific page of results.
|
|
66
|
+
* @summary Executes the query with pagination and processes the results.
|
|
67
|
+
* @param {number} [page=1] The page number to retrieve.
|
|
68
|
+
* @return {Promise<R[]>} A promise that resolves to an array of results.
|
|
69
|
+
* @throws {PagingError} If trying to access an invalid page or if no class is defined.
|
|
70
|
+
* @mermaid
|
|
71
|
+
* sequenceDiagram
|
|
72
|
+
* participant Client
|
|
73
|
+
* participant Paginator as TypeORMPaginator
|
|
74
|
+
* participant Adapter
|
|
75
|
+
* participant DB as Database
|
|
76
|
+
*
|
|
77
|
+
* Client->>Paginator: page(pageNumber)
|
|
78
|
+
* Note over Paginator: Prepare options (skip/take)
|
|
79
|
+
*
|
|
80
|
+
* alt First time or need count
|
|
81
|
+
* Paginator->>Adapter: Get count
|
|
82
|
+
* Adapter->>DB: Execute COUNT
|
|
83
|
+
* DB-->>Adapter: count
|
|
84
|
+
* Adapter-->>Paginator: count
|
|
85
|
+
* Paginator->>Paginator: Calculate total pages
|
|
86
|
+
* end
|
|
87
|
+
*
|
|
88
|
+
* Paginator->>Adapter: Execute query
|
|
89
|
+
* Adapter->>DB: findAndCount(options)
|
|
90
|
+
* DB-->>Adapter: rows, count
|
|
91
|
+
* Adapter-->>Paginator: rows, count
|
|
92
|
+
*
|
|
93
|
+
* Paginator->>Paginator: Map rows to models
|
|
94
|
+
* Paginator-->>Client: results
|
|
95
|
+
*/
|
|
96
|
+
async page(page = 1) {
|
|
97
|
+
const statement = { ...this.statement };
|
|
98
|
+
// Get total count if not already calculated
|
|
99
|
+
if (!this._recordCount || !this._totalPages) {
|
|
100
|
+
this._totalPages = this._recordCount = 0;
|
|
101
|
+
}
|
|
102
|
+
const opts = Object.assign(statement, {
|
|
103
|
+
skip: (this.current || 0) * this.size,
|
|
104
|
+
take: this.size,
|
|
105
|
+
});
|
|
106
|
+
// this.validatePage(page);
|
|
107
|
+
const result = await this.repo.findAndCount(opts);
|
|
108
|
+
this._recordCount = result[1];
|
|
109
|
+
this._totalPages = Math.ceil(this._recordCount / this.size);
|
|
110
|
+
if (!this.clazz)
|
|
111
|
+
throw new PagingError("No statement target defined");
|
|
112
|
+
const pkDef = findPrimaryKey(new this.clazz());
|
|
113
|
+
const rows = result[0] || [];
|
|
114
|
+
const results =
|
|
115
|
+
// statement.columns && statement.columns.length
|
|
116
|
+
// ? rows // has columns means it's not full model
|
|
117
|
+
rows.map((row) => {
|
|
118
|
+
return this.adapter.revert(row, this.clazz, pkDef.id, row[pkDef.id]);
|
|
119
|
+
});
|
|
120
|
+
this._currentPage = page;
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5hdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L1BhZ2luYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sRUFBc0IsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXpEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sT0FBTyxnQkFBcUMsU0FBUSxTQUl6RDtJQUNDOzs7O09BSUc7SUFDSCxJQUFhLEtBQUs7UUFDaEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxLQUFLO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBSUQsSUFBYyxJQUFJO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsT0FBMEIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUNyRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFpQyxDQUFDLENBQ3hELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsWUFDRSxPQUF1QixFQUN2QixLQUFtQixFQUNuQixJQUFZLEVBQ1osS0FBcUI7UUFFckIsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLE9BQU8sQ0FBQyxZQUEwQjtRQUMxQyxNQUFNLEtBQUssR0FBaUIsRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BK0JHO0lBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFlLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV4Qyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQXVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ3hELElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUVILDJCQUEyQjtRQUUzQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksV0FBVyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFdEUsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUU3QixNQUFNLE9BQU87UUFDWCxnREFBZ0Q7UUFDaEQsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsT0FBTyxPQUF5QixDQUFDO0lBQ25DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhZ2luYXRvciwgUGFnaW5nRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsLCBNb2RlbEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgRmluZE1hbnlPcHRpb25zLCBSZXBvc2l0b3J5IGFzIFJlcG8gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXkgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHBhZ2luYXRpb24gZm9yIFR5cGVPUk0tYnVpbHQgcXVlcmllcyB1c2luZyB0YWtlL3NraXAgZm9yIGVmZmljaWVudCBuYXZpZ2F0aW9uIHRocm91Z2ggcmVzdWx0IHNldHMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gKiBAY2xhc3MgVHlwZU9STVBhZ2luYXRvclxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgdXNpbmcgVHlwZU9STVBhZ2luYXRvclxuICogY29uc3QgcGFnaW5hdG9yID0gbmV3IFR5cGVPUk1QYWdpbmF0b3IoYWRhcHRlciwgeyBxdWVyeTogcWIgfSwgMTAsIFVzZXIpO1xuICogY29uc3QgcGFnZTEgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgxKTtcbiAqIGNvbnN0IHBhZ2UyID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMik7XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yPE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBQYWdpbmF0b3I8XG4gIE0sXG4gIFIsXG4gIFR5cGVPUk1RdWVyeVxuPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiB0aGUgcmVjb3JkIGNvdW50IGFuZCBwYWdlIHNpemVcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzXG4gICAqL1xuICBvdmVycmlkZSBnZXQgdG90YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxQYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdG90YWwgcmVjb3JkIGNvdW50XG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiByZWNvcmRzIG1hdGNoaW5nIHRoZSBxdWVyeVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yZWNvcmRDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgX19yZXBvPzogUmVwbzxhbnk+O1xuXG4gIHByb3RlY3RlZCBnZXQgcmVwbygpIHtcbiAgICBpZiAoIXRoaXMuX19yZXBvKSB7XG4gICAgICB0aGlzLl9fcmVwbyA9ICh0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXIpLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgdGhpcy5jbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXp6XVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19yZXBvO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFR5cGVPUk1QYWdpbmF0b3IgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgcGFnaW5hdG9yIGZvciBUeXBlT1JNIHF1ZXJ5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHF1ZXJ5IFRoZSBUeXBlT1JNIHF1ZXJ5IGNvbnRhaW5lciB0byBwYWdpbmF0ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIsXG4gICAgcXVlcnk6IFR5cGVPUk1RdWVyeSxcbiAgICBzaXplOiBudW1iZXIsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE0+XG4gICkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIHF1ZXJ5LCBzaXplLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgcXVlcnkgZm9yIHBhZ2luYXRpb25cbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgdGhlIHJhdyBxdWVyeSB0byBpbmNsdWRlIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcmF3U3RhdGVtZW50IC0gVGhlIG9yaWdpbmFsIFBvc3RncmVTUUwgcXVlcnlcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgcHJlcGFyZWQgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogVHlwZU9STVF1ZXJ5KTogVHlwZU9STVF1ZXJ5IHtcbiAgICBjb25zdCBxdWVyeTogVHlwZU9STVF1ZXJ5ID0geyAuLi5yYXdTdGF0ZW1lbnQgfTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNwZWNpZmljIHBhZ2Ugb2YgcmVzdWx0cy5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BhZ2U9MV0gVGhlIHBhZ2UgbnVtYmVyIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJlc3VsdHMuXG4gICAqIEB0aHJvd3Mge1BhZ2luZ0Vycm9yfSBJZiB0cnlpbmcgdG8gYWNjZXNzIGFuIGludmFsaWQgcGFnZSBvciBpZiBubyBjbGFzcyBpcyBkZWZpbmVkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBQYWdpbmF0b3IgYXMgVHlwZU9STVBhZ2luYXRvclxuICAgKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICAgKlxuICAgKiAgIENsaWVudC0+PlBhZ2luYXRvcjogcGFnZShwYWdlTnVtYmVyKVxuICAgKiAgIE5vdGUgb3ZlciBQYWdpbmF0b3I6IFByZXBhcmUgb3B0aW9ucyAoc2tpcC90YWtlKVxuICAgKlxuICAgKiAgIGFsdCBGaXJzdCB0aW1lIG9yIG5lZWQgY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IEdldCBjb3VudFxuICAgKiAgICAgQWRhcHRlci0+PkRCOiBFeGVjdXRlIENPVU5UXG4gICAqICAgICBEQi0tPj5BZGFwdGVyOiBjb3VudFxuICAgKiAgICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IGNvdW50XG4gICAqICAgICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IENhbGN1bGF0ZSB0b3RhbCBwYWdlc1xuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIFBhZ2luYXRvci0+PkFkYXB0ZXI6IEV4ZWN1dGUgcXVlcnlcbiAgICogICBBZGFwdGVyLT4+REI6IGZpbmRBbmRDb3VudChvcHRpb25zKVxuICAgKiAgIERCLS0+PkFkYXB0ZXI6IHJvd3MsIGNvdW50XG4gICAqICAgQWRhcHRlci0tPj5QYWdpbmF0b3I6IHJvd3MsIGNvdW50XG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBNYXAgcm93cyB0byBtb2RlbHNcbiAgICogICBQYWdpbmF0b3ItLT4+Q2xpZW50OiByZXN1bHRzXG4gICAqL1xuXG4gIGFzeW5jIHBhZ2UocGFnZTogbnVtYmVyID0gMSk6IFByb21pc2U8UltdPiB7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0geyAuLi50aGlzLnN0YXRlbWVudCB9O1xuXG4gICAgLy8gR2V0IHRvdGFsIGNvdW50IGlmIG5vdCBhbHJlYWR5IGNhbGN1bGF0ZWRcbiAgICBpZiAoIXRoaXMuX3JlY29yZENvdW50IHx8ICF0aGlzLl90b3RhbFBhZ2VzKSB7XG4gICAgICB0aGlzLl90b3RhbFBhZ2VzID0gdGhpcy5fcmVjb3JkQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHM6IEZpbmRNYW55T3B0aW9uczxNPiA9IE9iamVjdC5hc3NpZ24oc3RhdGVtZW50LCB7XG4gICAgICBza2lwOiAodGhpcy5jdXJyZW50IHx8IDApICogdGhpcy5zaXplLFxuICAgICAgdGFrZTogdGhpcy5zaXplLFxuICAgIH0pO1xuXG4gICAgLy8gdGhpcy52YWxpZGF0ZVBhZ2UocGFnZSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG8uZmluZEFuZENvdW50KG9wdHMpO1xuXG4gICAgdGhpcy5fcmVjb3JkQ291bnQgPSByZXN1bHRbMV07XG4gICAgdGhpcy5fdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLl9yZWNvcmRDb3VudCAvIHRoaXMuc2l6ZSk7XG5cbiAgICBpZiAoIXRoaXMuY2xhenopIHRocm93IG5ldyBQYWdpbmdFcnJvcihcIk5vIHN0YXRlbWVudCB0YXJnZXQgZGVmaW5lZFwiKTtcblxuICAgIGNvbnN0IHBrRGVmID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhenooKSk7XG4gICAgY29uc3Qgcm93cyA9IHJlc3VsdFswXSB8fCBbXTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPVxuICAgICAgLy8gc3RhdGVtZW50LmNvbHVtbnMgJiYgc3RhdGVtZW50LmNvbHVtbnMubGVuZ3RoXG4gICAgICAvLyAgID8gcm93cyAvLyBoYXMgY29sdW1ucyBtZWFucyBpdCdzIG5vdCBmdWxsIG1vZGVsXG4gICAgICByb3dzLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocm93LCB0aGlzLmNsYXp6LCBwa0RlZi5pZCwgcm93W3BrRGVmLmlkXSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZTtcbiAgICByZXR1cm4gcmVzdWx0cyBhcyB1bmtub3duIGFzIFJbXTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Condition, GroupOperator, Operator, Paginator, Statement } from "@decaf-ts/core";
|
|
2
|
+
import { Model } from "@decaf-ts/decorator-validation";
|
|
3
|
+
import { TypeORMQuery } from "../types";
|
|
4
|
+
import { TypeORMAdapter } from "../TypeORMAdapter";
|
|
5
|
+
import { SelectQueryBuilder } from "typeorm";
|
|
6
|
+
import { FindOptionsWhere } from "typeorm/find-options/FindOptionsWhere";
|
|
7
|
+
/**
|
|
8
|
+
* @description Statement builder for TypeORM-backed queries.
|
|
9
|
+
* @summary Provides a fluent interface for building SQL queries via TypeORM's SelectQueryBuilder with type safety and Decaf.ts abstractions.
|
|
10
|
+
* @template M The model type that extends Model.
|
|
11
|
+
* @template R The result type returned from execution.
|
|
12
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter.
|
|
13
|
+
* @class TypeORMStatement
|
|
14
|
+
* @example
|
|
15
|
+
* // Example using TypeORMStatement
|
|
16
|
+
* const statement = new TypeORMStatement<User, User[]>(adapter);
|
|
17
|
+
* const users = await statement
|
|
18
|
+
* .from(User)
|
|
19
|
+
* .where(Condition.attribute<User>('age').gt(18))
|
|
20
|
+
* .orderBy('lastName', 'asc')
|
|
21
|
+
* .limit(10)
|
|
22
|
+
* .execute();
|
|
23
|
+
*/
|
|
24
|
+
export declare class TypeORMStatement<M extends Model, R> extends Statement<TypeORMQuery<M>, M, R> {
|
|
25
|
+
protected adapter: TypeORMAdapter;
|
|
26
|
+
constructor(adapter: TypeORMAdapter);
|
|
27
|
+
/**
|
|
28
|
+
* @description Builds a TypeORM SelectQueryBuilder from the statement.
|
|
29
|
+
* @summary Converts the statement's conditions, selectors, and options into a TypeORM-backed query object.
|
|
30
|
+
* @return {TypeORMQuery} The built TypeORM query container.
|
|
31
|
+
* @throws {Error} If there are invalid query conditions.
|
|
32
|
+
* @mermaid
|
|
33
|
+
* sequenceDiagram
|
|
34
|
+
* participant Statement
|
|
35
|
+
* participant Repository
|
|
36
|
+
* participant parseCondition
|
|
37
|
+
*
|
|
38
|
+
* Statement->>Statement: build()
|
|
39
|
+
* Note over Statement: Initialize query
|
|
40
|
+
* Statement->>Repository: Get table name
|
|
41
|
+
* Repository-->>Statement: Return table name
|
|
42
|
+
* Statement->>Statement: Create base query
|
|
43
|
+
*
|
|
44
|
+
* alt Has selectSelector
|
|
45
|
+
* Statement->>Statement: Add columns to query
|
|
46
|
+
* end
|
|
47
|
+
*
|
|
48
|
+
* alt Has whereCondition
|
|
49
|
+
* Statement->>Statement: Create combined condition with table
|
|
50
|
+
* Statement->>parseCondition: Parse condition
|
|
51
|
+
* parseCondition-->>Statement: Return parsed conditions
|
|
52
|
+
* Statement->>Statement: Add conditions to query
|
|
53
|
+
* end
|
|
54
|
+
*
|
|
55
|
+
* alt Has orderBySelector
|
|
56
|
+
* Statement->>Statement: Add orderBy to query
|
|
57
|
+
* end
|
|
58
|
+
*
|
|
59
|
+
* alt Has limitSelector
|
|
60
|
+
* Statement->>Statement: Set limit
|
|
61
|
+
* else
|
|
62
|
+
* Statement->>Statement: Use default limit
|
|
63
|
+
* end
|
|
64
|
+
*
|
|
65
|
+
* alt Has offsetSelector
|
|
66
|
+
* Statement->>Statement: Set offset
|
|
67
|
+
* end
|
|
68
|
+
*
|
|
69
|
+
* Statement-->>Statement: Return query
|
|
70
|
+
*/
|
|
71
|
+
protected build(): TypeORMQuery<M>;
|
|
72
|
+
/**
|
|
73
|
+
* @description Creates a paginator for the statement.
|
|
74
|
+
* @summary Builds the query and returns a TypeORMPaginator for paginated results.
|
|
75
|
+
* @template R The result type.
|
|
76
|
+
* @param {number} size The page size.
|
|
77
|
+
* @return {Promise<Paginator<M, R, TypeORMQuery>>} A promise that resolves to a paginator.
|
|
78
|
+
* @throws {InternalError} If there's an error building the query.
|
|
79
|
+
*/
|
|
80
|
+
paginate<R>(size: number): Promise<Paginator<M, R, TypeORMQuery>>;
|
|
81
|
+
/**
|
|
82
|
+
* @description Processes a record.
|
|
83
|
+
* @summary Converts a raw result row to a model instance using the adapter.
|
|
84
|
+
* @param {any} r The raw record.
|
|
85
|
+
* @param {keyof M} pkAttr The primary key attribute of the model.
|
|
86
|
+
* @param {"Number" | "BigInt" | undefined} sequenceType The type of the sequence.
|
|
87
|
+
* @return {any} The processed record.
|
|
88
|
+
*/
|
|
89
|
+
private processRecord;
|
|
90
|
+
/**
|
|
91
|
+
* @description Executes a raw TypeORM query builder.
|
|
92
|
+
* @summary Sends the built SelectQueryBuilder to the database via TypeORM and returns the results.
|
|
93
|
+
* @template R The result type.
|
|
94
|
+
* @param {TypeORMQuery} rawInput The query container to execute.
|
|
95
|
+
* @return {Promise<R>} A promise that resolves to the query results.
|
|
96
|
+
*/
|
|
97
|
+
raw<R>(rawInput: TypeORMQuery<M>): Promise<R>;
|
|
98
|
+
protected parseConditionForPagination(condition: Condition<M>, tableName: string, counter?: number, conditionalOp?: GroupOperator | Operator): FindOptionsWhere<M>[] | FindOptionsWhere<M>;
|
|
99
|
+
/**
|
|
100
|
+
* @description Parses a condition into PostgreSQL conditions
|
|
101
|
+
* @summary Converts a Condition object into PostgreSQL condition structures
|
|
102
|
+
* @param {Condition<M>} condition - The condition to parse
|
|
103
|
+
* @param {string} [tableName] - the positional index of the arguments
|
|
104
|
+
* @return {TypeORMQuery} The PostgresSQL condition
|
|
105
|
+
* @mermaid
|
|
106
|
+
* sequenceDiagram
|
|
107
|
+
* participant Statement
|
|
108
|
+
* participant translateOperators
|
|
109
|
+
* participant parseCondition
|
|
110
|
+
*
|
|
111
|
+
* Statement->>Statement: parseCondition(condition)
|
|
112
|
+
*
|
|
113
|
+
* Note over Statement: Extract condition parts
|
|
114
|
+
*
|
|
115
|
+
* alt Simple comparison operator
|
|
116
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
117
|
+
* translateOperators-->>Statement: Return PostgreSQL operator
|
|
118
|
+
* Statement->>Statement: Create condition with column, operator, and value
|
|
119
|
+
* else NOT operator
|
|
120
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
121
|
+
* Statement->>Statement: Add NOT to conditions
|
|
122
|
+
* else AND/OR operator
|
|
123
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
124
|
+
* Statement->>Statement: parseCondition(comparison)
|
|
125
|
+
* Statement->>Statement: Combine conditions with AND/OR
|
|
126
|
+
* end
|
|
127
|
+
*
|
|
128
|
+
* Statement-->>Statement: Return conditions array
|
|
129
|
+
*/
|
|
130
|
+
protected parseCondition(condition: Condition<M>, tableName: string, qb: SelectQueryBuilder<any>, counter?: number, conditionalOp?: GroupOperator | Operator): TypeORMQuery<M>;
|
|
131
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { GroupOperator, Operator, OrderDirection, Repository, Statement, } from "@decaf-ts/core";
|
|
2
|
+
import { ModelKeys } from "@decaf-ts/decorator-validation";
|
|
3
|
+
import { translateOperators } from "./translate.js";
|
|
4
|
+
import { TypeORMQueryLimit } from "./constants.js";
|
|
5
|
+
import { TypeORMPaginator } from "./Paginator.js";
|
|
6
|
+
import { findPrimaryKey, InternalError } from "@decaf-ts/db-decorators";
|
|
7
|
+
/**
|
|
8
|
+
* @description Statement builder for TypeORM-backed queries.
|
|
9
|
+
* @summary Provides a fluent interface for building SQL queries via TypeORM's SelectQueryBuilder with type safety and Decaf.ts abstractions.
|
|
10
|
+
* @template M The model type that extends Model.
|
|
11
|
+
* @template R The result type returned from execution.
|
|
12
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter.
|
|
13
|
+
* @class TypeORMStatement
|
|
14
|
+
* @example
|
|
15
|
+
* // Example using TypeORMStatement
|
|
16
|
+
* const statement = new TypeORMStatement<User, User[]>(adapter);
|
|
17
|
+
* const users = await statement
|
|
18
|
+
* .from(User)
|
|
19
|
+
* .where(Condition.attribute<User>('age').gt(18))
|
|
20
|
+
* .orderBy('lastName', 'asc')
|
|
21
|
+
* .limit(10)
|
|
22
|
+
* .execute();
|
|
23
|
+
*/
|
|
24
|
+
export class TypeORMStatement extends Statement {
|
|
25
|
+
constructor(adapter) {
|
|
26
|
+
super(adapter);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @description Builds a TypeORM SelectQueryBuilder from the statement.
|
|
30
|
+
* @summary Converts the statement's conditions, selectors, and options into a TypeORM-backed query object.
|
|
31
|
+
* @return {TypeORMQuery} The built TypeORM query container.
|
|
32
|
+
* @throws {Error} If there are invalid query conditions.
|
|
33
|
+
* @mermaid
|
|
34
|
+
* sequenceDiagram
|
|
35
|
+
* participant Statement
|
|
36
|
+
* participant Repository
|
|
37
|
+
* participant parseCondition
|
|
38
|
+
*
|
|
39
|
+
* Statement->>Statement: build()
|
|
40
|
+
* Note over Statement: Initialize query
|
|
41
|
+
* Statement->>Repository: Get table name
|
|
42
|
+
* Repository-->>Statement: Return table name
|
|
43
|
+
* Statement->>Statement: Create base query
|
|
44
|
+
*
|
|
45
|
+
* alt Has selectSelector
|
|
46
|
+
* Statement->>Statement: Add columns to query
|
|
47
|
+
* end
|
|
48
|
+
*
|
|
49
|
+
* alt Has whereCondition
|
|
50
|
+
* Statement->>Statement: Create combined condition with table
|
|
51
|
+
* Statement->>parseCondition: Parse condition
|
|
52
|
+
* parseCondition-->>Statement: Return parsed conditions
|
|
53
|
+
* Statement->>Statement: Add conditions to query
|
|
54
|
+
* end
|
|
55
|
+
*
|
|
56
|
+
* alt Has orderBySelector
|
|
57
|
+
* Statement->>Statement: Add orderBy to query
|
|
58
|
+
* end
|
|
59
|
+
*
|
|
60
|
+
* alt Has limitSelector
|
|
61
|
+
* Statement->>Statement: Set limit
|
|
62
|
+
* else
|
|
63
|
+
* Statement->>Statement: Use default limit
|
|
64
|
+
* end
|
|
65
|
+
*
|
|
66
|
+
* alt Has offsetSelector
|
|
67
|
+
* Statement->>Statement: Set offset
|
|
68
|
+
* end
|
|
69
|
+
*
|
|
70
|
+
* Statement-->>Statement: Return query
|
|
71
|
+
*/
|
|
72
|
+
build() {
|
|
73
|
+
const log = this.log.for(this.build);
|
|
74
|
+
const tableName = Repository.table(this.fromSelector);
|
|
75
|
+
const m = new this.fromSelector();
|
|
76
|
+
const q = {
|
|
77
|
+
query: this.adapter.dataSource
|
|
78
|
+
.getRepository(this.fromSelector[ModelKeys.ANCHOR])
|
|
79
|
+
.createQueryBuilder(tableName),
|
|
80
|
+
};
|
|
81
|
+
if (this.selectSelector)
|
|
82
|
+
q.query = q.query.select(this.selectSelector.map((s) => `${tableName}.${s}`));
|
|
83
|
+
else
|
|
84
|
+
q.query = q.query.select();
|
|
85
|
+
//
|
|
86
|
+
// q.query = (q.query as SelectQueryBuilder<any>).from(
|
|
87
|
+
// this.fromSelector[ModelKeys.ANCHOR as keyof typeof this.fromSelector],
|
|
88
|
+
// tableName
|
|
89
|
+
// );
|
|
90
|
+
if (this.whereCondition)
|
|
91
|
+
q.query = this.parseCondition(this.whereCondition, tableName, q.query).query;
|
|
92
|
+
let orderByArgs;
|
|
93
|
+
if (!this.orderBySelector)
|
|
94
|
+
orderByArgs = [
|
|
95
|
+
`${tableName}.${findPrimaryKey(m).id}`,
|
|
96
|
+
OrderDirection.ASC.toUpperCase(),
|
|
97
|
+
];
|
|
98
|
+
else
|
|
99
|
+
orderByArgs = [
|
|
100
|
+
`${tableName}.${this.orderBySelector[0]}`,
|
|
101
|
+
this.orderBySelector[1].toUpperCase(),
|
|
102
|
+
];
|
|
103
|
+
q.query = q.query.orderBy(...orderByArgs);
|
|
104
|
+
if (this.limitSelector) {
|
|
105
|
+
q.query = q.query.limit(this.limitSelector);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
log.debug(`No limit selector defined. Using default limit of ${TypeORMQueryLimit}`);
|
|
109
|
+
q.query = q.query.limit(TypeORMQueryLimit);
|
|
110
|
+
}
|
|
111
|
+
// Add offset
|
|
112
|
+
if (this.offsetSelector)
|
|
113
|
+
q.query = q.query.skip(this.offsetSelector);
|
|
114
|
+
return q;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @description Creates a paginator for the statement.
|
|
118
|
+
* @summary Builds the query and returns a TypeORMPaginator for paginated results.
|
|
119
|
+
* @template R The result type.
|
|
120
|
+
* @param {number} size The page size.
|
|
121
|
+
* @return {Promise<Paginator<M, R, TypeORMQuery>>} A promise that resolves to a paginator.
|
|
122
|
+
* @throws {InternalError} If there's an error building the query.
|
|
123
|
+
*/
|
|
124
|
+
async paginate(size) {
|
|
125
|
+
try {
|
|
126
|
+
const query = this.build();
|
|
127
|
+
const transformedQuery = {};
|
|
128
|
+
const a = query.query;
|
|
129
|
+
if (this.whereCondition)
|
|
130
|
+
transformedQuery.where = this.parseConditionForPagination(this.whereCondition, Repository.table(this.fromSelector));
|
|
131
|
+
if (this.orderBySelector)
|
|
132
|
+
transformedQuery.order = {
|
|
133
|
+
[this.orderBySelector[0]]: this.orderBySelector[1].toString(),
|
|
134
|
+
};
|
|
135
|
+
return new TypeORMPaginator(this.adapter, transformedQuery, size, this.fromSelector);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
throw new InternalError(e);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* @description Processes a record.
|
|
143
|
+
* @summary Converts a raw result row to a model instance using the adapter.
|
|
144
|
+
* @param {any} r The raw record.
|
|
145
|
+
* @param {keyof M} pkAttr The primary key attribute of the model.
|
|
146
|
+
* @param {"Number" | "BigInt" | undefined} sequenceType The type of the sequence.
|
|
147
|
+
* @return {any} The processed record.
|
|
148
|
+
*/
|
|
149
|
+
processRecord(r, pkAttr) {
|
|
150
|
+
if (typeof r[pkAttr] !== "undefined") {
|
|
151
|
+
return this.adapter.revert(r, this.fromSelector, pkAttr, r[pkAttr]);
|
|
152
|
+
}
|
|
153
|
+
return r;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* @description Executes a raw TypeORM query builder.
|
|
157
|
+
* @summary Sends the built SelectQueryBuilder to the database via TypeORM and returns the results.
|
|
158
|
+
* @template R The result type.
|
|
159
|
+
* @param {TypeORMQuery} rawInput The query container to execute.
|
|
160
|
+
* @return {Promise<R>} A promise that resolves to the query results.
|
|
161
|
+
*/
|
|
162
|
+
async raw(rawInput) {
|
|
163
|
+
const log = this.log.for(this.raw);
|
|
164
|
+
log.debug(`Executing raw query: ${rawInput.query.getSql()}`);
|
|
165
|
+
return (await rawInput.query.getMany());
|
|
166
|
+
}
|
|
167
|
+
parseConditionForPagination(condition, tableName, counter = 0, conditionalOp) {
|
|
168
|
+
throw new InternalError("Not implemented");
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* @description Parses a condition into PostgreSQL conditions
|
|
172
|
+
* @summary Converts a Condition object into PostgreSQL condition structures
|
|
173
|
+
* @param {Condition<M>} condition - The condition to parse
|
|
174
|
+
* @param {string} [tableName] - the positional index of the arguments
|
|
175
|
+
* @return {TypeORMQuery} The PostgresSQL condition
|
|
176
|
+
* @mermaid
|
|
177
|
+
* sequenceDiagram
|
|
178
|
+
* participant Statement
|
|
179
|
+
* participant translateOperators
|
|
180
|
+
* participant parseCondition
|
|
181
|
+
*
|
|
182
|
+
* Statement->>Statement: parseCondition(condition)
|
|
183
|
+
*
|
|
184
|
+
* Note over Statement: Extract condition parts
|
|
185
|
+
*
|
|
186
|
+
* alt Simple comparison operator
|
|
187
|
+
* Statement->>translateOperators: translateOperators(operator)
|
|
188
|
+
* translateOperators-->>Statement: Return PostgreSQL operator
|
|
189
|
+
* Statement->>Statement: Create condition with column, operator, and value
|
|
190
|
+
* else NOT operator
|
|
191
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
192
|
+
* Statement->>Statement: Add NOT to conditions
|
|
193
|
+
* else AND/OR operator
|
|
194
|
+
* Statement->>Statement: parseCondition(attr1)
|
|
195
|
+
* Statement->>Statement: parseCondition(comparison)
|
|
196
|
+
* Statement->>Statement: Combine conditions with AND/OR
|
|
197
|
+
* end
|
|
198
|
+
*
|
|
199
|
+
* Statement-->>Statement: Return conditions array
|
|
200
|
+
*/
|
|
201
|
+
parseCondition(condition, tableName, qb, counter = 0, conditionalOp) {
|
|
202
|
+
const { attr1, operator, comparison } = condition;
|
|
203
|
+
function parse() {
|
|
204
|
+
const sqlOperator = translateOperators(operator);
|
|
205
|
+
const attrRef = `${attr1}${counter}`;
|
|
206
|
+
const queryStr = `${tableName}.${attr1} ${sqlOperator} :${attrRef}`;
|
|
207
|
+
const values = {
|
|
208
|
+
[attrRef]: comparison,
|
|
209
|
+
};
|
|
210
|
+
switch (conditionalOp) {
|
|
211
|
+
case GroupOperator.AND:
|
|
212
|
+
return {
|
|
213
|
+
query: qb.andWhere(queryStr, values),
|
|
214
|
+
};
|
|
215
|
+
case GroupOperator.OR:
|
|
216
|
+
return {
|
|
217
|
+
query: qb.orWhere(queryStr, values),
|
|
218
|
+
};
|
|
219
|
+
case Operator.NOT:
|
|
220
|
+
throw new Error("NOT operator not implemented");
|
|
221
|
+
default:
|
|
222
|
+
return {
|
|
223
|
+
query: qb.where(queryStr, values),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if ([GroupOperator.AND, GroupOperator.OR, Operator.NOT].indexOf(operator) === -1) {
|
|
228
|
+
return parse();
|
|
229
|
+
}
|
|
230
|
+
// For NOT operator
|
|
231
|
+
else if (operator === Operator.NOT) {
|
|
232
|
+
throw new Error("NOT operator not implemented");
|
|
233
|
+
}
|
|
234
|
+
// For AND/OR operators
|
|
235
|
+
else {
|
|
236
|
+
qb = this.parseCondition(attr1, tableName, qb, ++counter)
|
|
237
|
+
.query;
|
|
238
|
+
return this.parseCondition(comparison, tableName, qb, ++counter, operator);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3F1ZXJ5L1N0YXRlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsYUFBYSxFQUNiLFFBQVEsRUFDUixjQUFjLEVBRWQsVUFBVSxFQUNWLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBUyxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsdUJBQW9CO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBb0I7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHVCQUFvQjtBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBT3hFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxPQUFPLGdCQUFxQyxTQUFRLFNBSXpEO0lBR0MsWUFBWSxPQUF1QjtRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMkNHO0lBQ08sS0FBSztRQUNiLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxNQUFNLENBQUMsR0FBMkM7WUFDaEQsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtpQkFDM0IsYUFBYSxDQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQXdDLENBQUMsQ0FD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O1lBQ0QsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBQ0QsbUJBQW1CO2FBQ2QsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsdUJBQXVCO2FBQ2xCLENBQUM7WUFDSixFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFxQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUM7aUJBQ3RFLEtBQXlDLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUN4QixVQUFVLEVBQ1YsU0FBUyxFQUNULEVBQUUsRUFDRixFQUFFLE9BQU8sRUFDVCxRQUFRLENBQ1QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SQLOperator } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* @description Default query limit for TypeORM-backed queries.
|
|
4
|
+
* @summary Maximum number of records to return in a single page when paginating results.
|
|
5
|
+
* @const TypeORMQueryLimit
|
|
6
|
+
* @memberOf module:for-typeorm
|
|
7
|
+
*/
|
|
8
|
+
export declare const TypeORMQueryLimit = 250;
|
|
9
|
+
/**
|
|
10
|
+
* @description Mapping of operator names to SQL operators.
|
|
11
|
+
* @summary Constants for comparison operators used when translating high-level filters into SQL via TypeORM.
|
|
12
|
+
* @typedef {Object} PostgreSQLOperatorType
|
|
13
|
+
* @property {string} EQUAL Equality operator (=)
|
|
14
|
+
* @property {string} DIFFERENT Inequality operator (<>)
|
|
15
|
+
* @property {string} BIGGER Greater than operator (>)
|
|
16
|
+
* @property {string} BIGGER_EQ Greater than or equal operator (>=)
|
|
17
|
+
* @property {string} SMALLER Less than operator (<)
|
|
18
|
+
* @property {string} SMALLER_EQ Less than or equal operator (<=)
|
|
19
|
+
* @property {string} NOT Negation operator (NOT)
|
|
20
|
+
* @property {string} IN In array operator (IN)
|
|
21
|
+
* @property {string} REGEXP Regular expression operator (~)
|
|
22
|
+
* @property {string} IREGEXP Case-insensitive regular expression operator (~*)
|
|
23
|
+
* @property {string} LIKE Pattern matching operator (LIKE)
|
|
24
|
+
* @property {string} ILIKE Case-insensitive pattern matching operator (ILIKE)
|
|
25
|
+
* @property {string} BETWEEN Range operator (BETWEEN)
|
|
26
|
+
* @property {string} IS_NULL NULL check operator (IS NULL)
|
|
27
|
+
* @property {string} IS_NOT_NULL NOT NULL check operator (IS NOT NULL)
|
|
28
|
+
* @const TypeORMOperator
|
|
29
|
+
* @type {PostgreSQLOperatorType}
|
|
30
|
+
* @memberOf module:for-typeorm
|
|
31
|
+
*/
|
|
32
|
+
export declare const TypeORMOperator: Record<string, SQLOperator | string>;
|
|
33
|
+
/**
|
|
34
|
+
* @description Mapping of logical operator names to SQL operators.
|
|
35
|
+
* @summary Constants for logical operators used when building WHERE clause groups in TypeORM queries.
|
|
36
|
+
* @typedef {Object} PostgreSQLGroupOperatorType
|
|
37
|
+
* @property {string} AND Logical AND operator (AND)
|
|
38
|
+
* @property {string} OR Logical OR operator (OR)
|
|
39
|
+
* @const TypeORMGroupOperator
|
|
40
|
+
* @type {PostgreSQLGroupOperatorType}
|
|
41
|
+
* @memberOf module:for-typeorm
|
|
42
|
+
*/
|
|
43
|
+
export declare const TypeORMGroupOperator: Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* @description Special constant values used in queries.
|
|
46
|
+
* @summary String constants representing special values used while composing SQL with TypeORM.
|
|
47
|
+
* @typedef {Object} PostgreSQLConstType
|
|
48
|
+
* @property {string} NULL String representation of null value.
|
|
49
|
+
* @const TypeORMConst
|
|
50
|
+
* @memberOf module:for-typeorm
|
|
51
|
+
*/
|
|
52
|
+
export declare const TypeORMConst: Record<string, string>;
|