You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2021/02/02 14:32:09 UTC
[cayenne] branch master updated: CAY-2687 Modeler Migrate
Repeatedly Asks to Set Column Type for MySQL Database
This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 27b2159 CAY-2687 Modeler Migrate Repeatedly Asks to Set Column Type for MySQL Database
new 85827c1 Merge pull request #442 from KravchenkoAS/cay-2687
27b2159 is described below
commit 27b215959cccf318c5773c7fffa093a2287a7588
Author: andreykravchenko <an...@objectstyle.com>
AuthorDate: Thu Nov 26 10:11:46 2020 +0300
CAY-2687 Modeler Migrate Repeatedly Asks to Set Column Type for MySQL Database
---
.../cayenne/dbsync/merge/DbAttributeMerger.java | 2 +-
.../merge/factory/DefaultMergerTokenFactory.java | 5 +
.../dbsync/merge/factory/MergerTokenFactory.java | 2 +
.../merge/factory/MySQLMergerTokenFactory.java | 10 ++
.../apache/cayenne/dbsync/merge/CheckTypeTest.java | 161 +++++++++++++++++++++
5 files changed, 179 insertions(+), 1 deletion(-)
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
index 2f796e0..8e0500f 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
@@ -133,7 +133,7 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
(imported.getType() == Types.DECIMAL || imported.getType() == Types.NUMERIC)) {
return false;
}
- return true;
+ return getTokenFactory().needUpdateSpecificType(original, imported);
}
if(original.getMaxLength() != imported.getMaxLength()) {
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
index 4b9af94..b3b6e13 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/DefaultMergerTokenFactory.java
@@ -215,4 +215,9 @@ public class DefaultMergerTokenFactory implements MergerTokenFactory {
public MergerToken createSetGeneratedFlagToModel(DbEntity entity, DbAttribute column, boolean isGenerated) {
return new SetGeneratedFlagToModel(entity, column, isGenerated);
}
+
+ @Override
+ public boolean needUpdateSpecificType(DbAttribute columnOriginal, DbAttribute columnNew) {
+ return true;
+ }
}
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
index 60d9c9d..757711a 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MergerTokenFactory.java
@@ -98,4 +98,6 @@ public interface MergerTokenFactory {
MergerToken createSetGeneratedFlagToDb(DbEntity entity, DbAttribute column, boolean isGenerated);
MergerToken createSetGeneratedFlagToModel(DbEntity entity, DbAttribute column, boolean isGenerated);
+
+ boolean needUpdateSpecificType(DbAttribute columnOriginal, DbAttribute columnNew);
}
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
index c67fe93..82b5d76 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/factory/MySQLMergerTokenFactory.java
@@ -31,6 +31,7 @@ import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbRelationship;
+import java.sql.Types;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -181,4 +182,13 @@ public class MySQLMergerTokenFactory extends DefaultMergerTokenFactory {
}
};
}
+
+ @Override
+ public boolean needUpdateSpecificType(DbAttribute columnOriginal, DbAttribute columnNew) {
+ if ( (columnOriginal.getType() == Types.BOOLEAN && columnNew.getType() == Types.BIT) ||
+ (columnOriginal.getType() == Types.BLOB && columnNew.getType() == Types.LONGVARBINARY)) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CheckTypeTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CheckTypeTest.java
new file mode 100644
index 0000000..eabbb6c
--- /dev/null
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/CheckTypeTest.java
@@ -0,0 +1,161 @@
+package org.apache.cayenne.dbsync.merge;
+
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.MySQLMergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.PostgresMergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.map.*;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Types;
+import java.util.Collection;
+
+import static org.junit.Assert.assertEquals;
+
+public class CheckTypeTest {
+
+ DbEntity dbEntity;
+
+ DbAttribute original;
+
+ DbAttribute imported;
+
+ MergerTokenFactory mergerTokenFactory;
+
+ MergerDiffPair<DbAttribute> diffPair;
+
+ DbAttributeMerger dbAttributeMerger;
+
+ @Before
+ public void setUp(){
+ dbEntity = new DbEntity("NEW_TABLE");
+
+ original = new DbAttribute("NAME");
+ original.setEntity(dbEntity);
+ dbEntity.addAttribute(original);
+
+ imported = new DbAttribute("NAME");
+ imported.setEntity(dbEntity);
+
+ mergerTokenFactory = new MySQLMergerTokenFactory();
+ diffPair = new MergerDiffPair(original, imported);
+ dbAttributeMerger = new DbAttributeMerger(mergerTokenFactory, null);
+ }
+
+ @Test
+ public void testCheckBooleanBitTypeMySQL() {
+
+ original.setType(Types.BOOLEAN);
+ imported.setType(Types.BIT);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(0, mergerTokens.size());
+ }
+
+ @Test
+ public void testCheckBlobLongvarbinaryTypeMySQL() {
+
+ original.setType(Types.BLOB);
+ imported.setType(Types.LONGVARBINARY);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(0, mergerTokens.size());
+ }
+
+ @Test
+ public void testCheckBooleanIntegerTypeMySQL() {
+
+ original.setType(Types.BOOLEAN);
+ imported.setType(Types.INTEGER);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(1, mergerTokens.size());
+
+ MergerToken mergerToken1 = (MergerToken) mergerTokens.toArray()[0];
+ String mergerToken = "NEW_TABLE.NAME type: INTEGER -> BOOLEAN";
+ assertEquals(mergerToken, mergerToken1.getTokenValue());
+ }
+
+ @Test
+ public void testCheckBooleanBitTypePostgres() {
+
+ original.setType(Types.BOOLEAN);
+ imported.setType(Types.BIT);
+
+ mergerTokenFactory = new PostgresMergerTokenFactory();
+
+ dbAttributeMerger = new DbAttributeMerger(mergerTokenFactory, null);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(1, mergerTokens.size());
+
+ MergerToken mergerToken1 = (MergerToken) mergerTokens.toArray()[0];
+ String mergerToken = "NEW_TABLE.NAME type: BIT -> BOOLEAN";
+ assertEquals(mergerToken, mergerToken1.getTokenValue());
+ }
+
+ @Test
+ public void testCheckNumericDecimalType() {
+
+ original.setType(Types.NUMERIC);
+ imported.setType(Types.DECIMAL);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(0, mergerTokens.size());
+ }
+
+ @Test
+ public void testCheckMaxLengthType() {
+
+ original.setType(Types.CHAR);
+ original.setMaxLength(1);
+ imported.setType(Types.CHAR);
+ imported.setMaxLength(2);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(1, mergerTokens.size());
+
+ MergerToken mergerToken1 = (MergerToken) mergerTokens.toArray()[0];
+ String mergerToken = "NEW_TABLE.NAME maxLength: 2 -> 1";
+ assertEquals(mergerToken, mergerToken1.getTokenValue());
+ }
+
+ @Test
+ public void testCheckScaleType() {
+
+ original.setScale(1);
+ imported.setScale(2);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(1, mergerTokens.size());
+
+ MergerToken mergerToken1 = (MergerToken) mergerTokens.toArray()[0];
+ String mergerToken = "NEW_TABLE.NAME scale: 2 -> 1";
+ assertEquals(mergerToken, mergerToken1.getTokenValue());
+ }
+
+ @Test
+ public void testCheckAttributePrecisionType() {
+
+ original.setAttributePrecision(1);
+ imported.setAttributePrecision(2);
+
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(1, mergerTokens.size());
+
+ MergerToken mergerToken1 = (MergerToken) mergerTokens.toArray()[0];
+ String mergerToken = "NEW_TABLE.NAME precision: 2 -> 1";
+ assertEquals(mergerToken, mergerToken1.getTokenValue());
+ }
+
+ @Test
+ public void testCheckTypeWithoutChanges() {
+
+ diffPair = new MergerDiffPair(original, imported);
+
+ dbAttributeMerger = new DbAttributeMerger(mergerTokenFactory, null);
+ Collection<MergerToken> mergerTokens = dbAttributeMerger.createTokensForSame(diffPair);
+ assertEquals(0, mergerTokens.size());
+ }
+}