nukak-postgres
Version:
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
60 lines • 10.1 kB
JavaScript
import { AbstractSqlDialect } from 'nukak/dialect';
import { getMeta } from 'nukak/entity';
import { filterFieldKeys, getKeys } from 'nukak/util';
import sqlstring from 'sqlstring-sqlite';
export class PostgresDialect extends AbstractSqlDialect {
constructor() {
super('"', 'BEGIN TRANSACTION');
}
insert(entity, payload) {
const sql = super.insert(entity, payload);
const returning = this.returningId(entity);
return `${sql} ${returning}`;
}
upsert(entity, conflictPaths, payload) {
const meta = getMeta(entity);
const insert = super.insert(entity, payload);
const fields = filterFieldKeys(meta, payload, 'onInsert');
const update = fields
.filter((col) => !conflictPaths[col])
.map((col) => `${this.escapeId(col)} = EXCLUDED.${this.escapeId(col)}`)
.join(', ');
const keysStr = getKeys(conflictPaths)
.map((key) => this.escapeId(key))
.join(', ');
const returning = this.returningId(entity);
return `${insert} ON CONFLICT (${keysStr}) DO UPDATE SET ${update} ${returning}`;
}
compare(entity, key, val, opts = {}) {
if (key === '$text') {
const meta = getMeta(entity);
const search = val;
const fields = search.$fields
.map((field) => this.escapeId(meta.fields[field]?.name ?? field))
.join(` || ' ' || `);
return `to_tsvector(${fields}) @@ to_tsquery(${this.escape(search.$value)})`;
}
return super.compare(entity, key, val, opts);
}
compareFieldOperator(entity, key, op, val, opts = {}) {
const comparisonKey = this.getComparisonKey(entity, key, opts);
switch (op) {
case '$istartsWith':
return `${comparisonKey} ILIKE ${this.escape(`${val}%`)}`;
case '$iendsWith':
return `${comparisonKey} ILIKE ${this.escape(`%${val}`)}`;
case '$iincludes':
return `${comparisonKey} ILIKE ${this.escape(`%${val}%`)}`;
case '$ilike':
return `${comparisonKey} ILIKE ${this.escape(val)}`;
case '$regex':
return `${comparisonKey} ~ ${this.escape(val)}`;
default:
return super.compareFieldOperator(entity, key, op, val, opts);
}
}
escape(value) {
return sqlstring.escape(value);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Bvc3RncmVzRGlhbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVd2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RCxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxrQkFBa0I7SUFDckQ7UUFDRSxLQUFLLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVRLE1BQU0sQ0FBSSxNQUFlLEVBQUUsT0FBZ0I7UUFDbEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxPQUFPLEdBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFUSxNQUFNLENBQUksTUFBZSxFQUFFLGFBQW9DLEVBQUUsT0FBVTtRQUNsRixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTTthQUNsQixNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFD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WyJpbXBvcnQgeyBBYnN0cmFjdFNxbERpYWxlY3QgfSBmcm9tICdudWthay9kaWFsZWN0JztcbmltcG9ydCB7IGdldE1ldGEgfSBmcm9tICdudWthay9lbnRpdHknO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEtleSxcbiAgUXVlcnlDb21wYXJpc29uT3B0aW9ucyxcbiAgUXVlcnlDb25mbGljdFBhdGhzLFxuICBRdWVyeU9wdGlvbnMsXG4gIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnMsXG4gIFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwLFxuICBRdWVyeVdoZXJlTWFwLFxuICBUeXBlLFxufSBmcm9tICdudWthay90eXBlJztcbmltcG9ydCB7IGZpbHRlckZpZWxkS2V5cywgZ2V0S2V5cyB9IGZyb20gJ251a2FrL3V0aWwnO1xuaW1wb3J0IHNxbHN0cmluZyBmcm9tICdzcWxzdHJpbmctc3FsaXRlJztcblxuZXhwb3J0IGNsYXNzIFBvc3RncmVzRGlhbGVjdCBleHRlbmRzIEFic3RyYWN0U3FsRGlhbGVjdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdcIicsICdCRUdJTiBUUkFOU0FDVElPTicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5zZXJ0PEU+KGVudGl0eTogVHlwZTxFPiwgcGF5bG9hZDogRSB8IEVbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3FsID0gc3VwZXIuaW5zZXJ0KGVudGl0eSwgcGF5bG9hZCk7XG4gICAgY29uc3QgcmV0dXJuaW5nID0gdGhpcy5yZXR1cm5pbmdJZChlbnRpdHkpO1xuICAgIHJldHVybiBgJHtzcWx9ICR7cmV0dXJuaW5nfWA7XG4gIH1cblxuICBvdmVycmlkZSB1cHNlcnQ8RT4oZW50aXR5OiBUeXBlPEU+LCBjb25mbGljdFBhdGhzOiBRdWVyeUNvbmZsaWN0UGF0aHM8RT4sIHBheWxvYWQ6IEUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG4gICAgY29uc3QgaW5zZXJ0ID0gc3VwZXIuaW5zZXJ0KGVudGl0eSwgcGF5bG9hZCk7XG4gICAgY29uc3QgZmllbGRzID0gZmlsdGVyRmllbGRLZXlzKG1ldGEsIHBheWxvYWQsICdvbkluc2VydCcpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IGZpZWxkc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29uZmxpY3RQYXRoc1tjb2xdKVxuICAgICAgLm1hcCgoY29sKSA9PiBgJHt0aGlzLmVzY2FwZUlkKGNvbCl9ID0gRVhDTFVERUQuJHt0aGlzLmVzY2FwZUlkKGNvbCl9YClcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGNvbnN0IGtleXNTdHIgPSBnZXRLZXlzKGNvbmZsaWN0UGF0aHMpXG4gICAgICAubWFwKChrZXkpID0+IHRoaXMuZXNjYXBlSWQoa2V5KSlcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGNvbnN0IHJldHVybmluZyA9IHRoaXMucmV0dXJuaW5nSWQoZW50aXR5KTtcbiAgICByZXR1cm4gYCR7aW5zZXJ0fSBPTiBDT05GTElDVCAoJHtrZXlzU3RyfSkgRE8gVVBEQVRFIFNFVCAke3VwZGF0ZX0gJHtyZXR1cm5pbmd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbXBhcmU8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5V2hlcmVNYXA8RT4+KFxuICAgIGVudGl0eTogVHlwZTxFPixcbiAgICBrZXk6IEssXG4gICAgdmFsOiBRdWVyeVdoZXJlTWFwPEU+W0tdLFxuICAgIG9wdHM6IFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMgPSB7fSxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoa2V5ID09PSAnJHRleHQnKSB7XG4gICAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gdmFsIGFzIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnM8RT47XG4gICAgICBjb25zdCBmaWVsZHMgPSBzZWFyY2guJGZpZWxkc1xuICAgICAgICAubWFwKChmaWVsZCkgPT4gdGhpcy5lc2NhcGVJZChtZXRhLmZpZWxkc1tmaWVsZF0/Lm5hbWUgPz8gZmllbGQpKVxuICAgICAgICAuam9pbihgIHx8ICcgJyB8fCBgKTtcbiAgICAgIHJldHVybiBgdG9fdHN2ZWN0b3IoJHtmaWVsZHN9KSBAQCB0b190c3F1ZXJ5KCR7dGhpcy5lc2NhcGUoc2VhcmNoLiR2YWx1ZSl9KWA7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5jb21wYXJlKGVudGl0eSwga2V5LCB2YWwsIG9wdHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwPEU+PihcbiAgICBlbnRpdHk6IFR5cGU8RT4sXG4gICAga2V5OiBGaWVsZEtleTxFPixcbiAgICBvcDogSyxcbiAgICB2YWw6IFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwPEU+W0tdLFxuICAgIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBhcmlzb25LZXkgPSB0aGlzLmdldENvbXBhcmlzb25LZXkoZW50aXR5LCBrZXksIG9wdHMpO1xuICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2UgJyRpc3RhcnRzV2l0aCc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKGAke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpZW5kc1dpdGgnOlxuICAgICAgICByZXR1cm4gYCR7Y29tcGFyaXNvbktleX0gSUxJS0UgJHt0aGlzLmVzY2FwZShgJSR7dmFsfWApfWA7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgcmV0dXJuIGAke2NvbXBhcmlzb25LZXl9IElMSUtFICR7dGhpcy5lc2NhcGUoYCUke3ZhbH0lYCl9YDtcbiAgICAgIGNhc2UgJyRpbGlrZSc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSBJTElLRSAke3RoaXMuZXNjYXBlKHZhbCl9YDtcbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIHJldHVybiBgJHtjb21wYXJpc29uS2V5fSB+ICR7dGhpcy5lc2NhcGUodmFsKX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBhcmVGaWVsZE9wZXJhdG9yKGVudGl0eSwga2V5LCBvcCwgdmFsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBlc2NhcGUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzcWxzdHJpbmcuZXNjYXBlKHZhbHVlKTtcbiAgfVxufVxuIl19