You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by jo...@apache.org on 2017/02/09 19:29:34 UTC

svn commit: r1782379 - in /cayenne/sandbox/cayenne-migrations: ./ src/main/java/org/apache/cayenne/migration/

Author: johnthuss
Date: Thu Feb  9 19:29:34 2017
New Revision: 1782379

URL: http://svn.apache.org/viewvc?rev=1782379&view=rev
Log:
Add more efficient way to add columns to existing tables

Simplify database-specific SQL file naming

Modified:
    cayenne/sandbox/cayenne-migrations/.classpath
    cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migration.java
    cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java
    cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migrator.java
    cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/SqlFileMigration.java

Modified: cayenne/sandbox/cayenne-migrations/.classpath
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/.classpath?rev=1782379&r1=1782378&r2=1782379&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/.classpath (original)
+++ cayenne/sandbox/cayenne-migrations/.classpath Thu Feb  9 19:29:34 2017
@@ -1,10 +1,32 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
-	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Modified: cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migration.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migration.java?rev=1782379&r1=1782378&r2=1782379&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migration.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migration.java Thu Feb  9 19:29:34 2017
@@ -63,8 +63,8 @@ public abstract class Migration {
     protected static final boolean MANDATORY = true;
     protected static final boolean OPTIONAL = false;
 
-	private DataNode node;
-	private MigrationDatabase database;
+	private final DataNode node;
+	private final MigrationDatabase database;
 	
 	public Migration(DataNode node) {
 		this.node = node;

Modified: cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java?rev=1782379&r1=1782378&r2=1782379&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationColumnNew.java Thu Feb  9 19:29:34 2017
@@ -18,6 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.migration;
 
+import java.util.List;
+
+import org.apache.cayenne.dba.postgres.PostgresAdapter;
+import org.apache.cayenne.merge.AbstractToDbToken;
+import org.apache.cayenne.merge.ArbitrarySqlToDb;
 import org.apache.cayenne.merge.MergerToken;
 
 /**
@@ -46,19 +51,34 @@ public class MigrationColumnNew extends
 	}
 	
 	protected void create() {
-		MergerToken op = factory().createAddColumnToDb(getTable().getEntity(), getAttribute());
-		getTable().getDatabase().addOperation(op);
-		
-		if (getDefaultValue() != null) {
-            setDefault(getDefaultValue());
-        }
-		
-		if (getAttribute().isMandatory()) {
-		    getTable().getDatabase().execute("UPDATE " +  getTable().getEntity().getFullyQualifiedName() + " SET " + getAttribute().getName() + " = " + sqlForLiteral(getDefaultValue()));
-		    
-            op = factory().createSetNotNullToDb(getTable().getEntity(), getAttribute());
-            getTable().getDatabase().addOperation(op);
-		}
+	    if (Migrator.USE_EFFICIENT_ALTER_TABLE) {
+	           MergerToken op = factory().createAddColumnToDb(getTable().getEntity(), getAttribute());
+	           String sql = ((AbstractToDbToken)op).createSql(getTable().getDatabase().getAdapter()).get(0);
+	           
+	           if (getDefaultValue() != null) {
+	               sql += " DEFAULT " + sqlForLiteral(getDefaultValue());
+	           }
+	           
+	           if (getAttribute().isMandatory()) {
+	               sql += " NOT NULL";
+	           }
+	           
+	           getTable().getDatabase().addOperation(new ArbitrarySqlToDb(sql));
+	    } else {
+    		MergerToken op = factory().createAddColumnToDb(getTable().getEntity(), getAttribute());
+    		getTable().getDatabase().addOperation(op);
+    		
+    		if (getDefaultValue() != null) {
+                setDefault(getDefaultValue());
+            }
+    		
+    		if (getAttribute().isMandatory()) {
+    		    getTable().getDatabase().execute("UPDATE " +  getTable().getEntity().getFullyQualifiedName() + " SET " + getAttribute().getName() + " = " + sqlForLiteral(getDefaultValue()));
+    		    
+                op = factory().createSetNotNullToDb(getTable().getEntity(), getAttribute());
+                getTable().getDatabase().addOperation(op);
+    		}
+	    }
 	}
 	
 }

Modified: cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migrator.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migrator.java?rev=1782379&r1=1782378&r2=1782379&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migrator.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/Migrator.java Thu Feb  9 19:29:34 2017
@@ -42,6 +42,8 @@ public class Migrator {
 
 	//private static final Logger log = Logger.getLogger(Migrator.class);
 
+    public static boolean USE_EFFICIENT_ALTER_TABLE = false;
+    
 	private final DataNode node;
 	private final String migrationsPackage;
 	private Connection connection;
@@ -154,7 +156,7 @@ public class Migrator {
                 node.getAdapter().mergerFactory(); // force adapter to resolve early
                 
 				getConnection();
-
+	            
 				for (DataMap map : node.getDataMaps()) {
 					
                     int version = currentDbVersion(map)+1;

Modified: cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/SqlFileMigration.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/SqlFileMigration.java?rev=1782379&r1=1782378&r2=1782379&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/SqlFileMigration.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/SqlFileMigration.java Thu Feb  9 19:29:34 2017
@@ -83,20 +83,8 @@ public class SqlFileMigration extends Mi
 	 * @return
 	 */
 	protected String databaseSpecificSqlFilename() {
-	    Connection conn = null;
-        try {
-            conn = getDataNode().getDataSource().getConnection();
-            String databaseProductName = getDatabase().getDatabaseProductName().replace(" ", "");
-            return getClass().getSimpleName() + "-" + databaseProductName + ".sql";
-        } catch (SQLException e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (conn != null) {
-                try {
-                    conn.close();
-                } catch (SQLException e) {}
-            }
-        }
+        String databaseProductName = getDatabase().getDatabaseProductName().replace(" ", "");
+        return getClass().getSimpleName() + "-" + databaseProductName + ".sql";
 	}
 	
 	/**