/** * This class manages a many-to-many matrix for a `Session`. * @private */Ext.define('Ext.data.matrix.Matrix', { requires: [ 'Ext.data.matrix.Side' ], /** * @property {Ext.data.schema.ManyToMany} association * The `ManyToMany` association for this matrix. * @readonly */ /** * @property {Ext.data.Session} session * The `Session` owning this matrix. * @readonly */ /* * data: [ * [ leftId, rightId, -1/0/1 ], // === DELETED/UNMODIFIED/ADDED * ... * ], * * left: new Ext.data.matrix.Side({ * matrix: me, * index: 0, * inverse: right, * slices: { * leftId: new Ext.data.matrix.Slice({ * id: leftId, * side: left, * members: { * rightId: data[0] * } * }) * } * }, * * right: new Ext.data.matrix.Side({ * matrix: me, * index: 1, * inverse: left, * slices: { * rightId: new Ext.data.matrix.Slice({ * id: rightId, * side: right, * members: { * leftId: data[0] * } * }) * }) * } */ constructor: function(session, matrix) { var me = this, association = matrix.isManyToMany ? matrix : session.getSchema().getAssociation(matrix), Side = Ext.data.matrix.Side, left = new Side(me, 0, association.left), right = new Side(me, 1, association.right); //<debug> Ext.Assert.truthy(association.isManyToMany, 'Association is not many-to-many'); //</debug> me.association = association; me.session = session; me.left = left; me.right = right; left.inverse = right; right.inverse = left; }, commit: function() { this.left.commit(); this.right.commit(); }, update: function(id1, id2, state) { return this.left.update(id1, id2, state); }, updateId: function(record, oldId, newId) { var Type = record.self, left = this.left, right = this.right, matchSide; // Are we interested in this record? Check types if (Type === left.role.cls) { matchSide = left; } if (Type === right.role.cls) { matchSide = right; } if (matchSide) { matchSide.updateId(oldId, newId); } }, destroy: function() { var me = this; me.left.destroy(); me.right.destroy(); me.association = me.session = me.left = me.right = null; me.callParent(); }});