You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2020/08/06 11:17:41 UTC
[cayenne] branch master updated: CommitLog does not include FKs for
deleted objects CAY-2670
This is an automated email from the ASF dual-hosted git repository.
aadamchik pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new b89faff CommitLog does not include FKs for deleted objects CAY-2670
b89faff is described below
commit b89faff8ee9b70ec1527b1b2cf9fb21c9910d053
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Thu Aug 6 14:11:30 2020 +0300
CommitLog does not include FKs for deleted objects CAY-2670
... trying to reproduce
---
.../cayenne/commitlog/CommitLogFilterIT.java | 66 +++++++++++++++++++---
1 file changed, 59 insertions(+), 7 deletions(-)
diff --git a/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java b/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
index d7f41f8..4ed21f3 100644
--- a/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
+++ b/cayenne-commitlog/src/test/java/org/apache/cayenne/commitlog/CommitLogFilterIT.java
@@ -114,8 +114,11 @@ public class CommitLogFilterIT extends AuditableServerCase {
@Test
public void testPostCommit_Delete() throws SQLException {
auditable1.insert(1, "xx");
+ auditableChild1.insert(1, 1, "cc1");
+ auditableChild1.insert(2, 1, "cc2");
Auditable1 a1 = SelectById.query(Auditable1.class, 1).selectOne(context);
+ context.deleteObjects(a1.getChildren1());
context.deleteObject(a1);
context.commitChanges();
@@ -123,14 +126,63 @@ public class CommitLogFilterIT extends AuditableServerCase {
verify(mockListener).onPostCommit(any(ObjectContext.class), changeMap.capture());
assertNotNull(changeMap.getValue());
- assertEquals(1, changeMap.getValue().getUniqueChanges().size());
+ assertEquals(3, changeMap.getValue().getUniqueChanges().size());
- ObjectChange c = changeMap.getValue().getChanges().get(ObjectId.of("Auditable1", Auditable1.ID_PK_COLUMN, 1));
- assertNotNull(c);
- assertEquals(ObjectChangeType.DELETE, c.getType());
- assertEquals(1, c.getAttributeChanges().size());
- assertEquals("xx", c.getAttributeChanges().get(Auditable1.CHAR_PROPERTY1.getName()).getOldValue());
- assertNull(c.getAttributeChanges().get(Auditable1.CHAR_PROPERTY1.getName()).getNewValue());
+ // check from the perspective of the master object
+ ObjectChange masterChange = changeMap.getValue().getChanges().get(ObjectId.of("Auditable1", Auditable1.ID_PK_COLUMN, 1));
+ assertNotNull(masterChange);
+ assertEquals(ObjectChangeType.DELETE, masterChange.getType());
+
+ assertEquals(1, masterChange.getAttributeChanges().size());
+ assertEquals("xx", masterChange.getAttributeChanges().get(Auditable1.CHAR_PROPERTY1.getName()).getOldValue());
+ assertNull(masterChange.getAttributeChanges().get(Auditable1.CHAR_PROPERTY1.getName()).getNewValue());
+
+ assertEquals("1..N was explicitly unset as a part of delete. Expected to be recorded in changes",
+ 1, masterChange.getToManyRelationshipChanges().size());
+ assertTrue("No N..1 relationships in the entity", masterChange.getToOneRelationshipChanges().isEmpty());
+
+ // check from the perspective of the child object
+ ObjectChange childChange = changeMap.getValue().getChanges().get(ObjectId.of("AuditableChild1", AuditableChild1.ID_PK_COLUMN, 2));
+ assertNotNull(childChange);
+ assertEquals(ObjectChangeType.DELETE, childChange.getType());
+
+ assertEquals(1, childChange.getAttributeChanges().size());
+ assertEquals("cc2", childChange.getAttributeChanges().get(AuditableChild1.CHAR_PROPERTY1.getName()).getOldValue());
+ assertNull(childChange.getAttributeChanges().get(AuditableChild1.CHAR_PROPERTY1.getName()).getNewValue());
+
+ assertTrue("No 1..N relationships in the entity", childChange.getToManyRelationshipChanges().isEmpty());
+ assertEquals("N..1 was explicitly unset as a part of delete. Expected to be recorded in changes",
+ 1, childChange.getToOneRelationshipChanges().size());
+ }
+
+ @Test
+ public void testPostCommit_Delete_ToOneNullify() throws SQLException {
+ auditable1.insert(1, "xx");
+ auditableChild1.insert(1, 1, "cc1");
+ auditableChild1.insert(2, 1, "cc2");
+
+ AuditableChild1 ac1 = SelectById.query(AuditableChild1.class, 2).selectOne(context);
+ context.deleteObject(ac1);
+ context.commitChanges();
+
+ ArgumentCaptor<ChangeMap> changeMap = ArgumentCaptor.forClass(ChangeMap.class);
+ verify(mockListener).onPostCommit(any(ObjectContext.class), changeMap.capture());
+
+ assertNotNull(changeMap.getValue());
+ assertEquals(2, changeMap.getValue().getUniqueChanges().size());
+
+ ObjectChange change = changeMap.getValue().getChanges().get(ObjectId.of("AuditableChild1", AuditableChild1.ID_PK_COLUMN, 2));
+ assertNotNull(change);
+ assertEquals(ObjectChangeType.DELETE, change.getType());
+
+ assertEquals(1, change.getAttributeChanges().size());
+ assertEquals("cc2", change.getAttributeChanges().get(AuditableChild1.CHAR_PROPERTY1.getName()).getOldValue());
+ assertNull(change.getAttributeChanges().get(AuditableChild1.CHAR_PROPERTY1.getName()).getNewValue());
+
+ assertTrue("No 1..N relationships in the entity", change.getToManyRelationshipChanges().isEmpty());
+ assertEquals("N..1 state was not captured", 1, change.getToOneRelationshipChanges().size());
+ assertEquals(ObjectId.of("Auditable1", Auditable1.ID_PK_COLUMN, 1),
+ change.getToOneRelationshipChanges().get(AuditableChild1.PARENT.getName()).getOldValue());
}
@Test