UNPKG

nukak-postgres

Version:

flexible and efficient ORM, with declarative JSON syntax and smart type-safety

110 lines 16.4 kB
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=