RawBuilder.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. const { isPlainObject } = require('../utils/objectUtils');
  2. const { buildArg } = require('../utils/buildUtils');
  3. class RawBuilder {
  4. constructor(sql, args) {
  5. this._sql = sql;
  6. this._args = args;
  7. }
  8. toKnexRaw(knex) {
  9. let args = null;
  10. if (this._args.length === 1 && isPlainObject(this._args[0])) {
  11. args = buildObject(this._args[0], knex);
  12. } else {
  13. args = buildArray(this._args, knex);
  14. }
  15. if (args) {
  16. return knex.raw(this._sql, args);
  17. } else {
  18. return knex.raw(this._sql);
  19. }
  20. }
  21. }
  22. function buildArray(arr, knex) {
  23. const args = new Array(arr.length);
  24. for (let i = 0, l = args.length; i < l; ++i) {
  25. args[i] = buildArg(arr[i], knex);
  26. }
  27. return args;
  28. }
  29. function buildObject(obj, knex) {
  30. const keys = Object.keys(obj);
  31. const args = {};
  32. for (let i = 0, l = keys.length; i < l; ++i) {
  33. const key = keys[i];
  34. args[key] = buildArg(obj[key], knex);
  35. }
  36. return args;
  37. }
  38. function raw() {
  39. let sql = arguments[0];
  40. let args = null;
  41. if (arguments.length === 2 && Array.isArray(arguments[1])) {
  42. args = new Array(arguments[1].length);
  43. for (let i = 0, l = args.length; i < l; ++i) {
  44. args[i] = arguments[1][i];
  45. }
  46. } else {
  47. args = new Array(arguments.length - 1);
  48. for (let i = 1, l = arguments.length; i < l; ++i) {
  49. args[i - 1] = arguments[i];
  50. }
  51. }
  52. return new RawBuilder(sql, args);
  53. }
  54. module.exports = {
  55. RawBuilder,
  56. raw
  57. };