WhereInCompositeOperation.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. const ObjectionToKnexConvertingOperation = require('../ObjectionToKnexConvertingOperation');
  2. const { isKnexQueryBuilder } = require('../../../utils/knexUtils');
  3. class WhereInCompositeOperation extends ObjectionToKnexConvertingOperation {
  4. constructor(name, opt) {
  5. super(name, opt);
  6. this.prefix = this.opt.prefix || null;
  7. }
  8. onBuildKnex(knexBuilder, builder) {
  9. this.build(builder.knex(), knexBuilder, this.args[0], this.args[1]);
  10. }
  11. build(knex, knexBuilder, columns, values) {
  12. let isCompositeKey = Array.isArray(columns) && columns.length > 1;
  13. if (isCompositeKey) {
  14. this.buildComposite(knex, knexBuilder, columns, values);
  15. } else {
  16. this.buildNonComposite(knexBuilder, columns, values);
  17. }
  18. }
  19. buildComposite(knex, knexBuilder, columns, values) {
  20. if (Array.isArray(values)) {
  21. this.buildCompositeValue(knexBuilder, columns, values);
  22. } else {
  23. this.buildCompositeSubquery(knex, knexBuilder, columns, values);
  24. }
  25. }
  26. buildCompositeValue(knexBuilder, columns, values) {
  27. this.whereIn(knexBuilder, columns, values);
  28. }
  29. buildCompositeSubquery(knex, knexBuilder, columns, subquery) {
  30. const sql = `(${columns
  31. .map(col => {
  32. // On older versions of knex, raw doesn't work
  33. // with `??`. We use `?` for those.
  34. if (typeof col === 'object') {
  35. return '?';
  36. } else {
  37. return '??';
  38. }
  39. })
  40. .join(',')})`;
  41. this.whereIn(knexBuilder, knex.raw(sql, columns), subquery);
  42. }
  43. buildNonComposite(knexBuilder, columns, values) {
  44. const col = typeof columns === 'string' ? columns : columns[0];
  45. if (Array.isArray(values)) {
  46. values = pickNonNull(values, []);
  47. } else if (!isKnexQueryBuilder(values)) {
  48. values = [values];
  49. }
  50. this.whereIn(knexBuilder, col, values);
  51. }
  52. whereIn(knexBuilder, col, val) {
  53. if (this.prefix === 'not') {
  54. knexBuilder.whereNotIn(col, val);
  55. } else {
  56. knexBuilder.whereIn(col, val);
  57. }
  58. }
  59. }
  60. function pickNonNull(values, output) {
  61. for (let i = 0, l = values.length; i < l; ++i) {
  62. const val = values[i];
  63. if (Array.isArray(val)) {
  64. pickNonNull(val, output);
  65. } else if (val !== null && val !== undefined) {
  66. output.push(val);
  67. }
  68. }
  69. return output;
  70. }
  71. module.exports = WhereInCompositeOperation;