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();
+ }
+}