Skip to content

Commit 9e2c5c4

Browse files
Christopher Thonfeld-Guckesstariy95
authored andcommitted
CAY-2896 Factor in datamap name when batching up operations
(cherry picked from commit c1b31fa)
1 parent 5488fe4 commit 9e2c5c4

5 files changed

Lines changed: 60 additions & 3 deletions

File tree

cayenne-server/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-server/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-server/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-server/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-server/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;
@@ -167,6 +168,45 @@ public void createQueries() {
167168
assertEquals(1, delete2.getRows().size());
168169
}
169170

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

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

0 commit comments

Comments
 (0)