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

Reply via email to