nukak
Version:
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
133 lines • 17.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { getMeta } from '../entity/index.js';
import { clone, unflatObjects } from '../util/index.js';
import { AbstractQuerier } from './abstractQuerier.js';
import { Serialized } from './decorator/index.js';
export class AbstractSqlQuerier extends AbstractQuerier {
dialect;
hasPendingTransaction;
constructor(dialect) {
super();
this.dialect = dialect;
}
async all(query, values) {
return this.internalAll(query, values);
}
async run(query, values) {
return this.internalRun(query, values);
}
async findMany(entity, q) {
const ctx = this.dialect.createContext();
this.dialect.find(ctx, entity, q);
const res = await this.all(ctx.sql, ctx.values);
const founds = unflatObjects(res);
await this.fillToManyRelations(entity, founds, q.$select);
return founds;
}
async count(entity, q = {}) {
const ctx = this.dialect.createContext();
this.dialect.count(ctx, entity, q);
const res = await this.all(ctx.sql, ctx.values);
return Number(res[0].count);
}
async insertMany(entity, payload) {
if (!payload?.length) {
return [];
}
payload = clone(payload);
const ctx = this.dialect.createContext();
this.dialect.insert(ctx, entity, payload);
const { ids } = await this.run(ctx.sql, ctx.values);
const meta = getMeta(entity);
const payloadIds = payload.map((it, index) => {
it[meta.id] ??= ids[index];
return it[meta.id];
});
await this.insertRelations(entity, payload);
return payloadIds;
}
async updateMany(entity, q, payload) {
payload = clone(payload);
const ctx = this.dialect.createContext();
this.dialect.update(ctx, entity, q, payload);
const { changes } = await this.run(ctx.sql, ctx.values);
await this.updateRelations(entity, q, payload);
return changes;
}
async upsertOne(entity, conflictPaths, payload) {
payload = clone(payload);
const ctx = this.dialect.createContext();
this.dialect.upsert(ctx, entity, conflictPaths, payload);
return this.run(ctx.sql, ctx.values);
}
async deleteMany(entity, q, opts) {
const meta = getMeta(entity);
const findCtx = this.dialect.createContext();
this.dialect.find(findCtx, entity, { ...q, $select: [meta.id] });
const founds = await this.all(findCtx.sql, findCtx.values);
if (!founds.length) {
return 0;
}
const ids = founds.map((it) => it[meta.id]);
const deleteCtx = this.dialect.createContext();
this.dialect.delete(deleteCtx, entity, { $where: ids }, opts);
const { changes } = await this.run(deleteCtx.sql, deleteCtx.values);
await this.deleteRelations(entity, ids, opts);
return changes;
}
get hasOpenTransaction() {
return this.hasPendingTransaction;
}
async beginTransaction() {
if (this.hasPendingTransaction) {
throw TypeError('pending transaction');
}
await this.internalRun(this.dialect.beginTransactionCommand);
this.hasPendingTransaction = true;
}
async commitTransaction() {
if (!this.hasPendingTransaction) {
throw TypeError('not a pending transaction');
}
await this.internalRun(this.dialect.commitTransactionCommand);
this.hasPendingTransaction = false;
}
async rollbackTransaction() {
if (!this.hasPendingTransaction) {
throw TypeError('not a pending transaction');
}
await this.internalRun(this.dialect.rollbackTransactionCommand);
this.hasPendingTransaction = false;
}
}
__decorate([
Serialized(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Array]),
__metadata("design:returntype", Promise)
], AbstractSqlQuerier.prototype, "all", null);
__decorate([
Serialized(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Array]),
__metadata("design:returntype", Promise)
], AbstractSqlQuerier.prototype, "run", null);
__decorate([
Serialized(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], AbstractSqlQuerier.prototype, "beginTransaction", null);
__decorate([
Serialized(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], AbstractSqlQuerier.prototype, "commitTransaction", null);
__decorate([
Serialized(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], AbstractSqlQuerier.prototype, "rollbackTransaction", null);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RTcWxRdWVyaWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJpZXIvYWJzdHJhY3RTcWxRdWVyaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFVN0MsT0FBTyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE1BQU0sT0FBZ0Isa0JBQW1CLFNBQVEsZUFBZTtJQUd6QztJQUZiLHFCQUFxQixDQUFXO0lBRXhDLFlBQXFCLE9BQTJCO1FBQzlDLEtBQUssRUFBRSxDQUFDO1FBRFcsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7SUFFaEQsQ0FBQztJQWFLLEFBQU4sS0FBSyxDQUFDLEdBQUcsQ0FBSSxLQUFhLEVBQUUsTUFBa0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFJLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBR0ssQUFBTixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUFrQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFUSxLQUFLLENBQUMsUUFBUSxDQUFJLE1BQWUsRUFBRSxDQUFXO1FBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUksR0FBRyxDQUFD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LENBQUM7UUFDaEUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0NBQ0Y7QUF4R087SUFETCxVQUFVLEVBQUU7Ozs7NkNBR1o7QUFHSztJQURMLFVBQVUsRUFBRTs7Ozs2Q0FHWjtBQXdFYztJQURkLFVBQVUsRUFBRTs7OzswREFPWjtBQUdjO0lBRGQsVUFBVSxFQUFFOzs7OzJEQU9aO0FBR2M7SUFEZCxVQUFVLEVBQUU7Ozs7NkRBT1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFic3RyYWN0U3FsRGlhbGVjdCB9IGZyb20gJy4uL2RpYWxlY3QvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJy4uL2VudGl0eS9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFF1ZXJ5LFxuICBRdWVyeUNvbmZsaWN0UGF0aHMsXG4gIFF1ZXJ5T3B0aW9ucyxcbiAgUXVlcnlTZWFyY2gsXG4gIFF1ZXJ5VXBkYXRlUmVzdWx0LFxuICBTcWxRdWVyaWVyLFxuICBUeXBlLFxufSBmcm9tICcuLi90eXBlL2luZGV4LmpzJztcbmltcG9ydCB7IGNsb25lLCB1bmZsYXRPYmplY3RzIH0gZnJvbSAnLi4vdXRpbC9pbmRleC5qcyc7XG5pbXBvcnQgeyBBYnN0cmFjdFF1ZXJpZXIgfSBmcm9tICcuL2Fic3RyYWN0UXVlcmllci5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkIH0gZnJvbSAnLi9kZWNvcmF0b3IvaW5kZXguanMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcWxRdWVyaWVyIGV4dGVuZHMgQWJzdHJhY3RRdWVyaWVyIGltcGxlbWVudHMgU3FsUXVlcmllciB7XG4gIHByaXZhdGUgaGFzUGVuZGluZ1RyYW5zYWN0aW9uPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBkaWFsZWN0OiBBYnN0cmFjdFNxbERpYWxlY3QpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIGludGVybmFsIHJlYWQgcXVlcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50ZXJuYWxBbGw8VD4ocXVlcnk6IHN0cmluZywgdmFsdWVzPzogdW5rbm93bltdKTogUHJvbWlzZTxUW10+O1xuXG4gIC8qKlxuICAgKiBpbnRlcm5hbCBpbnNlcnQvdXBkYXRlL2RlbGV0ZS9kZGwgcXVlcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50ZXJuYWxSdW4ocXVlcnk6IHN0cmluZywgdmFsdWVzPzogdW5rbm93bltdKTogUHJvbWlzZTxRdWVyeVVwZGF0ZVJlc3VsdD47XG5cbiAgQFNlcmlhbGl6ZWQoKVxuICBhc3luYyBhbGw8VD4ocXVlcnk6IHN0cmluZywgdmFsdWVzPzogdW5rbm93bltdKTogUHJvbWlzZTxUW10+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEFsbDxUPihxdWVyeSwgdmFsdWVzKTtcbiAgfVxuXG4gIEBTZXJpYWxpemVkKClcbiAgYXN5bmMgcnVuKHF1ZXJ5OiBzdHJpbmcsIHZhbHVlcz86IHVua25vd25bXSk6IFByb21pc2U8UXVlcnlVcGRhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFJ1bihxdWVyeSwgdmFsdWVzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmRNYW55PEU+KGVudGl0eTogVHlwZTxFPiwgcTogUXVlcnk8RT4pIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmRpYWxlY3QuY3JlYXRlQ29udGV4dCgpO1xuICAgIHRoaXMuZGlhbGVjdC5maW5kKGN0eCwgZW50aXR5LCBxKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmFsbDxFPihjdHguc3FsLCBjdHgudmFsdWVzKTtcbiAgICBjb25zdCBmb3VuZHMgPSB1bmZsYXRPYmplY3RzKHJlcyk7XG4gICAgYXdhaXQgdGhpcy5maWxsVG9NYW55UmVsYXRpb25zKGVudGl0eSwgZm91bmRzLCBxLiRzZWxlY3QpO1xuICAgIHJldHVybiBmb3VuZHM7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjb3VudDxFPihlbnRpdHk6IFR5cGU8RT4sIHE6IFF1ZXJ5U2VhcmNoPEU+ID0ge30pIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmRpYWxlY3QuY3JlYXRlQ29udGV4dCgpO1xuICAgIHRoaXMuZGlhbGVjdC5jb3VudChjdHgsIGVudGl0eSwgcSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5hbGw8eyBjb3VudDogbnVtYmVyIH0+KGN0eC5zcWwsIGN0eC52YWx1ZXMpO1xuICAgIHJldHVybiBOdW1iZXIocmVzWzBdLmNvdW50KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGluc2VydE1hbnk8RT4oZW50aXR5OiBUeXBlPEU+LCBwYXlsb2FkOiBFW10pIHtcbiAgICBpZiAoIXBheWxvYWQ/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBwYXlsb2FkID0gY2xvbmUocGF5bG9hZCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5kaWFsZWN0LmNyZWF0ZUNvbnRleHQoKTtcbiAgICB0aGlzLmRpYWxlY3QuaW5zZXJ0KGN0eCwgZW50aXR5LCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IGlkcyB9ID0gYXdhaXQgdGhpcy5ydW4oY3R4LnNxbCwgY3R4LnZhbHVlcyk7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCBwYXlsb2FkSWRzID0gcGF5bG9hZC5tYXAoKGl0LCBpbmRleCkgPT4ge1xuICAgICAgaXRbbWV0YS5pZCBhcyBzdHJpbmddID8/PSBpZHNbaW5kZXhdO1xuICAgICAgcmV0dXJuIGl0W21ldGEuaWRdO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuaW5zZXJ0UmVsYXRpb25zKGVudGl0eSwgcGF5bG9hZCk7XG4gICAgcmV0dXJuIHBheWxvYWRJZHM7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cGRhdGVNYW55PEU+KGVudGl0eTogVHlwZTxFPiwgcTogUXVlcnlTZWFyY2g8RT4sIHBheWxvYWQ6IEUpIHtcbiAgICBwYXlsb2FkID0gY2xvbmUocGF5bG9hZCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5kaWFsZWN0LmNyZWF0ZUNvbnRleHQoKTtcbiAgICB0aGlzLmRpYWxlY3QudXBkYXRlKGN0eCwgZW50aXR5LCBxLCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IGNoYW5nZXMgfSA9IGF3YWl0IHRoaXMucnVuKGN0eC5zcWwsIGN0eC52YWx1ZXMpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlUmVsYXRpb25zKGVudGl0eSwgcSwgcGF5bG9hZCk7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyB1cHNlcnRPbmU8RT4oZW50aXR5OiBUeXBlPEU+LCBjb25mbGljdFBhdGhzOiBRdWVyeUNvbmZsaWN0UGF0aHM8RT4sIHBheWxvYWQ6IEUpIHtcbiAgICBwYXlsb2FkID0gY2xvbmUocGF5bG9hZCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5kaWFsZWN0LmNyZWF0ZUNvbnRleHQoKTtcbiAgICB0aGlzLmRpYWxlY3QudXBzZXJ0KGN0eCwgZW50aXR5LCBjb25mbGljdFBhdGhzLCBwYXlsb2FkKTtcbiAgICByZXR1cm4gdGhpcy5ydW4oY3R4LnNxbCwgY3R4LnZhbHVlcyk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVNYW55PEU+KGVudGl0eTogVHlwZTxFPiwgcTogUXVlcnlTZWFyY2g8RT4sIG9wdHM/OiBRdWVyeU9wdGlvbnMpIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IGZpbmRDdHggPSB0aGlzLmRpYWxlY3QuY3JlYXRlQ29udGV4dCgpO1xuICAgIHRoaXMuZGlhbGVjdC5maW5kKGZpbmRDdHgsIGVudGl0eSwgeyAuLi5xLCAkc2VsZWN0OiBbbWV0YS5pZF0gfSk7XG4gICAgY29uc3QgZm91bmRzID0gYXdhaXQgdGhpcy5hbGw8RT4oZmluZEN0eC5zcWwsIGZpbmRDdHgudmFsdWVzKTtcbiAgICBpZiAoIWZvdW5kcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBpZHMgPSBmb3VuZHMubWFwKChpdCkgPT4gaXRbbWV0YS5pZF0pO1xuICAgIGNvbnN0IGRlbGV0ZUN0eCA9IHRoaXMuZGlhbGVjdC5jcmVhdGVDb250ZXh0KCk7XG4gICAgdGhpcy5kaWFsZWN0LmRlbGV0ZShkZWxldGVDdHgsIGVudGl0eSwgeyAkd2hlcmU6IGlkcyB9LCBvcHRzKTtcbiAgICBjb25zdCB7IGNoYW5nZXMgfSA9IGF3YWl0IHRoaXMucnVuKGRlbGV0ZUN0eC5zcWwsIGRlbGV0ZUN0eC52YWx1ZXMpO1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlUmVsYXRpb25zKGVudGl0eSwgaWRzLCBvcHRzKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIG92ZXJyaWRlIGdldCBoYXNPcGVuVHJhbnNhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGVuZGluZ1RyYW5zYWN0aW9uO1xuICB9XG5cbiAgQFNlcmlhbGl6ZWQoKVxuICBvdmVycmlkZSBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmhhc1BlbmRpbmdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdwZW5kaW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuaW50ZXJuYWxSdW4odGhpcy5kaWFsZWN0LmJlZ2luVHJhbnNhY3Rpb25Db21tYW5kKTtcbiAgICB0aGlzLmhhc1BlbmRpbmdUcmFuc2FjdGlvbiA9IHRydWU7XG4gIH1cblxuICBAU2VyaWFsaXplZCgpXG4gIG92ZXJyaWRlIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICghdGhpcy5oYXNQZW5kaW5nVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignbm90IGEgcGVuZGluZyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmludGVybmFsUnVuKHRoaXMuZGlhbGVjdC5jb21taXRUcmFuc2FjdGlvbkNvbW1hbmQpO1xuICAgIHRoaXMuaGFzUGVuZGluZ1RyYW5zYWN0aW9uID0gZmFsc2U7XG4gIH1cblxuICBAU2VyaWFsaXplZCgpXG4gIG92ZXJyaWRlIGFzeW5jIHJvbGxiYWNrVHJhbnNhY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmhhc1BlbmRpbmdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdub3QgYSBwZW5kaW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuaW50ZXJuYWxSdW4odGhpcy5kaWFsZWN0LnJvbGxiYWNrVHJhbnNhY3Rpb25Db21tYW5kKTtcbiAgICB0aGlzLmhhc1BlbmRpbmdUcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9XG59XG4iXX0=