This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch STABLE-4.2
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
new 9e2c5c495 CAY-2896 Factor in datamap name when batching up operations
9e2c5c495 is described below
commit 9e2c5c495bd0682974d729774e0d930b6f187866
Author: Christopher Thonfeld-Guckes <[email protected]>
AuthorDate: Tue Sep 23 16:01:02 2025 +0200
CAY-2896 Factor in datamap name when batching up operations
(cherry picked from commit c1b31fad12bbd991b07bc9345b4962a51850f01b)
---
.../access/flush/operation/BaseDbRowOp.java | 12 ++++++
.../access/flush/operation/DeleteDbRowOp.java | 2 +-
.../access/flush/operation/InsertDbRowOp.java | 2 +-
.../access/flush/operation/UpdateDbRowOp.java | 2 +-
.../flush/DefaultDataDomainFlushActionTest.java | 45 ++++++++++++++++++++++
5 files changed, 60 insertions(+), 3 deletions(-)
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/BaseDbRowOp.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/BaseDbRowOp.java
index 1602aca39..e5c40198e 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/BaseDbRowOp.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/BaseDbRowOp.java
@@ -76,4 +76,16 @@ public abstract class BaseDbRowOp implements DbRowOp {
public String toString() {
return entity.getName() + " " + changeId;
}
+
+ protected boolean entitiesHaveSameNameAndDataMap(DbRowOp rowOp) {
+ return entitiesHaveSameName(rowOp) && entitiesHaveSameDataMap(rowOp);
+ }
+
+ boolean entitiesHaveSameName(DbRowOp rowOp) {
+ return rowOp.getEntity().getName().equals(getEntity().getName());
+ }
+
+ private boolean entitiesHaveSameDataMap(DbRowOp rowOp) {
+ return
rowOp.getEntity().getDataMap().getName().equals(getEntity().getDataMap().getName());
+ }
}
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/DeleteDbRowOp.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/DeleteDbRowOp.java
index fc5328002..9cc9cc34b 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/DeleteDbRowOp.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/DeleteDbRowOp.java
@@ -58,7 +58,7 @@ public class DeleteDbRowOp extends BaseDbRowOp implements
DbRowOpWithQualifier {
if(!(rowOp instanceof DeleteDbRowOp)) {
return false;
}
- if(!rowOp.getEntity().getName().equals(getEntity().getName())) {
+ if(!entitiesHaveSameNameAndDataMap(rowOp)) {
return false;
}
DeleteDbRowOp other = (DeleteDbRowOp) rowOp;
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/InsertDbRowOp.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/InsertDbRowOp.java
index e0cd7d214..f02b8ed04 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/InsertDbRowOp.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/InsertDbRowOp.java
@@ -61,7 +61,7 @@ public class InsertDbRowOp extends BaseDbRowOp implements
DbRowOpWithValues {
if(!(rowOp instanceof InsertDbRowOp)) {
return false;
}
- return rowOp.getEntity().getName().equals(getEntity().getName());
+ return entitiesHaveSameNameAndDataMap(rowOp);
}
@Override
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/UpdateDbRowOp.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/UpdateDbRowOp.java
index badc6ad2b..0dc8f2b92 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/UpdateDbRowOp.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/flush/operation/UpdateDbRowOp.java
@@ -57,7 +57,7 @@ public class UpdateDbRowOp extends BaseDbRowOp implements
DbRowOpWithValues, DbR
if(!(rowOp instanceof UpdateDbRowOp)) {
return false;
}
- if(!rowOp.getEntity().getName().equals(getEntity().getName())) {
+ if(!entitiesHaveSameNameAndDataMap(rowOp)) {
return false;
}
UpdateDbRowOp other = (UpdateDbRowOp) rowOp;
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
b/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
index 9f1b0c30a..4e5ea320a 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/access/flush/DefaultDataDomainFlushActionTest.java
@@ -32,6 +32,7 @@ import org.apache.cayenne.access.flush.operation.DbRowOp;
import org.apache.cayenne.access.flush.operation.DeleteDbRowOp;
import org.apache.cayenne.access.flush.operation.InsertDbRowOp;
import org.apache.cayenne.access.flush.operation.UpdateDbRowOp;
+import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.query.DeleteBatchQuery;
@@ -167,6 +168,45 @@ public class DefaultDataDomainFlushActionTest {
assertEquals(1, delete2.getRows().size());
}
+ @Test
+ public void dontMergeSameTableNameOnDifferentDataMaps() {
+ DbEntity test1Datamap1 = mockEntity("test1", "datamap1");
+ DbEntity test1Datamap2 = mockEntity("test1", "datamap2");
+ DbEntity test2Datamap1 = mockEntity("test2", "datamap1");
+ DbEntity test2Datamap2 = mockEntity("test2", "datamap2");
+ DbEntity test3Datamap1 = mockEntity("test3", "datamap1");
+ DbEntity test3Datamap2 = mockEntity("test3", "datamap2");
+
+ ObjectId id1 = ObjectId.of("test1", "id", 1);
+ ObjectId id2 = ObjectId.of("test1", "id", 2);
+ ObjectId id3 = ObjectId.of("test2", "id", 3);
+ ObjectId id4 = ObjectId.of("test2", "id", 4);
+ ObjectId id5 = ObjectId.of("test3", "id", 5);
+ ObjectId id6 = ObjectId.of("test3", "id", 6);
+
+ UpdateDbRowOp update1 = new UpdateDbRowOp(mockObject(id3),
test2Datamap1, id3);
+ update1.getValues().addValue(new DbAttribute("attr"), "abc", false);
+ update1.getValues().addValue(new DbAttribute("attr"), "abc", false);
+
+ UpdateDbRowOp update2 = new UpdateDbRowOp(mockObject(id4),
test2Datamap2, id4);
+ update2.getValues().addValue(new DbAttribute("attr"), "def", false);
+ update2.getValues().addValue(new DbAttribute("attr"), "def", false);
+ List<DbRowOp> ops = List.of(
+ new InsertDbRowOp(mockObject(id1), test1Datamap1, id1),
+ new InsertDbRowOp(mockObject(id2), test1Datamap2, id2),
+ update1,
+ update2,
+ new DeleteDbRowOp(mockObject(id5), test3Datamap1, id5),
+ new DeleteDbRowOp(mockObject(id6), test3Datamap2, id6)
+ );
+
+ DefaultDataDomainFlushAction action =
mock(DefaultDataDomainFlushAction.class);
+ when(action.createQueries((List<DbRowOp>)
any(List.class))).thenCallRealMethod();
+
+ List<? extends Query> queries = action.createQueries(ops);
+ assertEquals(6, queries.size());
+ }
+
private Persistent mockObject(ObjectId id) {
Persistent persistent = mock(Persistent.class);
when(persistent.getObjectId()).thenReturn(id);
@@ -175,12 +215,17 @@ public class DefaultDataDomainFlushActionTest {
}
private DbEntity mockEntity(String name) {
+ return mockEntity(name, "defaultMap");
+ }
+
+ private DbEntity mockEntity(String name, String datamapName) {
DbAttribute attribute1 = new DbAttribute("id");
attribute1.setPrimaryKey(true);
DbAttribute attribute2 = new DbAttribute("attr");
DbEntity testEntity = new DbEntity(name);
testEntity.addAttribute(attribute1);
testEntity.addAttribute(attribute2);
+ testEntity.setDataMap(new DataMap(datamapName));
return testEntity;
}
}
\ No newline at end of file