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/12/22 13:39:52 UTC

[1/4] cayenne git commit: Fix DataMapMerger case sensitivity issues - can miss relationship and attribute change if name in mixed upper- and lowercase

Repository: cayenne
Updated Branches:
  refs/heads/master c32288d51 -> ac00b99f6


Fix DataMapMerger case sensitivity issues
 - can miss relationship and attribute change if name in mixed upper- and lowercase


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

Branch: refs/heads/master
Commit: 65233b24df5bfeb8363edc41182f794c23394c32
Parents: c32288d
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Dec 16 14:30:46 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 22 14:21:31 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/AbstractMerger.java    | 14 +++--
 .../cayenne/dbsync/merge/ChainMerger.java       |  6 +--
 .../cayenne/dbsync/merge/DataMapMerger.java     | 16 +++---
 .../cayenne/dbsync/merge/DbAttributeMerger.java |  6 +--
 .../cayenne/dbsync/merge/DbEntityMerger.java    | 13 +++--
 .../dbsync/merge/DbRelationshipMerger.java      | 19 ++++---
 .../dbsync/merge/MergerDictionaryDiff.java      | 31 +++++------
 .../cayenne/tools/DbImporterMojoTest.java       |  5 ++
 .../dbimport/testDbAttributeChange-pom.xml      | 45 ++++++++++++++++
 .../dbimport/testDbAttributeChange.map.xml      | 52 ++++++++++++++++++
 .../testDbAttributeChange.map.xml-result        | 55 ++++++++++++++++++++
 .../tools/dbimport/testDbAttributeChange.sql    | 42 +++++++++++++++
 12 files changed, 259 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AbstractMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AbstractMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AbstractMerger.java
