Skip to content

Commit c1b31fa

Browse files
author
Christopher Thonfeld-Guckes
committed
CAY-2896 Factor in datamap name when batching up operations
1 parent a563b97 commit c1b31fa

5 files changed

Lines changed: 60 additions & 3 deletions

File tree

cayenne/src/main/java/org/apache/cayenne/access/flush/operation/BaseDbRowOp.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,16 @@ public int hashCode() {
7676
public String toString() {
7777
return entity.getName() + " " + changeId;
7878
}
79+
80+
protected boolean entitiesHaveSameNameAndDataMap(DbRowOp rowOp) {
81+
return entitiesHaveSameName(rowOp) && entitiesHaveSameDataMap(rowOp);
82+
}
83+
84+
boolean entitiesHaveSameName(DbRowOp rowOp) {
85+
return rowOp.getEntity().getName().equals(getEntity().getName());
86+
}
87+
88+
private boolean entitiesHaveSameDataMap(DbRowOp rowOp) {
89+
return rowOp.getEntity().getDataMap().getName().equals(getEntity().getDataMap().getName());
90+
}
7991
}

cayenne/src/main/java/org/apache/cayenne/access/flush/operation/DeleteDbRowOp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public boolean isSameBatch(DbRowOp rowOp) {
5858
if(!(rowOp instanceof DeleteDbRowOp)) {
5959
return false;
6060
}
61-
if(!rowOp.getEntity().getName().equals(getEntity().getName())) {
61+
if(!entitiesHaveSameNameAndDataMap(rowOp)) {
6262
return false;
6363
}
6464
DeleteDbRowOp other = (DeleteDbRowOp) rowOp;

cayenne/src/main/java/org/apache/cayenne/access/flush/operation/InsertDbRowOp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public boolean isSameBatch(DbRowOp rowOp) {
6161
if(!(rowOp instanceof InsertDbRowOp)) {
6262
return false;
6363
}
64-
return rowOp.getEntity().getName().equals(getEntity().getName());
64+
return entitiesHaveSameNameAndDataMap(rowOp);
6565
}
6666

6767
@Override

cayenne/src/main/java/org/apache/cayenne/access/flush/operation/UpdateDbRowOp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public boolean isSameBatch(DbRowOp rowOp) {
5757
if(!(rowOp instanceof UpdateDbRowOp)) {
5858
return false;
5959
}
60-
if(!rowOp.getEntity().getName().equals(getEntity().getName())) {
60+
if(!entitiesHaveSameNameAndDataMap(rowOp)) {
6161
return false;
6262
}
6363
UpdateDbRowOp other = (UpdateDbRowOp) rowOp;

cayenne/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.cayenne.access.flush.operation.DeleteDbRowOp;
3333
import org.apache.cayenne.access.flush.operation.InsertDbRowOp;
3434
import org.apache.cayenne.access.flush.operation.UpdateDbRowOp;
35+
import org.apache.cayenne.map.DataMap;
3536
import org.apache.cayenne.map.DbAttribute;
3637
import org.apache.cayenne.map.DbEntity;
3738
import org.apache.cayenne.query.DeleteBatchQuery;
@@ -168,6 +169,45 @@ public void createQueries() {
168169
assertEquals(1, delete2.getRows().size());
169170
}
170171

172+
@Test
173+
public void dontMergeSameTableNameOnDifferentDataMaps() {
174+
DbEntity test1Datamap1 = mockEntity("test1", "datamap1");
175+
DbEntity test1Datamap2 = mockEntity("test1", "datamap2");
176+
DbEntity test2Datamap1 = mockEntity("test2", "datamap1");
177+
DbEntity test2Datamap2 = mockEntity("test2", "datamap2");
178+
DbEntity test3Datamap1 = mockEntity("test3", "datamap1");
179+
DbEntity test3Datamap2 = mockEntity("test3", "datamap2");
180+
181+
ObjectId id1 = ObjectId.of("test1", "id", 1);
182+
ObjectId id2 = ObjectId.of("test1", "id", 2);
183+
ObjectId id3 = ObjectId.of("test2", "id", 3);
184+
ObjectId id4 = ObjectId.of("test2", "id", 4);
185+
ObjectId id5 = ObjectId.of("test3", "id", 5);
186+
ObjectId id6 = ObjectId.of("test3", "id", 6);
187+
188+
UpdateDbRowOp update1 = new UpdateDbRowOp(mockObject(id3), test2Datamap1, id3);
189+
update1.getValues().addValue(new DbAttribute("attr"), "abc", false);
190+
update1.getValues().addValue(new DbAttribute("attr"), "abc", false);
191+
192+
UpdateDbRowOp update2 = new UpdateDbRowOp(mockObject(id4), test2Datamap2, id4);
193+
update2.getValues().addValue(new DbAttribute("attr"), "def", false);
194+
update2.getValues().addValue(new DbAttribute("attr"), "def", false);
195+
List<DbRowOp> ops = List.of(
196+
new InsertDbRowOp(mockObject(id1), test1Datamap1, id1),
197+
new InsertDbRowOp(mockObject(id2), test1Datamap2, id2),
198+
update1,
199+
update2,
200+
new DeleteDbRowOp(mockObject(id5), test3Datamap1, id5),
201+
new DeleteDbRowOp(mockObject(id6), test3Datamap2, id6)
202+
);
203+
204+
DefaultDataDomainFlushAction action = mock(DefaultDataDomainFlushAction.class);
205+
when(action.createQueries((List<DbRowOp>) any(List.class))).thenCallRealMethod();
206+
207+
List<? extends Query> queries = action.createQueries(ops);
208+
assertEquals(6, queries.size());
209+
}
210+
171211
private Persistent mockObject(ObjectId id) {
172212
Persistent persistent = mock(Persistent.class);
173213
when(persistent.getObjectId()).thenReturn(id);
@@ -176,12 +216,17 @@ private Persistent mockObject(ObjectId id) {
176216
}
177217

178218
private DbEntity mockEntity(String name) {
219+
return mockEntity(name, "defaultMap");
220+
}
221+
222+
private DbEntity mockEntity(String name, String datamapName) {
179223
DbAttribute attribute1 = new DbAttribute("id");
180224
attribute1.setPrimaryKey(true);
181225
DbAttribute attribute2 = new DbAttribute("attr");
182226
DbEntity testEntity = new DbEntity(name);
183227
testEntity.addAttribute(attribute1);
184228
testEntity.addAttribute(attribute2);
229+
testEntity.setDataMap(new DataMap(datamapName));
185230
return testEntity;
186231
}
187232
}

0 commit comments

Comments
 (0)