UNPKG

objection

Version:
74 lines (56 loc) 1.82 kB
import WrappingQueryBuilderOperation from './WrappingQueryBuilderOperation'; export default class WhereInCompositeOperation extends WrappingQueryBuilderOperation { onBuild(knexBuilder) { this.build(knexBuilder, this.args[0], this.args[1]); } build(knexBuilder, columns, values) { let isCompositeKey = Array.isArray(columns) && columns.length > 1; if (isCompositeKey) { this.buildComposite(knexBuilder, columns, values); } else { this.buildNonComposite(knexBuilder, columns, values); } } buildComposite(knexBuilder, columns, values) { if (Array.isArray(values)) { this.buildCompositeValue(knexBuilder, columns, values); } else { this.buildCompositeSubquery(knexBuilder, columns, values); } } buildCompositeValue(knexBuilder, columns, values) { knexBuilder.whereIn(columns, values); } buildCompositeSubquery(knexBuilder, columns, subquery) { const formatter = knexBuilder.client.formatter(); let sql = '('; for (let i = 0, l = columns.length; i < l; ++i) { sql += formatter.wrap(columns[i]); if (i !== columns.length - 1) { sql += ','; } } sql += ')'; knexBuilder.whereIn(knexBuilder.client.raw(sql), subquery); } buildNonComposite(knexBuilder, columns, values) { let col = (typeof columns === 'string') ? columns : columns[0]; if (Array.isArray(values)) { values = pickNonNull(values, []); } else { values = [values]; } knexBuilder.whereIn(col, values); } } function pickNonNull(values, output) { for (let i = 0, l = values.length; i < l; ++i) { const val = values[i]; if (Array.isArray(val)) { pickNonNull(val, output); } else if (val !== null && val !== undefined) { output.push(val); } } return output; }