index 4a6b2b7..dbef541 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AbstractMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/AbstractMerger.java
@@ -31,13 +31,10 @@ abstract class AbstractMerger<T, M> implements Merger<T> {
 
     private MergerDictionaryDiff<M> diff;
     private MergerTokenFactory tokenFactory;
-    DataMap originalDataMap;
-    DataMap importedDataMap;
+    private DbEntityDictionary originalDictionary;
 
-    AbstractMerger(MergerTokenFactory tokenFactory, DataMap original, DataMap imported) {
+    AbstractMerger(MergerTokenFactory tokenFactory) {
         this.tokenFactory = tokenFactory;
-        this.originalDataMap = original;
-        this.importedDataMap = imported;
     }
 
     @Override
@@ -89,4 +86,11 @@ abstract class AbstractMerger<T, M> implements Merger<T> {
 
     abstract Collection<MergerToken> createTokensForSame(MergerDiffPair<M> same);
 
+    public void setOriginalDictionary(DbEntityDictionary originalDictionary) {
+        this.originalDictionary = originalDictionary;
+    }
+
+    public DbEntityDictionary getOriginalDictionary() {
+        return originalDictionary;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ChainMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ChainMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ChainMerger.java
index e70c295..f732441 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ChainMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/ChainMerger.java
@@ -32,9 +32,8 @@ class ChainMerger<T, M> extends AbstractMerger<T, M> {
 
     private final AbstractMerger<?, T> parentMerger;
 
-    ChainMerger(MergerTokenFactory tokenFactory, DataMap original, DataMap imported,
-                AbstractMerger<T, M> merger, AbstractMerger<?, T> parentMerger) {
-        super(tokenFactory, original, imported);
+    ChainMerger(MergerTokenFactory tokenFactory, AbstractMerger<T, M> merger, AbstractMerger<?, T> parentMerger) {
+        super(tokenFactory);
         this.merger = merger;
         this.parentMerger = parentMerger;
     }
@@ -48,6 +47,7 @@ class ChainMerger<T, M> extends AbstractMerger<T, M> {
     MergerDictionaryDiff<M> createDiff(T unused1, T unused2) {
         MergerDictionaryDiff<M> diff = new MergerDictionaryDiff<>();
         MergerDictionaryDiff<T> parentDiff = parentMerger.getDiff();
+        merger.setOriginalDictionary(parentMerger.getOriginalDictionary());
         for(MergerDiffPair<T> pair : parentDiff.getSame()) {
             diff.addAll(merger.createDiff(pair.getOriginal(), pair.getImported()));
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
index 7b78321..80c9134 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DataMapMerger.java
@@ -60,8 +60,8 @@ public class DataMapMerger implements Merger<DataMap> {
         prepare(original, importedFromDb);
 
         createDbEntityMerger(original, importedFromDb);
-        createRelationshipMerger(original, importedFromDb);
-        createAttributeMerger(original, importedFromDb);
+        createRelationshipMerger();
+        createAttributeMerger();
 
         return createTokens();
     }
@@ -84,19 +84,19 @@ public class DataMapMerger implements Merger<DataMap> {
         mergerList.add(dbEntityMerger);
     }
 
-    private void createAttributeMerger(DataMap original, DataMap imported) {
+    private void createAttributeMerger() {
         ChainMerger<DbEntity, DbAttribute> dbAttributeMerger = new ChainMerger<>(
-                tokenFactory, original, imported,
-                new DbAttributeMerger(tokenFactory, original, imported, valueForNull),
+                tokenFactory,
+                new DbAttributeMerger(tokenFactory, valueForNull),
                 dbEntityMerger
         );
         mergerList.add(dbAttributeMerger);
     }
 
-    private void createRelationshipMerger(DataMap original, DataMap imported) {
+    private void createRelationshipMerger() {
         ChainMerger<DbEntity, DbRelationship> dbRelationshipMerger = new ChainMerger<>(
-                tokenFactory, original, imported,
-                new DbRelationshipMerger(tokenFactory, original, imported, skipRelationshipsTokens),
+                tokenFactory,
+                new DbRelationshipMerger(tokenFactory, skipRelationshipsTokens),
                 dbEntityMerger
         );
         mergerList.add(dbRelationshipMerger);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
----------------------------------------------------------------------
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 0ee74b3..8cdbd16 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
@@ -36,8 +36,8 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
 
     private final ValueForNullProvider valueForNull;
 
-    DbAttributeMerger(MergerTokenFactory tokenFactory, DataMap original, DataMap imported, ValueForNullProvider valueForNull) {
-        super(tokenFactory, original, imported);
+    DbAttributeMerger(MergerTokenFactory tokenFactory, ValueForNullProvider valueForNull) {
+        super(tokenFactory);
         this.valueForNull = valueForNull;
     }
 
@@ -76,7 +76,7 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
      */
     @Override
     Collection<MergerToken> createTokensForMissingOriginal(DbAttribute imported) {
-        DbEntity originalDbEntity = originalDataMap.getDbEntity(imported.getEntity().getName());
+        DbEntity originalDbEntity = getOriginalDictionary().getByName(imported.getEntity().getName().toUpperCase());
         return Collections.singleton(getTokenFactory().createDropColumnToDb(originalDbEntity, imported));
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
index 9f7a7c6..84d7b75 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
@@ -40,12 +40,16 @@ class DbEntityMerger extends AbstractMerger<DataMap, DbEntity> {
 
     private final FiltersConfig filtersConfig;
     private final boolean skipPKTokens;
+    private DataMap originalDataMap;
+    private DataMap importedDataMap;
 
     DbEntityMerger(MergerTokenFactory tokenFactory, DataMap original, DataMap imported,
                    FiltersConfig filtersConfig, boolean skipPKTokens) {
-        super(tokenFactory, original, imported);
+        super(tokenFactory);
         this.filtersConfig = filtersConfig;
         this.skipPKTokens = skipPKTokens;
+        originalDataMap = original;
+        importedDataMap = imported;
     }
 
     @Override
@@ -55,10 +59,13 @@ class DbEntityMerger extends AbstractMerger<DataMap, DbEntity> {
 
     @Override
     MergerDictionaryDiff<DbEntity> createDiff(DataMap original, DataMap imported) {
-        return new MergerDictionaryDiff.Builder<DbEntity>()
-                .originalDictionary(new DbEntityDictionary(original, filtersConfig))
+        DbEntityDictionary dictionary = new DbEntityDictionary(original, filtersConfig);
+        MergerDictionaryDiff<DbEntity> diff = new MergerDictionaryDiff.Builder<DbEntity>()
+                .originalDictionary(dictionary)
                 .importedDictionary(new DbEntityDictionary(imported, null))
                 .build();
+        setOriginalDictionary(dictionary);
+        return diff;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbRelationshipMerger.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbRelationshipMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbRelationshipMerger.java
index 9bac4bb..46b90a5 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbRelationshipMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbRelationshipMerger.java
@@ -39,9 +39,8 @@ public class DbRelationshipMerger extends AbstractMerger<DbEntity, DbRelationshi
 
     private final boolean skipRelationshipsTokens;
 
-    DbRelationshipMerger(MergerTokenFactory tokenFactory,
-                         DataMap original, DataMap imported, boolean skipRelationshipsTokens) {
-        super(tokenFactory, original, imported);
+    DbRelationshipMerger(MergerTokenFactory tokenFactory, boolean skipRelationshipsTokens) {
+        super(tokenFactory);
         this.skipRelationshipsTokens = skipRelationshipsTokens;
     }
 
@@ -53,8 +52,12 @@ public class DbRelationshipMerger extends AbstractMerger<DbEntity, DbRelationshi
                 .build();
     }
 
-    private DbEntity getOriginalDbEntity(DbRelationship relationship) {
-        return originalDataMap.getDbEntity(relationship.getSourceEntity().getName());
+    private DbEntity getOriginalSourceDbEntity(DbRelationship relationship) {
+        return getOriginalDictionary().getByName(relationship.getSourceEntity().getName().toUpperCase());
+    }
+
+    private DbEntity getOriginalTargetDbEntity(DbRelationship relationship) {
+        return getOriginalDictionary().getByName(relationship.getTargetEntityName().toUpperCase());
     }
 
     /**
@@ -63,8 +66,8 @@ public class DbRelationshipMerger extends AbstractMerger<DbEntity, DbRelationshi
      */
     @Override
     Collection<MergerToken> createTokensForMissingOriginal(DbRelationship imported) {
-        DbEntity originalDbEntity = getOriginalDbEntity(imported);
-        DbEntity targetEntity = originalDataMap.getDbEntity(imported.getTargetEntityName());
+        DbEntity originalDbEntity = getOriginalSourceDbEntity(imported);
+        DbEntity targetEntity = getOriginalTargetDbEntity(imported);
 
         if (targetEntity == null) {
             return null;
@@ -98,7 +101,7 @@ public class DbRelationshipMerger extends AbstractMerger<DbEntity, DbRelationshi
         if(skipRelationshipsTokens) {
             return null;
         }
-        DbEntity originalDbEntity = getOriginalDbEntity(original);
+        DbEntity originalDbEntity = getOriginalSourceDbEntity(original);
         MergerToken token = getTokenFactory().createAddRelationshipToDb(originalDbEntity, original);
         return Collections.singleton(token);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerDictionaryDiff.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerDictionaryDiff.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerDictionaryDiff.java
index 29991cb..180b0a7 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerDictionaryDiff.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/MergerDictionaryDiff.java
@@ -19,9 +19,11 @@
 
 package org.apache.cayenne.dbsync.merge;
 
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 class MergerDictionaryDiff<T> {
 
@@ -48,6 +50,7 @@ class MergerDictionaryDiff<T> {
         private MergerDictionaryDiff<T> diff;
         private MergerDictionary<T> originalDictionary;
         private MergerDictionary<T> importedDictionary;
+        private Set<String> sameNames = new HashSet<>();
 
         Builder() {
             diff = new MergerDictionaryDiff<>();
@@ -79,7 +82,6 @@ class MergerDictionaryDiff<T> {
 
         private List<MergerDiffPair<T>> buildSame() {
             List<MergerDiffPair<T>> sameEntities = new LinkedList<>();
-            List<String> sameNames = new LinkedList<>();
             for(Map.Entry<String, T> entry : originalDictionary.getDictionary().entrySet()) {
                 String name = entry.getKey();
                 T original = entry.getValue();
@@ -91,27 +93,26 @@ class MergerDictionaryDiff<T> {
                 }
             }
 
-            // clean up found names
-            for(String name : sameNames) {
-                originalDictionary.remove(name);
-                importedDictionary.remove(name);
-            }
-
             return sameEntities;
         }
 
         private List<MergerDiffPair<T>> buildMissing() {
             List<MergerDiffPair<T>> missingEntities = new LinkedList<>();
-            for(T original : originalDictionary.getDictionary().values()) {
-                MergerDiffPair<T> pair = new MergerDiffPair<>(original, null);
-                missingEntities.add(pair);
-            }
-            for(T imported : importedDictionary.getDictionary().values()) {
-                MergerDiffPair<T> pair = new MergerDiffPair<>(null, imported);
+            addMissingFromDictionary(missingEntities, originalDictionary, true);
+            addMissingFromDictionary(missingEntities, importedDictionary, false);
+            return missingEntities;
+        }
+
+        private void addMissingFromDictionary(List<MergerDiffPair<T>> missingEntities, MergerDictionary<T> dictionary, boolean isOriginal) {
+            for(Map.Entry<String, T> entry : dictionary.getDictionary().entrySet()) {
+                if(sameNames.contains(entry.getKey())) {
+                    continue;
+                }
+                MergerDiffPair<T> pair = new MergerDiffPair<>(
+                        isOriginal ? entry.getValue() : null,
+                        isOriginal ? null : entry.getValue());
                 missingEntities.add(pair);
             }
-            return missingEntities;
         }
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
index b9dbcb2..f8ca8f3 100644
--- a/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
+++ b/plugins/maven-cayenne-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoTest.java
@@ -202,6 +202,11 @@ public class DbImporterMojoTest extends AbstractMojoTestCase {
         test("testCustomObjectLayerSettings");
     }
 
+    @Test
+    public void testDbAttributeChange() throws Exception {
+        test("testDbAttributeChange");
+    }
+
 	@Test
 	public void testForceDataMapSchema() throws Exception {
 		test("testForceDataMapSchema");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange-pom.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange-pom.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange-pom.xml
new file mode 100644
index 0000000..0ae2de3
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange-pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   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.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <name>DbImporterMojo Test1</name>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-cayenne-plugin</artifactId>
+                <configuration>
+                    <map>target/test-classes/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml</map>
+                    <driver>org.apache.derby.jdbc.EmbeddedDriver</driver>
+                    <url>jdbc:derby:memory:DbImporterMojoTest;create=true</url>
+
+                    <reverseEngineering>
+                        <schema>
+                            <name>SCHEMA_01</name>
+                        </schema>
+                    </reverseEngineering>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
new file mode 100644
index 0000000..dc09869
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   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.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+          project-version="9">
+
+    <db-entity name="parent" schema="SCHEMA_01">
+        <db-attribute name="COL2" type="CHAR" length="25"/>
+        <db-attribute name="COL3" type="DECIMAL" length="10" scale="2"/>
+        <db-attribute name="COL4" type="VARCHAR" length="25"/>
+        <db-attribute name="COL5" type="DATE" length="10"/>
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <db-entity name="CHILD" schema="SCHEMA_01">
+        <db-attribute name="col1" type="INTEGER"/>
+        <db-attribute name="col2" type="DECIMAL" length="10" scale="2"/>
+        <db-attribute name="COL4" type="VARCHAR" length="25"/>
+        <db-attribute name="COL5" type="DATE" length="10"/>
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+        <db-attribute name="PARENT_ID" type="CHAR" length="25"/>
+    </db-entity>
+    <obj-entity name="Child" className="Child" dbEntityName="CHILD">
+        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
+        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
+        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
+        <obj-attribute name="parentId" type="java.lang.String" db-attribute-path="PARENT_ID"/>
+    </obj-entity>
+    <obj-entity name="Parent" className="Parent" dbEntityName="parent">
+        <obj-attribute name="col2" type="java.lang.String" db-attribute-path="COL2"/>
+        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
+        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
+        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
+    </obj-entity>
+</data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
new file mode 100644
index 0000000..441b533
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   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.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+<data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+          project-version="9">
+
+    <db-entity name="CHILD" schema="SCHEMA_01">
+        <db-attribute name="COL3" type="DECIMAL" length="5" scale="1"/>
+        <db-attribute name="COL4" type="VARCHAR" length="25"/>
+        <db-attribute name="COL5" type="DATE" length="10"/>
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+        <db-attribute name="PARENT_ID" type="CHAR" length="25"/>
+        <db-attribute name="col1" type="DOUBLE" length="52"/>
+        <db-attribute name="col2" type="CHAR" length="25"/>
+    </db-entity>
+    <db-entity name="parent" schema="SCHEMA_01">
+        <db-attribute name="COL2" type="CHAR" length="20"/>
+        <db-attribute name="COL3" type="DECIMAL" length="10" scale="2"/>
+        <db-attribute name="COL4" type="VARCHAR" length="50"/>
+        <db-attribute name="COL5" type="TIME" length="8"/>
+        <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
+    </db-entity>
+    <obj-entity name="Child" className="Child" dbEntityName="CHILD">
+        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
+        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
+        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
+        <obj-attribute name="parentId" type="java.lang.String" db-attribute-path="PARENT_ID"/>
+    </obj-entity>
+    <obj-entity name="Parent" className="Parent" dbEntityName="parent">
+        <obj-attribute name="col2" type="java.lang.String" db-attribute-path="COL2"/>
+        <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
+        <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
+        <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
+    </obj-entity>
+
+</data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/65233b24/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
new file mode 100644
index 0000000..6a2800e
--- /dev/null
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
@@ -0,0 +1,42 @@
+--  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.
+
+CREATE SCHEMA schema_01;
+SET SCHEMA schema_01;
+
+CREATE TABLE schema_01.parent (
+  id INTEGER NOT NULL,
+  COL2 CHAR(20),
+  COL3 DECIMAL(10,2),
+  COL4 VARCHAR(50),
+  COL5 TIME,
+
+  PRIMARY KEY (id),
+  UNIQUE (COL3)
+);
+
+CREATE TABLE schema_01.child (
+  id INTEGER NOT NULL,
+  Parent_id CHAR(25),
+  COL1 FLOAT,
+  COL2 CHAR(25),
+  COL3 DECIMAL(5,1),
+  COL4 VARCHAR(25),
+  COL5 DATE,
+
+  PRIMARY KEY (id)
+);
\ No newline at end of file


[3/4] cayenne git commit: Merge branch '168'

Posted by sk...@apache.org.
Merge branch '168'


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

Branch: refs/heads/master
Commit: b2460d6cb6f98fdfe6adf7b8b8fb819595d2a505
Parents: c32288d 4d14b71
Author: Savva Kolbachev <s....@gmail.com>
Authored: Thu Dec 22 16:18:05 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Thu Dec 22 16:18:05 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/AbstractMerger.java    | 14 ++--
 .../cayenne/dbsync/merge/ChainMerger.java       |  6 +-
 .../cayenne/dbsync/merge/DataMapMerger.java     | 16 ++---
 .../cayenne/dbsync/merge/DbAttributeMerger.java | 11 ++-
 .../cayenne/dbsync/merge/DbEntityMerger.java    | 13 +++-
 .../dbsync/merge/DbRelationshipMerger.java      | 19 ++---
 .../dbsync/merge/MergerDictionaryDiff.java      | 31 ++++----
 .../merge/token/db/SetColumnTypeToDb.java       |  8 +++
 .../dbsync/reverse/dbload/DbLoadDataStore.java  |  8 +++
 .../cayenne/dbsync/merge/DataMapMergerTest.java | 74 ++++++++++++++++++++
 .../apache/cayenne/dbsync/merge/MergeCase.java  | 43 +++++++++++-
 .../merge/builders/DbAttributeBuilder.java      |  5 ++
 .../dbsync/reverse/dbload/BaseLoaderIT.java     | 10 ++-
 .../dbsync/reverse/dbload/DbLoaderIT.java       | 17 +++--
 .../reverse/dbload/ExportedKeyLoaderIT.java     | 19 +++--
 .../reverse/dbload/PrimaryKeyLoaderIT.java      |  8 +--
 .../cayenne/unit/OracleUnitDbAdapter.java       | 10 +++
 .../cayenne/unit/PostgresUnitDbAdapter.java     |  4 ++
 .../cayenne/unit/SQLServerUnitDbAdapter.java    |  5 ++
 .../org/apache/cayenne/unit/UnitDbAdapter.java  | 12 ++++
 .../cayenne/tools/DbImporterMojoTest.java       |  5 ++
 .../dbimport/testDbAttributeChange-pom.xml      | 45 ++++++++++++
 .../dbimport/testDbAttributeChange.map.xml      | 62 ++++++++++++++++
 .../testDbAttributeChange.map.xml-result        | 62 ++++++++++++++++
 .../tools/dbimport/testDbAttributeChange.sql    | 46 ++++++++++++
 25 files changed, 488 insertions(+), 65 deletions(-)
----------------------------------------------------------------------



[2/4] cayenne git commit: Fix DataMapMerger case sensitivity issues - can miss relationship and attribute change if name in mixed upper- and lowercase - fix test failures caused by lower- and uppercase names - additional tests - fix test failures for

Posted by sk...@apache.org.
Fix DataMapMerger case sensitivity issues
 - can miss relationship and attribute change if name in mixed upper- and lowercase
 - fix test failures caused by lower- and uppercase names
 - additional tests
 - fix test failures for Postgres (and partially for Oracle and SQLServer but tests needed)


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

Branch: refs/heads/master
Commit: 4d14b7182dad5389c80721c64fefd5895d5290b5
Parents: 65233b2
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 22 15:09:35 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 22 15:09:35 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/DbAttributeMerger.java |  5 ++
 .../merge/token/db/SetColumnTypeToDb.java       |  8 +++
 .../dbsync/reverse/dbload/DbLoadDataStore.java  |  8 +++
 .../cayenne/dbsync/merge/DataMapMergerTest.java | 74 ++++++++++++++++++++
 .../apache/cayenne/dbsync/merge/MergeCase.java  | 43 +++++++++++-
 .../merge/builders/DbAttributeBuilder.java      |  5 ++
 .../dbsync/reverse/dbload/BaseLoaderIT.java     | 10 ++-
 .../dbsync/reverse/dbload/DbLoaderIT.java       | 17 +++--
 .../reverse/dbload/ExportedKeyLoaderIT.java     | 19 +++--
 .../reverse/dbload/PrimaryKeyLoaderIT.java      |  8 +--
 .../cayenne/unit/OracleUnitDbAdapter.java       | 10 +++
 .../cayenne/unit/PostgresUnitDbAdapter.java     |  4 ++
 .../cayenne/unit/SQLServerUnitDbAdapter.java    |  5 ++
 .../org/apache/cayenne/unit/UnitDbAdapter.java  | 12 ++++
 .../dbimport/testDbAttributeChange.map.xml      | 12 +++-
 .../testDbAttributeChange.map.xml-result        | 11 ++-
 .../tools/dbimport/testDbAttributeChange.sql    |  8 ++-
 17 files changed, 234 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbAttributeMerger.java
----------------------------------------------------------------------
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 8cdbd16..fcf859d 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
@@ -122,6 +122,11 @@ class DbAttributeMerger extends AbstractMerger<DbEntity, DbAttribute> {
      */
     private boolean needUpdateType(DbAttribute original, DbAttribute imported) {
         if(original.getType() != imported.getType()) {
+            // Decimal and NUMERIC types are effectively equal so skip their interchange
+            if( (original.getType() == Types.DECIMAL || original.getType() == Types.NUMERIC) &&
+                (imported.getType() == Types.DECIMAL || imported.getType() == Types.NUMERIC)) {
+                return false;
+            }
             return true;
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
index 331d550..f03e929 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/SetColumnTypeToDb.java
@@ -110,4 +110,12 @@ public class SetColumnTypeToDb extends AbstractToDbToken.Entity {
     public MergerToken createReverse(MergerTokenFactory factory) {
         return factory.createSetColumnTypeToModel(getEntity(), columnNew, columnOriginal);
     }
+
+    public DbAttribute getColumnNew() {
+        return columnNew;
+    }
+
+    public DbAttribute getColumnOriginal() {
+        return columnOriginal;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
index ec06163..c1a6e4c 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoadDataStore.java
@@ -43,16 +43,24 @@ public class DbLoadDataStore extends DataMap {
 
     private Map<String, Set<ExportedKey>> exportedKeys = new HashMap<>();
 
+    private Map<String, DbEntity> upperCaseNames = new HashMap<>();
+
     DbLoadDataStore() {
         super("__generated_by_dbloader__");
     }
 
     @Override
+    public DbEntity getDbEntity(String dbEntityName) {
+        return upperCaseNames.get(dbEntityName.toUpperCase());
+    }
+
+    @Override
     public void addDbEntity(DbEntity entity) {
         if(!(entity instanceof DetectedDbEntity)) {
             throw new IllegalArgumentException("Only DetectedDbEntity can be inserted in this map");
         }
         super.addDbEntity(entity);
+        upperCaseNames.put(entity.getName().toUpperCase(), entity);
     }
 
     DbEntity addDbEntitySafe(DbEntity entity) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
index 5196fa9..aced949 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/DataMapMergerTest.java
@@ -315,6 +315,64 @@ public class DataMapMergerTest {
     }
 
     @Test
+    public void testTableNameUppercaseRelationship() throws Exception {
+        DataMap existing = dataMap().with(
+                dbEntity("TABLE1").attributes(
+                        dbAttr("attr01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "TABLE1.attr01", "table2.attr01").build();
+
+        DataMap db = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "table1.attr01", "table2.attr01").build();
+
+
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing, db);
+        assertEquals(0, tokens.size());
+    }
+
+    @Test
+    public void testAttributeNameUppercaseRelationship() throws Exception {
+        DataMap existing = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("ATTR01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "table1.ATTR01", "table2.attr01").build();
+
+        DataMap db = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeInt(),
+                        dbAttr("attr02").typeInt()),
+
+                dbEntity("table2").attributes(
+                        dbAttr("attr01").typeInt().primaryKey(),
+                        dbAttr("attr02").typeInt().primaryKey(),
+                        dbAttr("attr03").typeInt().primaryKey())
+        ).join("rel", "table1.attr01", "table2.attr01").build();
+
+
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing, db);
+        assertEquals(0, tokens.size());
+    }
+
+    @Test
     public void testRemoveRelationship() throws Exception {
         DataMap existing = dataMap().with(
             dbEntity("table1").attributes(
@@ -371,6 +429,22 @@ public class DataMapMergerTest {
     }
 
     @Test
+    public void testChangeGeneratedStatus() {
+        DataMap existing = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeVarchar(10)
+                )).build();
+
+        DataMap db = dataMap().with(
+                dbEntity("table1").attributes(
+                        dbAttr("attr01").typeInt().generated()
+                )).build();
+
+        List<MergerToken> tokens = dbMerger().createMergeTokens(existing, db);
+        assertEquals(2, tokens.size());
+    }
+
+    @Test
     public void testNoChanges() throws Exception {
         DataMap dataMap1 = dataMap().with(
                 dbEntity("table1").attributes(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
index 5c6053e..ef262ee 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/MergeCase.java
@@ -22,11 +22,13 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.dbsync.merge.context.MergerContext;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
+import org.apache.cayenne.dbsync.merge.token.db.SetColumnTypeToDb;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.naming.NoStemStemmer;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
@@ -128,7 +130,46 @@ public abstract class MergeCase extends DbSyncCase {
         }
 
         List<MergerToken> tokens = merger().filters(filters).build().createMergeTokens(map, dbImport);
-        return filterEmpty(tokens);
+        return filter(tokens);
+    }
+
+    private List<MergerToken> filter(List<MergerToken> tokens) {
+        return filterEmptyTypeChange(filterEmpty(tokens));
+    }
+
+    /**
+     * Filter out tokens for db attribute type change when types is same for specific DB
+     */
+    private List<MergerToken> filterEmptyTypeChange(List<MergerToken> tokens) {
+        List<MergerToken> tokensOut = new ArrayList<>();
+        for(MergerToken token : tokens) {
+            if(!(token instanceof SetColumnTypeToDb)) {
+                tokensOut.add(token);
+                continue;
+            }
+            SetColumnTypeToDb setColumnToDb = (SetColumnTypeToDb)token;
+            int toType = setColumnToDb.getColumnNew().getType();
+            int fromType = setColumnToDb.getColumnOriginal().getType();
+            // filter out conversions between date/time types
+            if(accessStackAdapter.onlyGenericDateType()) {
+                if(isDateTimeType(toType) && isDateTimeType(fromType)){
+                    continue;
+                }
+            }
+            // filter out conversions between numeric types
+            if(accessStackAdapter.onlyGenericNumberType()) {
+                if(TypesMapping.isNumeric(toType) && TypesMapping.isNumeric(fromType)) {
+                    continue;
+                }
+            }
+            tokensOut.add(token);
+        }
+
+        return tokensOut;
+    }
+
+    private static boolean isDateTimeType(int type) {
+        return type == Types.DATE || type == Types.TIME || type == Types.TIMESTAMP;
     }
 
     private List<MergerToken> filterEmpty(List<MergerToken> tokens) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
index 2d600f3..99739da 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
@@ -94,6 +94,11 @@ public class DbAttributeBuilder extends DefaultBuilder<DbAttribute> {
         return this;
     }
 
+    public DbAttributeBuilder generated() {
+        obj.setGenerated(true);
+        return this;
+    }
+
     @Override
     public DbAttribute build() {
         if (isEmpty(obj.getName())) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
index 1edc938..a3cf117 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/BaseLoaderIT.java
@@ -72,7 +72,7 @@ public class BaseLoaderIT extends ServerCase {
     void createDbEntities() {
         String[] names = {"ARTIST", "BLOB_TEST", "CLOB_TEST", "GENERATED_COLUMN_TEST"};
         for(String name : names) {
-            createEntity(name);
+            createEntity(nameForDb(name));
         }
     }
 
@@ -88,4 +88,12 @@ public class BaseLoaderIT extends ServerCase {
         }
         return de;
     }
+
+    String nameForDb(String name) {
+        if(accessStackAdapter.isLowerCaseNames()) {
+            return name.toLowerCase();
+        } else {
+            return name.toUpperCase();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
index d2e87a5..bc8365c 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/DbLoaderIT.java
@@ -82,16 +82,16 @@ public class DbLoaderIT extends ServerCase {
         assertNotNull(artist);
 
         // DbAttribute
-        DbAttribute id = artist.getAttribute("ARTIST_ID");
+        DbAttribute id = getDbAttribute(artist, "ARTIST_ID");
         assertNotNull(id);
         assertTrue(id.isMandatory());
         assertTrue(id.isPrimaryKey());
 
-        DbAttribute name = artist.getAttribute("ARTIST_NAME");
+        DbAttribute name = getDbAttribute(artist,"ARTIST_NAME");
         assertNotNull(name);
         assertTrue(name.isMandatory());
 
-        DbAttribute date = artist.getAttribute("DATE_OF_BIRTH");
+        DbAttribute date = getDbAttribute(artist,"DATE_OF_BIRTH");
         assertNotNull(date);
         assertFalse(date.isMandatory());
 
@@ -100,11 +100,20 @@ public class DbLoaderIT extends ServerCase {
 
         DbRelationship exhibits = artist.getRelationship("artistExhibits");
         assertNotNull(exhibits);
-        assertEquals("ARTIST_EXHIBIT", exhibits.getTargetEntityName());
+        assertEquals("ARTIST_EXHIBIT", exhibits.getTargetEntityName().toUpperCase());
         DbEntity target = exhibits.getTargetEntity();
         assertNotNull(target);
     }
 
+    private DbAttribute getDbAttribute(DbEntity ent, String name) {
+        DbAttribute da = ent.getAttribute(name);
+        // sometimes table names get converted to lowercase
+        if (da == null) {
+            da = ent.getAttribute(name.toLowerCase());
+        }
+
+        return da;
+    }
 
     @Before
     public void before() throws Exception {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
index 9e74d8c..73ba353 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/ExportedKeyLoaderIT.java
@@ -38,9 +38,9 @@ public class ExportedKeyLoaderIT extends BaseLoaderIT {
             return;
         }
 
-        createEntity("ARTIST");
-        createEntity("GALLERY");
-        createEntity("PAINTING");
+        createEntity(nameForDb("ARTIST"));
+        createEntity(nameForDb("GALLERY"));
+        createEntity(nameForDb("PAINTING"));
         DbEntity artist = getDbEntity("ARTIST");
         DbAttribute artistId = new DbAttribute("ARTIST_ID");
         artist.addAttribute(artistId);
@@ -65,21 +65,20 @@ public class ExportedKeyLoaderIT extends BaseLoaderIT {
         ExportedKey artistIdFk = findArtistExportedKey();
         assertNotNull(artistIdFk);
 
-        assertEquals("ARTIST", artistIdFk.getPk().getTable());
-        assertEquals("ARTIST_ID", artistIdFk.getPk().getColumn());
+        assertEquals("ARTIST", artistIdFk.getPk().getTable().toUpperCase());
+        assertEquals("ARTIST_ID", artistIdFk.getPk().getColumn().toUpperCase());
 
-        assertEquals("PAINTING", artistIdFk.getFk().getTable());
-        assertEquals("ARTIST_ID", artistIdFk.getFk().getColumn());
+        assertEquals("PAINTING", artistIdFk.getFk().getTable().toUpperCase());
+        assertEquals("ARTIST_ID", artistIdFk.getFk().getColumn().toUpperCase());
     }
 
-    ExportedKey findArtistExportedKey() {
+    private ExportedKey findArtistExportedKey() {
         for(Map.Entry<String, Set<ExportedKey>> entry : store.getExportedKeysEntrySet()) {
-            if(entry.getKey().endsWith(".ARTIST_ID")) {
+            if(entry.getKey().toUpperCase().endsWith(".ARTIST_ID")) {
                 return entry.getValue().iterator().next();
             }
         }
 
         return null;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
index 56be301..ae56185 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/PrimaryKeyLoaderIT.java
@@ -34,10 +34,10 @@ public class PrimaryKeyLoaderIT extends BaseLoaderIT {
     @Test
     public void testPrimaryKeyLoad() throws Exception {
         createDbEntities();
-        DbEntity artist = getDbEntity("ARTIST");
-        DbAttribute artistId = new DbAttribute("ARTIST_ID");
-        DbAttribute artistName = new DbAttribute("ARTIST_NAME");
-        DbAttribute artistId1 = new DbAttribute("ARTIST_ID1");
+        DbEntity artist = getDbEntity(nameForDb("ARTIST"));
+        DbAttribute artistId = new DbAttribute(nameForDb("ARTIST_ID"));
+        DbAttribute artistName = new DbAttribute(nameForDb("ARTIST_NAME"));
+        DbAttribute artistId1 = new DbAttribute(nameForDb("ARTIST_ID1"));
 
         artist.addAttribute(artistId);
         artist.addAttribute(artistName);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
index f0ebb94..9cb93fb 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/OracleUnitDbAdapter.java
@@ -120,4 +120,14 @@ public class OracleUnitDbAdapter extends UnitDbAdapter {
             proc.setReturningValue(true);
         }
     }
+
+    @Override
+    public boolean onlyGenericDateType() {
+        return true;
+    }
+
+    @Override
+    public boolean onlyGenericNumberType() {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
index 4182054..1843bc2 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/PostgresUnitDbAdapter.java
@@ -62,6 +62,10 @@ public class PostgresUnitDbAdapter extends UnitDbAdapter {
         }
     }
 
+    public boolean isLowerCaseNames() {
+        return true;
+    }
+
     @Override
     public boolean supportsGeneratedKeysDrop() {
         return true;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
index 5315d12..6c03130 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
@@ -63,6 +63,11 @@ public class SQLServerUnitDbAdapter extends SybaseUnitDbAdapter {
         return true;
     }
 
+    @Override
+    public boolean onlyGenericDateType() {
+        return true;
+    }
+
     // The code below was used with SQLServer <= 2005 to turn of autogenerated
     // keys.
     // Modern SQLServer driver supports autogen keys just fine.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
index 2bf63e0..445de16 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDbAdapter.java
@@ -347,6 +347,18 @@ public class UnitDbAdapter {
         return constraintMap;
     }
 
+    public boolean isLowerCaseNames() {
+        return false;
+    }
+
+    public boolean onlyGenericNumberType() {
+        return false;
+    }
+
+    public boolean onlyGenericDateType() {
+        return false;
+    }
+
     public boolean supportsNullBoolean() {
         return true;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
index dc09869..759090a 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml
@@ -35,7 +35,7 @@
         <db-attribute name="COL4" type="VARCHAR" length="25"/>
         <db-attribute name="COL5" type="DATE" length="10"/>
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-        <db-attribute name="PARENT_ID" type="CHAR" length="25"/>
+        <db-attribute name="parent_id" type="CHAR" length="25"/>
     </db-entity>
     <obj-entity name="Child" className="Child" dbEntityName="CHILD">
         <obj-attribute name="col3" type="java.math.BigDecimal" db-attribute-path="COL3"/>
@@ -49,4 +49,14 @@
         <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
         <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
     </obj-entity>
+
+    <db-relationship name="parent" source="CHILD" target="parent" toMany="false">
+        <db-attribute-pair source="parent_id" target="ID"/>
+    </db-relationship>
+    <db-relationship name="children" source="parent" target="CHILD" toMany="true">
+        <db-attribute-pair source="ID" target="parent_id"/>
+    </db-relationship>
+
+    <obj-relationship name="parent" source="Child" target="Parent" deleteRule="Nullify" db-relationship-path="parent"/>
+    <obj-relationship name="children" source="Parent" target="Child" deleteRule="Deny" db-relationship-path="children"/>
 </data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
index 441b533..c53bde2 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.map.xml-result
@@ -28,9 +28,9 @@
         <db-attribute name="COL4" type="VARCHAR" length="25"/>
         <db-attribute name="COL5" type="DATE" length="10"/>
         <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/>
-        <db-attribute name="PARENT_ID" type="CHAR" length="25"/>
         <db-attribute name="col1" type="DOUBLE" length="52"/>
         <db-attribute name="col2" type="CHAR" length="25"/>
+        <db-attribute name="parent_id" type="INTEGER" length="10"/>
     </db-entity>
     <db-entity name="parent" schema="SCHEMA_01">
         <db-attribute name="COL2" type="CHAR" length="20"/>
@@ -51,5 +51,12 @@
         <obj-attribute name="col4" type="java.lang.String" db-attribute-path="COL4"/>
         <obj-attribute name="col5" type="java.util.Date" db-attribute-path="COL5"/>
     </obj-entity>
-
+    <db-relationship name="parent" source="CHILD" target="parent" toMany="false">
+        <db-attribute-pair source="parent_id" target="ID"/>
+    </db-relationship>
+    <db-relationship name="children" source="parent" target="CHILD" toMany="true">
+        <db-attribute-pair source="ID" target="parent_id"/>
+    </db-relationship>
+    <obj-relationship name="parent" source="Child" target="Parent" deleteRule="Nullify" db-relationship-path="parent"/>
+    <obj-relationship name="children" source="Parent" target="Child" deleteRule="Deny" db-relationship-path="children"/>
 </data-map>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4d14b718/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
----------------------------------------------------------------------
diff --git a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
index 6a2800e..c93c802 100644
--- a/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
+++ b/plugins/maven-cayenne-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testDbAttributeChange.sql
@@ -31,7 +31,7 @@ CREATE TABLE schema_01.parent (
 
 CREATE TABLE schema_01.child (
   id INTEGER NOT NULL,
-  Parent_id CHAR(25),
+  parent_id INTEGER,
   COL1 FLOAT,
   COL2 CHAR(25),
   COL3 DECIMAL(5,1),
@@ -39,4 +39,8 @@ CREATE TABLE schema_01.child (
   COL5 DATE,
 
   PRIMARY KEY (id)
-);
\ No newline at end of file
+);
+
+ALTER TABLE schema_01.child
+    ADD FOREIGN KEY (parent_id)
+    REFERENCES schema_01.parent (id);
\ No newline at end of file


[4/4] cayenne git commit: enabling travis for postgres-docker profile

Posted by sk...@apache.org.
enabling travis for postgres-docker profile


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

Branch: refs/heads/master
Commit: ac00b99f61af05613168419bb5a6a52a8e32456a
Parents: b2460d6
Author: Savva Kolbachev <s....@gmail.com>
Authored: Thu Dec 22 16:39:23 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Thu Dec 22 16:39:23 2016 +0300

----------------------------------------------------------------------
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac00b99f/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 6a0de0b..8929e43 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -29,7 +29,7 @@ env:
   - DB_PROFILE=h2
   - DB_PROFILE=derby
   - DB_PROFILE=mysql-docker
-#  - DB_PROFILE=postgres-docker
+  - DB_PROFILE=postgres-docker
 
 jdk:
   - oraclejdk8