JoinRelationOperation.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const QueryBuilderOperation = require('./QueryBuilderOperation');
  2. const RelationJoinBuilder = require('./eager/RelationJoinBuilder');
  3. const RelationExpression = require('../RelationExpression');
  4. class JoinRelationOperation extends QueryBuilderOperation {
  5. constructor(name, opt) {
  6. super(name, opt);
  7. this.expression = null;
  8. this.callOpt = null;
  9. }
  10. onAdd(builder, args) {
  11. this.expression = RelationExpression.create(args[0]);
  12. this.callOpt = args[1] || {};
  13. return true;
  14. }
  15. onBuild(builder) {
  16. const modelClass = builder.modelClass();
  17. const opt = Object.assign({}, this.callOpt);
  18. opt.aliases = Object.assign({}, opt.aliases);
  19. opt.joinOperation = this.opt.joinOperation;
  20. // Special case for one single relation.
  21. if (this.expression.numChildren === 1) {
  22. const relationNames = this.expression.childNames.map(it => this.expression[it].$relation);
  23. const relationName = relationNames[0];
  24. const relation = modelClass.getRelation(relationName);
  25. let alias = null;
  26. if (opt.alias === false) {
  27. alias = builder.tableRefFor(relation.relatedModelClass);
  28. } else if (opt.alias === true || !opt.alias) {
  29. alias = relation.name;
  30. } else if (typeof opt.alias === 'string') {
  31. alias = opt.alias;
  32. }
  33. if (alias) {
  34. opt.aliases[relationName] = alias;
  35. }
  36. }
  37. const joinBuilder = new RelationJoinBuilder({
  38. modelClass,
  39. expression: this.expression
  40. });
  41. joinBuilder.setOptions(opt);
  42. joinBuilder.buildJoinOnly(builder);
  43. }
  44. }
  45. module.exports = JoinRelationOperation;