nukak-postgres
Version:
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
110 lines • 16.4 kB
JavaScript
import { AbstractSqlDialect } from 'nukak/dialect';
import { getMeta } from 'nukak/entity';
import { QueryRaw, } from 'nukak/type';
import sqlstring from 'sqlstring-sqlite';
export class PostgresDialect extends AbstractSqlDialect {
constructor(namingStrategy) {
super(namingStrategy, '"', 'BEGIN TRANSACTION');
}
addValue(values, value) {
values.push(value);
return this.placeholder(values.length);
}
placeholder(index) {
return `$${index}`;
}
insert(ctx, entity, payload, opts) {
super.insert(ctx, entity, payload, opts);
ctx.append(' ' + this.returningId(entity));
}
upsert(ctx, entity, conflictPaths, payload) {
const meta = getMeta(entity);
const update = this.getUpsertUpdateAssignments(ctx, meta, conflictPaths, payload, (name) => `EXCLUDED.${name}`);
const keysStr = this.getUpsertConflictPathsStr(meta, conflictPaths);
const onConflict = update ? `DO UPDATE SET ${update}` : 'DO NOTHING';
super.insert(ctx, entity, payload);
ctx.append(` ON CONFLICT (${keysStr}) ${onConflict} ${this.returningId(entity)}`);
}
compare(ctx, entity, key, val, opts = {}) {
if (key === '$text') {
const meta = getMeta(entity);
const search = val;
const fields = search.$fields
.map((fKey) => {
const field = meta.fields[fKey];
const columnName = this.resolveColumnName(fKey, field);
return this.escapeId(columnName);
})
.join(` || ' ' || `);
ctx.append(`to_tsvector(${fields}) @@ to_tsquery(`);
ctx.addValue(search.$value);
ctx.append(')');
return;
}
super.compare(ctx, entity, key, val, opts);
}
compareFieldOperator(ctx, entity, key, op, val, opts = {}) {
switch (op) {
case '$istartsWith':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' ILIKE ');
ctx.addValue(`${val}%`);
break;
case '$iendsWith':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' ILIKE ');
ctx.addValue(`%${val}`);
break;
case '$iincludes':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' ILIKE ');
ctx.addValue(`%${val}%`);
break;
case '$ilike':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' ILIKE ');
ctx.addValue(val);
break;
case '$in':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' = ANY(');
ctx.addValue(val);
ctx.append(')');
break;
case '$nin':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' <> ALL(');
ctx.addValue(val);
ctx.append(')');
break;
case '$regex':
this.getComparisonKey(ctx, entity, key, opts);
ctx.append(' ~ ');
ctx.addValue(val);
break;
default:
super.compareFieldOperator(ctx, entity, key, op, val, opts);
}
}
formatPersistableValue(ctx, field, value) {
if (value instanceof QueryRaw) {
super.formatPersistableValue(ctx, field, value);
return;
}
if (field.type === 'json' || field.type === 'jsonb') {
ctx.addValue(value ? JSON.stringify(value) : null);
ctx.append(`::${field.type}`);
return;
}
if (field.type === 'vector' && Array.isArray(value)) {
ctx.addValue(`[${value.join(',')}]`);
ctx.append('::vector');
return;
}
super.formatPersistableValue(ctx, field, value);
}
escape(value) {
return sqlstring.escape(value);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNEaWFsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Bvc3RncmVzRGlhbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBUUwsUUFBUSxHQUtULE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE1BQU0sT0FBTyxlQUFnQixTQUFRLGtCQUFrQjtJQUNyRCxZQUFZLGNBQStCO1FBQ3pDLEtBQUssQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVRLFFBQVEsQ0FBQyxNQUFpQixFQUFFLEtBQWM7UUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFUSxXQUFXLENBQUMsS0FBYTtRQUNoQyxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVRLE1BQU0sQ0FBSSxHQUFpQixFQUFFLE1BQWUsRUFBRSxPQUFnQixFQUFFLElBQW1CO1FBQzFGLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFUSxNQUFNLENBQUksR0FBaUIsRUFBRSxNQUFlLEVBQUUsYUFBb0MsRUFBRSxPQUFVO1FBQ3JHLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FB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QyxDQUFDO0lBQ2pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0U3FsRGlhbGVjdCB9IGZyb20gJ251a2FrL2RpYWxlY3QnO1xuaW1wb3J0IHsgZ2V0TWV0YSB9IGZyb20gJ251a2FrL2VudGl0eSc7XG5pbXBvcnQge1xuICB0eXBlIEZpZWxkS2V5LFxuICB0eXBlIEZpZWxkT3B0aW9ucyxcbiAgdHlwZSBOYW1pbmdTdHJhdGVneSxcbiAgdHlwZSBRdWVyeUNvbXBhcmlzb25PcHRpb25zLFxuICB0eXBlIFF1ZXJ5Q29uZmxpY3RQYXRocyxcbiAgdHlwZSBRdWVyeUNvbnRleHQsXG4gIHR5cGUgUXVlcnlPcHRpb25zLFxuICBRdWVyeVJhdyxcbiAgdHlwZSBRdWVyeVRleHRTZWFyY2hPcHRpb25zLFxuICB0eXBlIFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwLFxuICB0eXBlIFF1ZXJ5V2hlcmVNYXAsXG4gIHR5cGUgVHlwZSxcbn0gZnJvbSAnbnVrYWsvdHlwZSc7XG5pbXBvcnQgc3Fsc3RyaW5nIGZyb20gJ3NxbHN0cmluZy1zcWxpdGUnO1xuXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNEaWFsZWN0IGV4dGVuZHMgQWJzdHJhY3RTcWxEaWFsZWN0IHtcbiAgY29uc3RydWN0b3IobmFtaW5nU3RyYXRlZ3k/OiBOYW1pbmdTdHJhdGVneSkge1xuICAgIHN1cGVyKG5hbWluZ1N0cmF0ZWd5LCAnXCInLCAnQkVHSU4gVFJBTlNBQ1RJT04nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFkZFZhbHVlKHZhbHVlczogdW5rbm93bltdLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyKHZhbHVlcy5sZW5ndGgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcGxhY2Vob2xkZXIoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAkJHtpbmRleH1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgaW5zZXJ0PEU+KGN0eDogUXVlcnlDb250ZXh0LCBlbnRpdHk6IFR5cGU8RT4sIHBheWxvYWQ6IEUgfCBFW10sIG9wdHM/OiBRdWVyeU9wdGlvbnMpOiB2b2lkIHtcbiAgICBzdXBlci5pbnNlcnQoY3R4LCBlbnRpdHksIHBheWxvYWQsIG9wdHMpO1xuICAgIGN0eC5hcHBlbmQoJyAnICsgdGhpcy5yZXR1cm5pbmdJZChlbnRpdHkpKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHVwc2VydDxFPihjdHg6IFF1ZXJ5Q29udGV4dCwgZW50aXR5OiBUeXBlPEU+LCBjb25mbGljdFBhdGhzOiBRdWVyeUNvbmZsaWN0UGF0aHM8RT4sIHBheWxvYWQ6IEUpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuZ2V0VXBzZXJ0VXBkYXRlQXNzaWdubWVudHMoY3R4LCBtZXRhLCBjb25mbGljdFBhdGhzLCBwYXlsb2FkLCAobmFtZSkgPT4gYEVYQ0xVREVELiR7bmFtZX1gKTtcbiAgICBjb25zdCBrZXlzU3RyID0gdGhpcy5nZXRVcHNlcnRDb25mbGljdFBhdGhzU3RyKG1ldGEsIGNvbmZsaWN0UGF0aHMpO1xuICAgIGNvbnN0IG9uQ29uZmxpY3QgPSB1cGRhdGUgPyBgRE8gVVBEQVRFIFNFVCAke3VwZGF0ZX1gIDogJ0RPIE5PVEhJTkcnO1xuICAgIHN1cGVyLmluc2VydChjdHgsIGVudGl0eSwgcGF5bG9hZCk7XG4gICAgY3R4LmFwcGVuZChgIE9OIENPTkZMSUNUICgke2tleXNTdHJ9KSAke29uQ29uZmxpY3R9ICR7dGhpcy5yZXR1cm5pbmdJZChlbnRpdHkpfWApO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZTxFLCBLIGV4dGVuZHMga2V5b2YgUXVlcnlXaGVyZU1hcDxFPj4oXG4gICAgY3R4OiBRdWVyeUNvbnRleHQsXG4gICAgZW50aXR5OiBUeXBlPEU+LFxuICAgIGtleTogSyxcbiAgICB2YWw6IFF1ZXJ5V2hlcmVNYXA8RT5bS10sXG4gICAgb3B0czogUXVlcnlDb21wYXJpc29uT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBpZiAoa2V5ID09PSAnJHRleHQnKSB7XG4gICAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gdmFsIGFzIFF1ZXJ5VGV4dFNlYXJjaE9wdGlvbnM8RT47XG4gICAgICBjb25zdCBmaWVsZHMgPSBzZWFyY2guJGZpZWxkc1xuICAgICAgICAubWFwKChmS2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBtZXRhLmZpZWxkc1tmS2V5XTtcbiAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5yZXNvbHZlQ29sdW1uTmFtZShmS2V5IGFzIHN0cmluZywgZmllbGQpO1xuICAgICAgICAgIHJldHVybiB0aGlzLmVzY2FwZUlkKGNvbHVtbk5hbWUpO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihgIHx8ICcgJyB8fCBgKTtcbiAgICAgIGN0eC5hcHBlbmQoYHRvX3RzdmVjdG9yKCR7ZmllbGRzfSkgQEAgdG9fdHNxdWVyeShgKTtcbiAgICAgIGN0eC5hZGRWYWx1ZShzZWFyY2guJHZhbHVlKTtcbiAgICAgIGN0eC5hcHBlbmQoJyknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIuY29tcGFyZShjdHgsIGVudGl0eSwga2V5LCB2YWwsIG9wdHMpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29tcGFyZUZpZWxkT3BlcmF0b3I8RSwgSyBleHRlbmRzIGtleW9mIFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwPEU+PihcbiAgICBjdHg6IFF1ZXJ5Q29udGV4dCxcbiAgICBlbnRpdHk6IFR5cGU8RT4sXG4gICAga2V5OiBGaWVsZEtleTxFPixcbiAgICBvcDogSyxcbiAgICB2YWw6IFF1ZXJ5V2hlcmVGaWVsZE9wZXJhdG9yTWFwPEU+W0tdLFxuICAgIG9wdHM6IFF1ZXJ5T3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICBjYXNlICckaXN0YXJ0c1dpdGgnOlxuICAgICAgICB0aGlzLmdldENvbXBhcmlzb25LZXkoY3R4LCBlbnRpdHksIGtleSwgb3B0cyk7XG4gICAgICAgIGN0eC5hcHBlbmQoJyBJTElLRSAnKTtcbiAgICAgICAgY3R4LmFkZFZhbHVlKGAke3ZhbH0lYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGllbmRzV2l0aCc6XG4gICAgICAgIHRoaXMuZ2V0Q29tcGFyaXNvbktleShjdHgsIGVudGl0eSwga2V5LCBvcHRzKTtcbiAgICAgICAgY3R4LmFwcGVuZCgnIElMSUtFICcpO1xuICAgICAgICBjdHguYWRkVmFsdWUoYCUke3ZhbH1gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckaWluY2x1ZGVzJzpcbiAgICAgICAgdGhpcy5nZXRDb21wYXJpc29uS2V5KGN0eCwgZW50aXR5LCBrZXksIG9wdHMpO1xuICAgICAgICBjdHguYXBwZW5kKCcgSUxJS0UgJyk7XG4gICAgICAgIGN0eC5hZGRWYWx1ZShgJSR7dmFsfSVgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckaWxpa2UnOlxuICAgICAgICB0aGlzLmdldENvbXBhcmlzb25LZXkoY3R4LCBlbnRpdHksIGtleSwgb3B0cyk7XG4gICAgICAgIGN0eC5hcHBlbmQoJyBJTElLRSAnKTtcbiAgICAgICAgY3R4LmFkZFZhbHVlKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGluJzpcbiAgICAgICAgdGhpcy5nZXRDb21wYXJpc29uS2V5KGN0eCwgZW50aXR5LCBrZXksIG9wdHMpO1xuICAgICAgICBjdHguYXBwZW5kKCcgPSBBTlkoJyk7XG4gICAgICAgIGN0eC5hZGRWYWx1ZSh2YWwpO1xuICAgICAgICBjdHguYXBwZW5kKCcpJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG5pbic6XG4gICAgICAgIHRoaXMuZ2V0Q29tcGFyaXNvbktleShjdHgsIGVudGl0eSwga2V5LCBvcHRzKTtcbiAgICAgICAgY3R4LmFwcGVuZCgnIDw+IEFMTCgnKTtcbiAgICAgICAgY3R4LmFkZFZhbHVlKHZhbCk7XG4gICAgICAgIGN0eC5hcHBlbmQoJyknKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckcmVnZXgnOlxuICAgICAgICB0aGlzLmdldENvbXBhcmlzb25LZXkoY3R4LCBlbnRpdHksIGtleSwgb3B0cyk7XG4gICAgICAgIGN0eC5hcHBlbmQoJyB+ICcpO1xuICAgICAgICBjdHguYWRkVmFsdWUodmFsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdXBlci5jb21wYXJlRmllbGRPcGVyYXRvcihjdHgsIGVudGl0eSwga2V5LCBvcCwgdmFsLCBvcHRzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZm9ybWF0UGVyc2lzdGFibGVWYWx1ZTxFPihjdHg6IFF1ZXJ5Q29udGV4dCwgZmllbGQ6IEZpZWxkT3B0aW9ucywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBRdWVyeVJhdykge1xuICAgICAgc3VwZXIuZm9ybWF0UGVyc2lzdGFibGVWYWx1ZShjdHgsIGZpZWxkLCB2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChmaWVsZC50eXBlID09PSAnanNvbicgfHwgZmllbGQudHlwZSA9PT0gJ2pzb25iJykge1xuICAgICAgY3R4LmFkZFZhbHVlKHZhbHVlID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogbnVsbCk7XG4gICAgICBjdHguYXBwZW5kKGA6OiR7ZmllbGQudHlwZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZpZWxkLnR5cGUgPT09ICd2ZWN0b3InICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjdHguYWRkVmFsdWUoYFske3ZhbHVlLmpvaW4oJywnKX1dYCk7XG4gICAgICBjdHguYXBwZW5kKCc6OnZlY3RvcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5mb3JtYXRQZXJzaXN0YWJsZVZhbHVlKGN0eCwgZmllbGQsIHZhbHVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGVzY2FwZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHNxbHN0cmluZy5lc2NhcGUodmFsdWUpO1xuICB9XG59XG4iXX0=