You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/11/16 18:45:58 UTC

[3/9] cayenne git commit: - Reverse Engineering Fix: toMany relationships are not created

- Reverse Engineering Fix: toMany relationships are not created


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/8718ee95
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/8718ee95
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/8718ee95

Branch: refs/heads/master
Commit: 8718ee95e320b62a271e720ca4bee57bbd5a0994
Parents: db9a49d
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Nov 8 15:24:06 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Nov 8 15:24:06 2016 +0300

----------------------------------------------------------------------
 .../dbsync/merge/AddRelationshipToModel.java    |   7 +-
 .../apache/cayenne/dbsync/merge/DbMerger.java   |  23 ++--
 .../dbsync/merge/DropRelationshipToDb.java      |   7 +-
 .../dbsync/merge/DropRelationshipToModelIT.java |   4 +-
 .../cayenne/dbsync/merge/MergerFactoryIT.java   |   8 +-
 .../cayenne/dbsync/merge/TokensReversTest.java  |  92 ----------------
 .../cayenne/dbsync/merge/TokensReverseTest.java | 108 +++++++++++++++++++
 7 files changed, 134 insertions(+), 115 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java
index bae2a20..2e7dbd4 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AddRelationshipToModel.java
@@ -61,11 +61,12 @@ public class AddRelationshipToModel extends AbstractToModelToken.Entity {
 
     @Override
     public void execute(MergerContext context) {
+        // Set name to relationship if it was created without it, e.g. in createReverse() action
+        if(relationship.getName() == null) {
+            relationship.setName(context.getNameGenerator().relationshipName(relationship));
+        }
 
         getEntity().addRelationship(relationship);
-
-        // TODO: add reverse relationship as well if it does not exist
-
         for (ObjEntity e : getEntity().mappedObjEntities()) {
             context.getEntityMergeSupport().synchronizeOnDbRelationshipAdded(e, relationship);
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
index 8f0adb7..a1f7d56 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbMerger.java
@@ -250,8 +250,7 @@ public class DbMerger {
         for (DbRelationship detected : detectedEntity.getRelationships()) {
             if (findDbRelationship(dbEntity, detected) == null) {
 
-                // alter detected relationship to match entity and attribute
-                // names.
+                // alter detected relationship to match entity and attribute names.
                 // (case sensitively)
 
                 DbEntity targetEntity = findDbEntity(dbEntity.getDataMap().getDbEntities(),
@@ -275,16 +274,13 @@ public class DbMerger {
                     }
                 }
 
-                MergerToken token = tokenFactory.createDropRelationshipToDb(dbEntity, detected);
-                if (detected.isToMany()) {
-                    // default toModel as we can not do drop a toMany in the db.
-                    // only
-                    // toOne are represented using foreign key
-                    tokens.addAll(token.createReverse(tokenFactory));
-                } else {
+                // There is only one FK in the database so we create
+                // DropRelationshipToDb token only for direct relationships
+                // and skip token for toMany relationships
+                if (!detected.isToMany()) {
+                    MergerToken token = tokenFactory.createDropRelationshipToDb(dbEntity, detected);
                     tokens.add(token);
                 }
-                tokens.add(token);
             }
         }
 
@@ -301,10 +297,9 @@ public class DbMerger {
 
                 if (token.shouldGenerateFkConstraint()) {
                     // TODO I guess we should add relationship always; in order
-                    // to have ability
-                    // TODO generate reverse relationship. If it doesn't have
-                    // anything to execute it will be passed
-                    // TODO through execution without any affect on db
+                    // TODO to have ability generate reverse relationship.
+                    // TODO If it doesn't have anything to execute it will be
+                    // TODO passed through execution without any affect on db
                     tokens.add(token);
                 }
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToDb.java
index b037cca..c94236b 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToDb.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DropRelationshipToDb.java
@@ -61,7 +61,12 @@ public class DropRelationshipToDb extends AbstractToDbToken.Entity {
     public Collection<MergerToken> createReverse(MergerTokenFactory factory) {
         Collection<MergerToken> result = new ArrayList<>();
         result.add(factory.createAddRelationshipToModel(getEntity(), relationship));
-        result.add(factory.createAddRelationshipToModel(relationship.getTargetEntity(), relationship.createReverseRelationship()));
+        DbRelationship reverse = relationship.getReverseRelationship();
+        if(reverse == null) {
+            reverse = relationship.createReverseRelationship();
+            // NB name will be set in AddRelationshipToModel.execute() call
+            result.add(factory.createAddRelationshipToModel(relationship.getTargetEntity(), reverse));
+        }
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
index 2271e25..41d6dbf 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DropRelationshipToModelIT.java
@@ -130,18 +130,20 @@ public class DropRelationshipToModelIT extends MergeCase {
         dbEntity1.removeRelationship(rel1To2.getName());
         dbEntity2.removeAttribute(e2col2.getName());
         List<MergerToken> tokens = createMergeTokens();
+
         /**
          * Add Relationship NEW_TABLE->NEW_TABLE2 To Model
          * Drop Relationship NEW_TABLE2->NEW_TABLE To DB
          * Drop Column NEW_TABLE2.FK To DB
          * */
-        assertTokens(tokens, 2, 1);
+        assertTokens(tokens, 2, 0);
         for (MergerToken token : tokens) {
             if (token.getDirection().isToDb()) {
                 execute(token);
             }
         }
         assertTokensAndExecute(0, 0);
+
         dbEntity2.addRelationship(rel2To1);
         dbEntity1.addRelationship(rel1To2);
         dbEntity2.addAttribute(e2col2);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergerFactoryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergerFactoryIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergerFactoryIT.java
index 1fe7da7..1e92c14 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergerFactoryIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergerFactoryIT.java
@@ -221,9 +221,9 @@ public class MergerFactoryIT extends MergeCase {
         resolver.refreshMappingCache();
         /*
          * Db -Rel 'toArtistR1' - NEW_TABLE 1 -> 1 ARTIST"
-r2 =     * Db -Rel 'toNewTableR2' - ARTIST 1 -> * NEW_TABLE"
+r2 =     * Db -Rel 'toNewTableR2' - ARTIST 1 -> * NEW_TABLE" -- Not generated any more
          * */
-        assertTokensAndExecute(1, 1);
+        assertTokensAndExecute(1, 0);
         assertTokensAndExecute(0, 0);
 
         // clear up
@@ -281,10 +281,10 @@ r2 =     * Db -Rel 'toNewTableR2' - ARTIST 1 -> * NEW_TABLE"
         artistDbEntity.removeRelationship(r2.getName());
         resolver.refreshMappingCache();
         /*
-        * Add Relationship ARTIST->NEW_TABLE To Model
+        * Add Relationship ARTIST->NEW_TABLE To Model -- Not generated any more
         * Drop Relationship NEW_TABLE->ARTIST To DB
         * */
-        assertTokensAndExecute(1, 1);
+        assertTokensAndExecute(1, 0);
         assertTokensAndExecute(0, 0);
 
         // clear up

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReversTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReversTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReversTest.java
deleted file mode 100644
index 411b253..0000000
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReversTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.dbsync.merge;
-
-import org.apache.cayenne.dbsync.merge.factory.HSQLMergerTokenFactory;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbJoin;
-import org.apache.cayenne.map.DbRelationship;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbAttr;
-import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbEntity;
-
-/**
- * @since 4.0.
- */
-public class TokensReversTest {
-
-    @Test
-    public void testReverses() {
-        DbAttribute attr = dbAttr().build();
-        DbEntity entity = dbEntity().attributes(attr).build();
-        DbRelationship rel = new DbRelationship("rel");
-        rel.setSourceEntity(entity);
-        rel.addJoin(new DbJoin(rel, attr.getName(), "dontKnow"));
-
-        test(factory().createAddColumnToDb(entity, attr));
-        test(factory().createAddColumnToModel(entity, attr));
-        test(factory().createDropColumnToDb(entity, attr));
-        test(factory().createDropColumnToModel(entity, attr));
-
-        test(factory().createAddRelationshipToDb(entity, rel));
-        test(factory().createAddRelationshipToModel(entity, rel));
-        test(factory().createDropRelationshipToDb(entity, rel));
-        test(factory().createDropRelationshipToModel(entity, rel));
-
-        test(factory().createCreateTableToDb(entity));
-        test(factory().createCreateTableToModel(entity));
-        test(factory().createDropTableToDb(entity));
-        test(factory().createDropTableToModel(entity));
-
-        test(factory().createSetAllowNullToDb(entity, attr));
-        test(factory().createSetAllowNullToModel(entity, attr));
-        test(factory().createSetNotNullToDb(entity, attr));
-        test(factory().createSetNotNullToModel(entity, attr));
-
-        DbAttribute attr2 = dbAttr().build();
-        test(factory().createSetColumnTypeToDb(entity, attr, attr2));
-        test(factory().createSetColumnTypeToModel(entity, attr, attr2));
-
-        test(factory().createSetPrimaryKeyToDb(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
-        test(factory().createSetPrimaryKeyToModel(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
-
-        test(factory().createSetValueForNullToDb(entity, attr, new DefaultValueForNullProvider()));
-    }
-
-    private void test(MergerToken token1) {
-        MergerToken token2 = token1.createReverse(factory()).iterator().next()
-                                    .createReverse(factory()).iterator().next();
-
-
-        Assert.assertEquals(token1.getTokenName(), token2.getTokenName());
-        Assert.assertEquals(token1.getTokenValue(), token2.getTokenValue());
-        Assert.assertEquals(token1.getDirection(), token2.getDirection());
-    }
-
-    private MergerTokenFactory factory() {
-        return new HSQLMergerTokenFactory();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8718ee95/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java
new file mode 100644
index 0000000..34cd7cb
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/TokensReverseTest.java
@@ -0,0 +1,108 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.dbsync.merge;
+
+import org.apache.cayenne.dbsync.merge.factory.HSQLMergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbAttr;
+import static org.apache.cayenne.dbsync.merge.builders.ObjectMother.dbEntity;
+
+/**
+ * @since 4.0.
+ */
+public class TokensReverseTest {
+
+    @Test
+    public void testReverses() {
+        DbAttribute attr = dbAttr().build();
+        DbEntity entity = dbEntity().attributes(attr).build();
+        DbRelationship rel = new DbRelationship("rel");
+        rel.setSourceEntity(entity);
+        rel.addJoin(new DbJoin(rel, attr.getName(), "dontKnow"));
+
+        testOneToOneReverse(factory().createAddColumnToDb(entity, attr));
+        testOneToOneReverse(factory().createAddColumnToModel(entity, attr));
+        testOneToOneReverse(factory().createDropColumnToDb(entity, attr));
+        testOneToOneReverse(factory().createDropColumnToModel(entity, attr));
+
+        testOneToOneReverse(factory().createAddRelationshipToDb(entity, rel));
+        testCreateAddRelationshipToModel(factory().createAddRelationshipToModel(entity, rel));
+        testCreateDropRelationshipToDb(factory().createDropRelationshipToDb(entity, rel));
+        testOneToOneReverse(factory().createDropRelationshipToModel(entity, rel));
+
+        testOneToOneReverse(factory().createCreateTableToDb(entity));
+        testOneToOneReverse(factory().createCreateTableToModel(entity));
+        testOneToOneReverse(factory().createDropTableToDb(entity));
+        testOneToOneReverse(factory().createDropTableToModel(entity));
+
+        testOneToOneReverse(factory().createSetAllowNullToDb(entity, attr));
+        testOneToOneReverse(factory().createSetAllowNullToModel(entity, attr));
+        testOneToOneReverse(factory().createSetNotNullToDb(entity, attr));
+        testOneToOneReverse(factory().createSetNotNullToModel(entity, attr));
+
+        DbAttribute attr2 = dbAttr().build();
+        testOneToOneReverse(factory().createSetColumnTypeToDb(entity, attr, attr2));
+        testOneToOneReverse(factory().createSetColumnTypeToModel(entity, attr, attr2));
+
+        testOneToOneReverse(factory().createSetPrimaryKeyToDb(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
+        testOneToOneReverse(factory().createSetPrimaryKeyToModel(entity, Collections.singleton(attr), Collections.singleton(attr2), "PK"));
+
+        testOneToOneReverse(factory().createSetValueForNullToDb(entity, attr, new DefaultValueForNullProvider()));
+    }
+
+    private void testReversTokenWithCount(MergerToken token, int countFirstReverse, int countSecondReverse) {
+        Collection<MergerToken> collectionReverse1 = token.createReverse(factory());
+        Assert.assertEquals(countFirstReverse, collectionReverse1.size());
+
+        Collection<MergerToken> collectionReverse2 = collectionReverse1.iterator().next().createReverse(factory());
+        Assert.assertEquals(countSecondReverse, collectionReverse2.size());
+
+        MergerToken token2 = collectionReverse2.iterator().next();
+
+        Assert.assertEquals(token.getTokenName(), token2.getTokenName());
+        Assert.assertEquals(token.getTokenValue(), token2.getTokenValue());
+        Assert.assertEquals(token.getDirection(), token2.getDirection());
+    }
+
+    private void testCreateAddRelationshipToModel(MergerToken token1) {
+        testReversTokenWithCount(token1, 1, 2);
+    }
+
+    private void testCreateDropRelationshipToDb(MergerToken token1) {
+        testReversTokenWithCount(token1, 2, 1);
+    }
+
+    private void testOneToOneReverse(MergerToken token1) {
+        testReversTokenWithCount(token1, 1, 1);
+    }
+
+    private MergerTokenFactory factory() {
+        return new HSQLMergerTokenFactory();
+    }
+}