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