@entity-access/entity-access 1.0.547 → 1.1.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/README.md +34 -43
- package/dist/compiler/QueryCompiler.d.ts +4 -4
- package/dist/compiler/QueryCompiler.d.ts.map +1 -1
- package/dist/compiler/QueryCompiler.js.map +1 -1
- package/dist/drivers/sql-server/SqlServerDriver.d.ts.map +1 -1
- package/dist/drivers/sql-server/SqlServerDriver.js +3 -2
- package/dist/drivers/sql-server/SqlServerDriver.js.map +1 -1
- package/dist/model/EntityQuery.d.ts +14 -11
- package/dist/model/EntityQuery.d.ts.map +1 -1
- package/dist/model/EntityQuery.js +69 -3
- package/dist/model/EntityQuery.js.map +1 -1
- package/dist/model/EntitySource.d.ts +3 -2
- package/dist/model/EntitySource.d.ts.map +1 -1
- package/dist/model/EntitySource.js +3 -3
- package/dist/model/EntitySource.js.map +1 -1
- package/dist/model/IFilterWithParameter.d.ts +32 -17
- package/dist/model/IFilterWithParameter.d.ts.map +1 -1
- package/dist/model/changes/ChangeEntry.js +1 -1
- package/dist/model/changes/ChangeEntry.js.map +1 -1
- package/dist/query/parser/ArrowToExpression.d.ts +2 -2
- package/dist/query/parser/ArrowToExpression.d.ts.map +1 -1
- package/dist/query/parser/ArrowToExpression.js +49 -29
- package/dist/query/parser/ArrowToExpression.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/workflows/WorkflowStorage.js +20 -20
- package/dist/workflows/WorkflowStorage.js.map +1 -1
- package/package.json +1 -1
- package/src/compiler/QueryCompiler.ts +4 -4
- package/src/drivers/sql-server/SqlServerDriver.ts +3 -3
- package/src/model/EntityQuery.ts +88 -15
- package/src/model/EntitySource.ts +7 -5
- package/src/model/IFilterWithParameter.ts +32 -17
- package/src/model/changes/ChangeEntry.ts +1 -1
- package/src/query/parser/ArrowToExpression.ts +51 -33
- package/src/workflows/WorkflowStorage.ts +20 -20
|
@@ -18,10 +18,10 @@ let WorkflowStorage = class WorkflowStorage {
|
|
|
18
18
|
}
|
|
19
19
|
getPendingWorkflowCount({ taskGroup = void 0 } = {}) {
|
|
20
20
|
const db = new WorkflowDbContext(this.driver);
|
|
21
|
-
let q = db.workflows.where(void 0, (p) =>
|
|
21
|
+
let q = db.workflows.where(void 0, (x, p) => x.isWorkflow === true
|
|
22
22
|
&& x.state === "queued");
|
|
23
23
|
if (taskGroup) {
|
|
24
|
-
q = q.where({ taskGroup }, (p) =>
|
|
24
|
+
q = q.where({ taskGroup }, (x, p) => x.taskGroup === p.taskGroup);
|
|
25
25
|
}
|
|
26
26
|
return q.count();
|
|
27
27
|
}
|
|
@@ -29,12 +29,12 @@ let WorkflowStorage = class WorkflowStorage {
|
|
|
29
29
|
const now = this.clock.utcNow;
|
|
30
30
|
const db = new WorkflowDbContext(this.driver);
|
|
31
31
|
const { group, deferSeconds } = throttle;
|
|
32
|
-
const w = await db.workflows.where({ group, now }, (p) =>
|
|
32
|
+
const w = await db.workflows.where({ group, now }, (x, p) => x.throttleGroup === p.group
|
|
33
33
|
&& x.state !== "failed"
|
|
34
34
|
&& x.state !== "done"
|
|
35
35
|
&& x.isWorkflow === true
|
|
36
36
|
&& x.eta >= Sql.cast.asDateTime(p.now))
|
|
37
|
-
.orderByDescending(void 0, (p) =>
|
|
37
|
+
.orderByDescending(void 0, (x, p) => x.queued)
|
|
38
38
|
.first();
|
|
39
39
|
if (w) {
|
|
40
40
|
w.eta = DateTime.from(w.eta).addSeconds(deferSeconds);
|
|
@@ -44,9 +44,9 @@ let WorkflowStorage = class WorkflowStorage {
|
|
|
44
44
|
}
|
|
45
45
|
async getNextEta(throttle) {
|
|
46
46
|
const db = new WorkflowDbContext(this.driver);
|
|
47
|
-
const last = await db.workflows.where(throttle, (p) =>
|
|
47
|
+
const last = await db.workflows.where(throttle, (x, p) => x.throttleGroup === p.group
|
|
48
48
|
&& x.isWorkflow === true)
|
|
49
|
-
.orderByDescending(void 0, (p) =>
|
|
49
|
+
.orderByDescending(void 0, (x, p) => x.queued)
|
|
50
50
|
.first();
|
|
51
51
|
if (last) {
|
|
52
52
|
if (throttle.maxPerSecond <= 0) {
|
|
@@ -105,12 +105,12 @@ let WorkflowStorage = class WorkflowStorage {
|
|
|
105
105
|
if (text) {
|
|
106
106
|
// save..
|
|
107
107
|
await db.workflows.statements.update({ extra: text }, { id });
|
|
108
|
-
// await db.workflows.where({ id }, (p) =>
|
|
109
|
-
// .update({ text}, (p) => (
|
|
108
|
+
// await db.workflows.where({ id }, (x, p) => x.id === p.id)
|
|
109
|
+
// .update({ text}, (x, p) => ({ extra: p.text }));
|
|
110
110
|
return text;
|
|
111
111
|
}
|
|
112
|
-
const item = await db.workflows.where({ id }, (p) =>
|
|
113
|
-
.select(void 0, (p) => (
|
|
112
|
+
const item = await db.workflows.where({ id }, (x, p) => x.id === p.id)
|
|
113
|
+
.select(void 0, (x, p) => ({ extra: x.extra })).first();
|
|
114
114
|
return item?.extra;
|
|
115
115
|
}
|
|
116
116
|
/**
|
|
@@ -122,22 +122,22 @@ let WorkflowStorage = class WorkflowStorage {
|
|
|
122
122
|
const db = new WorkflowDbContext(this.driver);
|
|
123
123
|
// if parent workflows exist
|
|
124
124
|
// change eta to recent ones...
|
|
125
|
-
const hasPendingChildren = await db.workflows.where({ id }, (p) =>
|
|
125
|
+
const hasPendingChildren = await db.workflows.where({ id }, (x, p) => x.parentID === p.id && x.isWorkflow === true)
|
|
126
126
|
.limit(1000)
|
|
127
|
-
.update(void 0, (p) => (
|
|
127
|
+
.update(void 0, (x, p) => ({
|
|
128
128
|
eta: Sql.date.addMinutes(Sql.date.now(), -1)
|
|
129
129
|
}));
|
|
130
130
|
if (hasPendingChildren) {
|
|
131
131
|
return;
|
|
132
132
|
}
|
|
133
|
-
await db.workflows.where({ id }, (p) =>
|
|
133
|
+
await db.workflows.where({ id }, (x, p) => x.parentID === p.id)
|
|
134
134
|
.limit(1000)
|
|
135
|
-
.delete({ id }, (p) =>
|
|
136
|
-
if (await db.workflows.where({ id }, (p) =>
|
|
135
|
+
.delete({ id }, (x, p) => x.parentID === p.id);
|
|
136
|
+
if (await db.workflows.where({ id }, (x, p) => x.parentID === p.id).some()) {
|
|
137
137
|
return;
|
|
138
138
|
}
|
|
139
139
|
await db.workflows.asQuery()
|
|
140
|
-
.delete({ id }, (p) =>
|
|
140
|
+
.delete({ id }, (x, p) => x.id === p.id);
|
|
141
141
|
return true;
|
|
142
142
|
}
|
|
143
143
|
async save(state) {
|
|
@@ -201,16 +201,16 @@ let WorkflowStorage = class WorkflowStorage {
|
|
|
201
201
|
// const q = this.lockQuery;
|
|
202
202
|
const uuid = randomUUID();
|
|
203
203
|
const items = await db.workflows
|
|
204
|
-
.where({ now, taskGroup }, (p) =>
|
|
204
|
+
.where({ now, taskGroup }, (x, p) => x.eta <= p.now
|
|
205
205
|
&& (x.lockedTTL === null
|
|
206
206
|
|| x.lockedTTL <= p.now)
|
|
207
207
|
&& x.isWorkflow === true
|
|
208
208
|
&& x.taskGroup === p.taskGroup)
|
|
209
|
-
.orderBy({}, (p) =>
|
|
210
|
-
.thenBy({}, (p) =>
|
|
209
|
+
.orderBy({}, (x, p) => x.eta)
|
|
210
|
+
.thenBy({}, (x, p) => x.priority)
|
|
211
211
|
.limit(20)
|
|
212
212
|
.withSignal(signal)
|
|
213
|
-
.updateSelect({ uuid }, (p) => (
|
|
213
|
+
.updateSelect({ uuid }, (x, p) => ({
|
|
214
214
|
lockedTTL: Sql.date.addSeconds(Sql.date.now(), 15),
|
|
215
215
|
lockToken: p.uuid
|
|
216
216
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowStorage.js","sourceRoot":"","sources":["../../src/workflows/WorkflowStorage.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,MAAM,EAAE,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAgB,MAAM,wBAAwB,CAAC;AACvF,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,GAAG,MAAM,eAAe,CAAC;AAoBjB,IAAM,eAAe,GAArB,MAAM,eAAe;IAMpB;IAEQ;IANpB,+BAA+B;IAE/B,YAEY,MAAkB,EAEV,KAAoB;QAF5B,WAAM,GAAN,MAAM,CAAY;QAEV,UAAK,GAAL,KAAK,CAAe;IAGxC,CAAC;IAED,uBAAuB,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,EAAE,GAAG,EAAG;QAChD,MAAM,EAAE,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"WorkflowStorage.js","sourceRoot":"","sources":["../../src/workflows/WorkflowStorage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -50,24 +50,24 @@ export default class QueryCompiler {
|
|
|
50
50
|
this.sqlMethodTransformer = sqlMethodTransformer;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
public transform(fx: (
|
|
53
|
+
public transform(fx: (x: any, p: any) => any, target?: ParameterExpression, outerParameter?: ParameterExpression) {
|
|
54
54
|
const key = `${fx.toString()}-${target?.id ?? '_'}-${outerParameter?.id ?? '_'}`;
|
|
55
55
|
return this.parserCache.getOrCreate(key, this, (k, self) => self.arrowToExpression.transform(fx, target, outerParameter));
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
public execute<P = any, T = any>(parameters: P, fx: (
|
|
58
|
+
public execute<P = any, T = any>(parameters: P, fx: (x: T, p: P) => any, source?: EntityQuery) {
|
|
59
59
|
const { params, target , body } = this.transform(fx, source?.selectStatement.sourceParameter);
|
|
60
60
|
const exp = new this.expressionToSql(source, params[0], target, this);
|
|
61
61
|
const query = exp.visit(body);
|
|
62
62
|
return this.invoke(query, parameters);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
public compile(source: EntityQuery, fx: (p) =>
|
|
65
|
+
public compile(source: EntityQuery, fx: (x, p) => any) {
|
|
66
66
|
const { params, target , body } = this.transform(fx, source?.selectStatement.sourceParameter);
|
|
67
67
|
return { params, target, body };
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
public compileToSql( source: EntityQuery , fx: (p) =>
|
|
70
|
+
public compileToSql( source: EntityQuery , fx: (x, p) => any) {
|
|
71
71
|
const { params, target , body } = this.transform(fx, source?.selectStatement.sourceParameter);
|
|
72
72
|
const exp = new this.expressionToSql(source, params[0], target, this);
|
|
73
73
|
const textQuery = exp.visit(body);
|
|
@@ -202,7 +202,8 @@ export class SqlServerConnection extends BaseConnection {
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
protected async createDbTransaction(): Promise<EntityTransaction> {
|
|
205
|
-
const tx = this.transaction =
|
|
205
|
+
const tx = this.transaction = (await this.newConnection()).transaction();
|
|
206
|
+
// await tx.begin();
|
|
206
207
|
return new SqlEntityTransaction(this, tx);
|
|
207
208
|
}
|
|
208
209
|
|
|
@@ -224,7 +225,7 @@ export class SqlServerConnection extends BaseConnection {
|
|
|
224
225
|
return request;
|
|
225
226
|
}
|
|
226
227
|
|
|
227
|
-
private newConnection(config = this.config) {
|
|
228
|
+
private async newConnection(config = this.config) {
|
|
228
229
|
const key = config.server + "//" + config.database + "/" + config.user;
|
|
229
230
|
return namedPool.getOrCreateAsync(config.server + "://" + config.database,
|
|
230
231
|
async () => {
|
|
@@ -236,7 +237,6 @@ export class SqlServerConnection extends BaseConnection {
|
|
|
236
237
|
}) as any;
|
|
237
238
|
return await pool.connect();
|
|
238
239
|
}, 15000, (x) => x.close());
|
|
239
|
-
|
|
240
240
|
}
|
|
241
241
|
|
|
242
242
|
}
|
package/src/model/EntityQuery.ts
CHANGED
|
@@ -21,6 +21,10 @@ export default class EntityQuery<T = any>
|
|
|
21
21
|
public traceQuery: (text: string) => void;
|
|
22
22
|
public includes: any[];
|
|
23
23
|
public scope: ParameterExpression[];
|
|
24
|
+
|
|
25
|
+
private maxLimit = void 0;
|
|
26
|
+
private hasMore = false;
|
|
27
|
+
|
|
24
28
|
constructor (p: Partial<EntityQuery<any>>
|
|
25
29
|
) {
|
|
26
30
|
// lets clone select...
|
|
@@ -28,7 +32,7 @@ export default class EntityQuery<T = any>
|
|
|
28
32
|
return p as EntityQuery;
|
|
29
33
|
}
|
|
30
34
|
|
|
31
|
-
select(p: any, fx
|
|
35
|
+
select(p: any, fx?: any): any {
|
|
32
36
|
return this.map(p, fx);
|
|
33
37
|
}
|
|
34
38
|
|
|
@@ -59,7 +63,11 @@ export default class EntityQuery<T = any>
|
|
|
59
63
|
}, this.signal);
|
|
60
64
|
}
|
|
61
65
|
|
|
62
|
-
selectView(parameters: any, fx
|
|
66
|
+
selectView(parameters: any, fx?: any): any {
|
|
67
|
+
if (fx === void 0) {
|
|
68
|
+
fx = parameters;
|
|
69
|
+
parameters = void 0;
|
|
70
|
+
}
|
|
63
71
|
const exp = this.context.driver.compiler.compile(this, fx);
|
|
64
72
|
const p1 = exp.params[0];
|
|
65
73
|
if (p1) {
|
|
@@ -127,7 +135,11 @@ export default class EntityQuery<T = any>
|
|
|
127
135
|
});
|
|
128
136
|
}
|
|
129
137
|
|
|
130
|
-
map(parameters: any, fx
|
|
138
|
+
map(parameters: any, fx?: any): any {
|
|
139
|
+
if (fx === void 0) {
|
|
140
|
+
fx = parameters;
|
|
141
|
+
parameters = void 0;
|
|
142
|
+
}
|
|
131
143
|
const q = this.extend(parameters, fx, (select, body) => {
|
|
132
144
|
const fields = [] as Expression[];
|
|
133
145
|
switch(body.type) {
|
|
@@ -155,15 +167,18 @@ export default class EntityQuery<T = any>
|
|
|
155
167
|
return new EntityQuery({ ... this, signal });
|
|
156
168
|
}
|
|
157
169
|
|
|
158
|
-
thenBy(parameters: any, fx
|
|
170
|
+
thenBy(parameters: any, fx?: any): any {
|
|
159
171
|
return this.orderBy(parameters, fx);
|
|
160
172
|
}
|
|
161
|
-
thenByDescending(parameters: any, fx
|
|
173
|
+
thenByDescending(parameters: any, fx?: any) {
|
|
162
174
|
return this.orderByDescending(parameters, fx);
|
|
163
175
|
}
|
|
164
176
|
|
|
165
|
-
where
|
|
166
|
-
|
|
177
|
+
where(parameters: any, fx?: any): any {
|
|
178
|
+
if (fx === void 0) {
|
|
179
|
+
fx = parameters;
|
|
180
|
+
parameters = void 0;
|
|
181
|
+
}
|
|
167
182
|
return this.extend(parameters, fx, (select, body) => ({
|
|
168
183
|
... select,
|
|
169
184
|
where: select.where ? Expression.logicalAnd(select.where, body): body
|
|
@@ -178,8 +193,12 @@ export default class EntityQuery<T = any>
|
|
|
178
193
|
});
|
|
179
194
|
}
|
|
180
195
|
|
|
181
|
-
union(p, fx): any {
|
|
196
|
+
union(p, fx?): any {
|
|
182
197
|
|
|
198
|
+
if (fx === void 0) {
|
|
199
|
+
fx = p;
|
|
200
|
+
p = void 0;
|
|
201
|
+
}
|
|
183
202
|
const limit = this.selectStatement.limit;
|
|
184
203
|
const offset = this.selectStatement.offset;
|
|
185
204
|
|
|
@@ -317,7 +336,11 @@ export default class EntityQuery<T = any>
|
|
|
317
336
|
});
|
|
318
337
|
}
|
|
319
338
|
|
|
320
|
-
async delete(p, f): Promise<number> {
|
|
339
|
+
async delete(p, f?): Promise<number> {
|
|
340
|
+
if (f === void 0) {
|
|
341
|
+
f = p;
|
|
342
|
+
p = void 0;
|
|
343
|
+
}
|
|
321
344
|
if (f) {
|
|
322
345
|
return this.where(p, f).delete(void 0, void 0);
|
|
323
346
|
}
|
|
@@ -363,6 +386,13 @@ export default class EntityQuery<T = any>
|
|
|
363
386
|
}
|
|
364
387
|
|
|
365
388
|
async updateSelect(p?, f?): Promise<T[]> {
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
if (f === void 0) {
|
|
392
|
+
f = p;
|
|
393
|
+
p = void 0;
|
|
394
|
+
}
|
|
395
|
+
|
|
366
396
|
const updateStatement = this.getUpdateStatement(p, f, true);
|
|
367
397
|
|
|
368
398
|
await using scope = new AsyncDisposableScope();
|
|
@@ -372,7 +402,7 @@ export default class EntityQuery<T = any>
|
|
|
372
402
|
const type = this.type;
|
|
373
403
|
const signal = this.signal;
|
|
374
404
|
|
|
375
|
-
const relationMapper = new RelationMapper(this.context.changeSet);
|
|
405
|
+
// const relationMapper = new RelationMapper(this.context.changeSet);
|
|
376
406
|
|
|
377
407
|
signal?.throwIfAborted();
|
|
378
408
|
|
|
@@ -388,7 +418,7 @@ export default class EntityQuery<T = any>
|
|
|
388
418
|
Object.setPrototypeOf(iterator, prototype);
|
|
389
419
|
iterator.$type = type.entityName;
|
|
390
420
|
const entry = this.context.changeSet.getEntry(iterator, iterator);
|
|
391
|
-
relationMapper.fix(entry);
|
|
421
|
+
// relationMapper.fix(entry);
|
|
392
422
|
results.push(entry.entity as any);
|
|
393
423
|
}
|
|
394
424
|
return results;
|
|
@@ -400,6 +430,10 @@ export default class EntityQuery<T = any>
|
|
|
400
430
|
|
|
401
431
|
async update(p?, f?): Promise<number> {
|
|
402
432
|
|
|
433
|
+
if (f === void 0) {
|
|
434
|
+
f = p;
|
|
435
|
+
p = void 0;
|
|
436
|
+
}
|
|
403
437
|
const updateStatement = this.getUpdateStatement(p, f);
|
|
404
438
|
|
|
405
439
|
const session = this.context.logger ?? Logger.nullLogger;
|
|
@@ -415,7 +449,7 @@ export default class EntityQuery<T = any>
|
|
|
415
449
|
}
|
|
416
450
|
}
|
|
417
451
|
|
|
418
|
-
getUpdateStatement(p
|
|
452
|
+
getUpdateStatement(p, f, returnEntity = false) {
|
|
419
453
|
|
|
420
454
|
if (f) {
|
|
421
455
|
return this.extend(p, f, (select, body) => {
|
|
@@ -505,6 +539,25 @@ export default class EntityQuery<T = any>
|
|
|
505
539
|
return results;
|
|
506
540
|
}
|
|
507
541
|
|
|
542
|
+
async toPage(start, size): Promise<any> {
|
|
543
|
+
this.maxLimit = size;
|
|
544
|
+
let q = this;
|
|
545
|
+
if (start > 0) {
|
|
546
|
+
q = q.offset(start);
|
|
547
|
+
}
|
|
548
|
+
q = q.limit(size);
|
|
549
|
+
const items: T[] = [];
|
|
550
|
+
q.hasMore = false;
|
|
551
|
+
for await (const iterator of q.enumerate()) {
|
|
552
|
+
items.push(iterator);
|
|
553
|
+
}
|
|
554
|
+
const { hasMore } = q;
|
|
555
|
+
return {
|
|
556
|
+
items,
|
|
557
|
+
more:hasMore
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
|
|
508
561
|
async *enumerate(): AsyncGenerator<T, any, unknown> {
|
|
509
562
|
|
|
510
563
|
await using scope = new AsyncDisposableScope();
|
|
@@ -561,12 +614,23 @@ export default class EntityQuery<T = any>
|
|
|
561
614
|
// select = { ... select, fields: select.model.getFieldMap(select.sourceParameter) };
|
|
562
615
|
}
|
|
563
616
|
|
|
617
|
+
if (this.maxLimit) {
|
|
618
|
+
select.limit++;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
let maxLimit = this.maxLimit ? this.maxLimit : Number.MAX_VALUE;
|
|
622
|
+
|
|
564
623
|
query = this.context.driver.compiler.compileExpression(this, select);
|
|
565
624
|
this.traceQuery?.(query.text);
|
|
566
625
|
const reader = await this.context.connection.executeReader(query, signal);
|
|
567
626
|
scope.register(reader);
|
|
568
627
|
const prototype = type?.typeClass.prototype;
|
|
569
628
|
for await (const iterator of reader.next(10, signal)) {
|
|
629
|
+
maxLimit--;
|
|
630
|
+
if(maxLimit < 0) {
|
|
631
|
+
this.hasMore = true;
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
570
634
|
if (type) {
|
|
571
635
|
// const item = type.map(iterator) as any;
|
|
572
636
|
// set identity...
|
|
@@ -632,7 +696,11 @@ export default class EntityQuery<T = any>
|
|
|
632
696
|
toQuery(): { text: string; values: any[]; } {
|
|
633
697
|
return this.context.driver.compiler.compileExpression(this, this.selectStatement);
|
|
634
698
|
}
|
|
635
|
-
orderBy(parameters: any, fx
|
|
699
|
+
orderBy(parameters: any, fx?: any): any {
|
|
700
|
+
if (fx === void 0) {
|
|
701
|
+
fx = parameters;
|
|
702
|
+
parameters = void 0;
|
|
703
|
+
}
|
|
636
704
|
return this.extend(parameters, fx, (select, target) => ({
|
|
637
705
|
... select,
|
|
638
706
|
orderBy: select.orderBy
|
|
@@ -640,7 +708,11 @@ export default class EntityQuery<T = any>
|
|
|
640
708
|
: [OrderByExpression.create({ target})]
|
|
641
709
|
}));
|
|
642
710
|
}
|
|
643
|
-
orderByDescending(parameters: any, fx
|
|
711
|
+
orderByDescending(parameters: any, fx?: any): any {
|
|
712
|
+
if (fx === void 0) {
|
|
713
|
+
fx = parameters;
|
|
714
|
+
parameters = void 0;
|
|
715
|
+
}
|
|
644
716
|
const descending = true;
|
|
645
717
|
return this.extend(parameters, fx, (select, target) => ({
|
|
646
718
|
... select,
|
|
@@ -749,7 +821,8 @@ export default class EntityQuery<T = any>
|
|
|
749
821
|
Identifier.create({ value: "1"}),
|
|
750
822
|
"c1")
|
|
751
823
|
],
|
|
752
|
-
orderBy: void 0
|
|
824
|
+
orderBy: void 0,
|
|
825
|
+
limit: 1,
|
|
753
826
|
};
|
|
754
827
|
|
|
755
828
|
const nq = new EntityQuery({ ... this, selectStatement: select });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type EntityContext from "./EntityContext.js";
|
|
2
2
|
import type EntityType from "../entity-query/EntityType.js";
|
|
3
|
-
import type { IEntityQuery
|
|
3
|
+
import type { IEntityQuery } from "./IFilterWithParameter.js";
|
|
4
4
|
import { contextSymbol, modelSymbol, traceSymbol } from "../common/symbols/symbols.js";
|
|
5
5
|
import { Expression, ExpressionAs, Identifier, InsertStatement, TableLiteral } from "../query/ast/Expressions.js";
|
|
6
6
|
import { DirectSaveType } from "../drivers/base/BaseDriver.js";
|
|
@@ -358,7 +358,7 @@ export class EntitySource<T = any> {
|
|
|
358
358
|
filter.push(`x.${iterator.name} === p.${iterator.name}`);
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
-
return this.where(keys, `(p) =>
|
|
361
|
+
return this.where(keys, `(x, p) => ${filter.join(" && ")}` as any) as any;
|
|
362
362
|
// return q.first() as Promise<T>;
|
|
363
363
|
}
|
|
364
364
|
|
|
@@ -381,7 +381,7 @@ export class EntitySource<T = any> {
|
|
|
381
381
|
filter.push(`x.${fkColumn.name} === p.${relatedKeyColumn.name}`);
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
const query = `(p) =>
|
|
384
|
+
const query = `(x, p) => ${filter.join(" && ")}` as any;
|
|
385
385
|
// console.log(query);
|
|
386
386
|
|
|
387
387
|
return this.context.model.register(relatedEntity.typeClass)
|
|
@@ -444,8 +444,10 @@ export class EntitySource<T = any> {
|
|
|
444
444
|
return mode === "modify" ? events.modify(query) : events.filter(query);
|
|
445
445
|
}
|
|
446
446
|
|
|
447
|
-
public where
|
|
448
|
-
|
|
447
|
+
public where(fx: (x: T) => boolean): IEntityQuery<T>;
|
|
448
|
+
public where<P>(parameter: P, fx: (x: T, p: P) => boolean): IEntityQuery<T>;
|
|
449
|
+
public where<P>(parameter?: any, fx?: unknown) {
|
|
450
|
+
return this.asQuery().where(parameter, fx as any) as IEntityQuery<T>;
|
|
449
451
|
}
|
|
450
452
|
|
|
451
453
|
public asQuery() {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { IQueryResult } from "../drivers/base/BaseDriver.js";
|
|
2
2
|
import type { EntitySource } from "./EntitySource.js";
|
|
3
3
|
|
|
4
|
+
// export type IParamFunction<P, T, TR> = (x: T, p: P) => TR;
|
|
5
|
+
|
|
4
6
|
export type IFilterWithParameter<P = any, T = any> = (p: P) => (x: T) => boolean;
|
|
5
7
|
|
|
6
8
|
export type ILambdaExpression<P = any, T = any, TR = any> = [input: P, x: (p: P) => (s: T) => TR];
|
|
7
9
|
|
|
8
|
-
export type IFilterExpression<P = any, T = any> = [input: P,
|
|
10
|
+
export type IFilterExpression<P = any, T = any> = [input: P, fx: (x: T, p: P) => boolean];
|
|
9
11
|
|
|
10
12
|
export type IFieldsAsNumbers<T> = { [P in keyof T]: number };
|
|
11
13
|
|
|
@@ -17,46 +19,55 @@ export interface IBaseQuery<T> {
|
|
|
17
19
|
|
|
18
20
|
some(): Promise<boolean>;
|
|
19
21
|
|
|
20
|
-
select<
|
|
21
|
-
|
|
22
|
+
select<TR>(fx: (x: T) => TR): IBaseQuery<TR>;
|
|
23
|
+
select<P, TR>(parameters: P, fx: (x: T,p: P) => TR): IBaseQuery<TR>;
|
|
24
|
+
map<TR>(fx: (x: T) => TR): IBaseQuery<TR>;
|
|
25
|
+
map<P, TR>(parameters: P, fx: (x: T, p: P) => TR): IBaseQuery<TR>;
|
|
22
26
|
|
|
23
27
|
toArray(this: T extends object ? IBaseQuery<T> : never): Promise<T[]>;
|
|
24
28
|
|
|
29
|
+
toPage(this: T extends object ? IBaseQuery<T>: never, start, size): Promise<{ more: boolean, items: T[]}>;
|
|
30
|
+
|
|
25
31
|
toQuery(): { text: string, values: any[]};
|
|
26
32
|
|
|
27
33
|
limit<DT>(this: DT, limit: number): DT;
|
|
28
34
|
offset<DT>(this: DT, offset: number): DT;
|
|
29
|
-
where<
|
|
35
|
+
where<DT>(this: DT, fx: (x: T) => boolean): DT;
|
|
36
|
+
where<P, DT>(this: DT, parameters: P, fx: (x: T,p: P) => boolean): DT;
|
|
37
|
+
union<DT>(this: DT, fx: (x: T) => boolean): DT;
|
|
30
38
|
union<P, DT>(this: DT, parameters: P, fx: (p: P) => (x: T) => boolean): DT;
|
|
31
|
-
selectView<
|
|
39
|
+
selectView<DT>(this: DT, fx: (x: T) => Partial<T>): DT;
|
|
40
|
+
selectView<P, DT>(this: DT, parameters: P, fx: (x: T, p: P) => Partial<T>): DT;
|
|
32
41
|
|
|
33
|
-
innerJoin<JT, DT>(this: DT, q1: IBaseQuery<JT>, fx: (
|
|
42
|
+
innerJoin<JT, DT>(this: DT, q1: IBaseQuery<JT>, fx: (x: T, p: JT) => boolean): DT;
|
|
34
43
|
|
|
35
|
-
exists<JT, DT>(this: DT, q1: IBaseQuery<JT>, fx: (
|
|
44
|
+
exists<JT, DT>(this: DT, q1: IBaseQuery<JT>, fx: (x: T, p: JT) => boolean): DT;
|
|
36
45
|
|
|
37
46
|
count(): Promise<number>;
|
|
38
47
|
count<P>(parameters: P, fx: (p: P) => (x: T) => boolean): Promise<number>;
|
|
39
48
|
|
|
40
49
|
slice<DT>(this:DT, start?: number, end?: number): DT;
|
|
41
50
|
|
|
42
|
-
sum(): Promise<number>;
|
|
43
|
-
sum<P>(parameters: P, fx: (
|
|
44
|
-
sum<P, TR>(parameters: P, fx: (p: P) => (x: T) => TR): Promise<IFieldsAsNumbers<TR>>;
|
|
51
|
+
sum(fx?: (x: T) => number): Promise<number>;
|
|
52
|
+
sum<P, TR>(parameters: P, fx: (x: T, p: P) => TR): Promise<IFieldsAsNumbers<TR>>;
|
|
45
53
|
|
|
46
54
|
|
|
47
55
|
withSignal<DT>(this:DT, signal: AbortSignal): DT;
|
|
48
56
|
|
|
49
57
|
include<TR>(fx: (x: T) => TR | TR[]): IBaseQuery<T>;
|
|
50
58
|
|
|
51
|
-
update
|
|
52
|
-
|
|
59
|
+
update(fx: (x:T) => Partial<T>): Promise<number>;
|
|
60
|
+
update<P>(parameters: P, fx: (x:T, p: P) => Partial<T>): Promise<number>;
|
|
61
|
+
updateSelect(this: T extends object ? IBaseQuery<T> : never, fx: (x:T) => Partial<T>): Promise<T[]>;
|
|
62
|
+
updateSelect<P>(this: T extends object ? IBaseQuery<T> : never, parameters: P, fx: (x:T, p: P) => Partial<T>): Promise<T[]>;
|
|
53
63
|
|
|
54
64
|
/**
|
|
55
65
|
* Warning !! Be careful, this will delete rows from the database and neither soft delete nor any other events will be invoked.
|
|
56
66
|
* @param parameters parameters to supply
|
|
57
67
|
* @param fx filter expression
|
|
58
68
|
*/
|
|
59
|
-
delete
|
|
69
|
+
delete(fx: (x: T) => boolean): Promise<number>;
|
|
70
|
+
delete<P>(parameters: P, fx: (x: T, p: P) => boolean): Promise<number>;
|
|
60
71
|
|
|
61
72
|
trace<DT>(this: DT, tracer: (text: string) => void): DT;
|
|
62
73
|
|
|
@@ -73,12 +84,16 @@ export interface IBaseQuery<T> {
|
|
|
73
84
|
|
|
74
85
|
export interface IOrderedEntityQuery<T> extends IBaseQuery<T> {
|
|
75
86
|
|
|
76
|
-
thenBy
|
|
77
|
-
|
|
87
|
+
thenBy(fx: (x: T) => any): IOrderedEntityQuery<T>;
|
|
88
|
+
thenBy<P>(parameters: P, fx: (x: T, p: P) => any): IOrderedEntityQuery<T>;
|
|
89
|
+
thenByDescending(fx: (x: T) => any): IOrderedEntityQuery<T>;
|
|
90
|
+
thenByDescending<P>(parameters: P, fx: (x: T, p: P) => any): IOrderedEntityQuery<T>;
|
|
78
91
|
}
|
|
79
92
|
|
|
80
93
|
export interface IEntityQuery<T> extends IBaseQuery<T> {
|
|
81
94
|
|
|
82
|
-
orderBy
|
|
83
|
-
|
|
95
|
+
orderBy(fx: (x: T) => any): IOrderedEntityQuery<T>;
|
|
96
|
+
orderBy<P>(parameters: P, fx: (x: T, p: P) => any): IOrderedEntityQuery<T>;
|
|
97
|
+
orderByDescending(fx: (x: T) => any): IOrderedEntityQuery<T>;
|
|
98
|
+
orderByDescending<P>(parameters: P, fx: (x: T, p: P) => any): IOrderedEntityQuery<T>;
|
|
84
99
|
}
|
|
@@ -184,7 +184,7 @@ export default class ChangeEntry<T = any> implements IChanges {
|
|
|
184
184
|
filter.push(`x.${fkColumn.name} === p.${relatedKeyColumn.name}`);
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
-
const query = `(p) =>
|
|
187
|
+
const query = `(x, p) => ${filter.join(" && ")}` as any;
|
|
188
188
|
// console.log(query);
|
|
189
189
|
|
|
190
190
|
await context.model.register(relatedEntity.typeClass)
|