ManyToManySqliteModifyMixin.js 1.3 KB

1234567891011121314151617181920212223242526272829303132
  1. const ManyToManyModifyMixin = require('./ManyToManyModifyMixin');
  2. const SQLITE_BUILTIN_ROW_ID = '_rowid_';
  3. // We need to override this mixin for sqlite because sqlite doesn't support
  4. // multi-column where in statements with subqueries. We need to use the
  5. // internal _rowid_ column instead.
  6. const ManyToManySqliteModifyMixin = Operation => {
  7. return class extends ManyToManyModifyMixin(Operation) {
  8. applyModifyFilterForRelatedTable(builder) {
  9. const tableRef = builder.tableRefFor(this.relation.relatedModelClass);
  10. const rowIdRef = `${tableRef}.${SQLITE_BUILTIN_ROW_ID}`;
  11. const subquery = this.modifyFilterSubquery.clone().select(rowIdRef);
  12. return builder.whereInComposite(rowIdRef, subquery);
  13. }
  14. applyModifyFilterForJoinTable(builder) {
  15. const joinTableOwnerRefs = this.relation.joinTableOwnerProp.refs(builder);
  16. const tableRef = builder.tableRefFor(this.relation.getJoinModelClass(builder));
  17. const rowIdRef = `${tableRef}.${SQLITE_BUILTIN_ROW_ID}`;
  18. const ownerIds = this.relation.ownerProp.getProps(this.owner);
  19. const subquery = this.modifyFilterSubquery.clone().select(rowIdRef);
  20. return builder
  21. .whereInComposite(rowIdRef, subquery)
  22. .whereComposite(joinTableOwnerRefs, ownerIds);
  23. }
  24. };
  25. };
  26. module.exports = ManyToManySqliteModifyMixin;