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 2014/01/28 20:57:13 UTC

svn commit: r1562196 - in /cayenne/sandbox/cayenne-migrations/src: main/java/org/apache/cayenne/migration/MigrationGenerator.java main/java/org/apache/cayenne/migration/MigrationTable.java test/java/org/apache/cayenne/migration/MigrationTableNewTest.java

Author: johnthuss
Date: Tue Jan 28 19:57:13 2014
New Revision: 1562196

URL: http://svn.apache.org/r1562196
Log:
Add option to create an index when creating a foreign key

Modified:
    cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationGenerator.java
    cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationTable.java
    cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableNewTest.java

Modified: cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationGenerator.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationGenerator.java?rev=1562196&r1=1562195&r2=1562196&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationGenerator.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationGenerator.java Tue Jan 28 19:57:13 2014
@@ -189,7 +189,7 @@ public class MigrationGenerator {
 
 		for (DbRelationship relationship : entity.getRelationships()) {
 			if (!relationship.isToMany() && relationship.isToPK()) {
-				buffer.append(String.format("\t\t%s.addForeignKey(\"%s\", \"%s\", \"%s\");\n", tableName, 
+				buffer.append(String.format("\t\t%s.addForeignKey(\"%s\", \"%s\", \"%s\", true);\n", tableName, 
 						relationship.getSourceAttributes().iterator().next().getName(),
 						fullyQualifiedTableName((DbEntity)relationship.getTargetEntity()),
 						relationship.getTargetAttributes().iterator().next().getName()));

Modified: cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationTable.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationTable.java?rev=1562196&r1=1562195&r2=1562196&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationTable.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/main/java/org/apache/cayenne/migration/MigrationTable.java Tue Jan 28 19:57:13 2014
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.merge.ArbitrarySqlToDb;
 import org.apache.cayenne.merge.MergerFactory;
 import org.apache.cayenne.merge.MergerToken;
 
@@ -301,9 +302,24 @@ public abstract class MigrationTable {
 	 * @param destinationColumnName
 	 */
 	public void addForeignKey(String sourceColumnName, String destinationTable, String destinationColumnName) {
-		MigrationRelationship relationship = new MigrationRelationship(this, sourceColumnName, destinationTable, destinationColumnName);
-		MergerToken op = factory().createAddRelationshipToDb(getEntity(), relationship.getRelationship());
-		getDatabase().addOperation(op);
+		addForeignKey(sourceColumnName, destinationTable, destinationColumnName, false);
 	}
-
+	
+    /**
+     * Adds a new foreign key constraint; works for both new and existing tables.
+     * @param sourceColumnName
+     * @param destinationTable
+     * @param destinationColumnName
+     */
+    public void addForeignKey(String sourceColumnName, String destinationTable, String destinationColumnName, boolean shouldCreateIndexIfNeeded) {
+        if (shouldCreateIndexIfNeeded) {
+            String indexName = getEntity().getName() + "_" + sourceColumnName + "_idx";
+            // TODO: the specific SQL should really come from the DbAdapter
+            getDatabase().addOperation(new ArbitrarySqlToDb(String.format("CREATE INDEX %s ON %s(%s)", indexName, getEntity().getName(), sourceColumnName)));
+        }
+        
+        MigrationRelationship relationship = new MigrationRelationship(this, sourceColumnName, destinationTable, destinationColumnName);
+        MergerToken op = factory().createAddRelationshipToDb(getEntity(), relationship.getRelationship());
+        getDatabase().addOperation(op);
+    }
 }

Modified: cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableNewTest.java
URL: http://svn.apache.org/viewvc/cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableNewTest.java?rev=1562196&r1=1562195&r2=1562196&view=diff
==============================================================================
--- cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableNewTest.java (original)
+++ cayenne/sandbox/cayenne-migrations/src/test/java/org/apache/cayenne/migration/MigrationTableNewTest.java Tue Jan 28 19:57:13 2014
@@ -30,6 +30,7 @@ import org.apache.cayenne.dba.postgres.P
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.merge.AddRelationshipToDb;
+import org.apache.cayenne.merge.ArbitrarySqlToDb;
 import org.apache.cayenne.merge.CreateTableToDb;
 import org.apache.cayenne.merge.SetValueForNullToDb;
 
@@ -111,4 +112,20 @@ public class MigrationTableNewTest exten
         assertEquals("pk", relationship.getJoins().get(0).getTarget().getName());
 	}
 	
+   public void testAddForeignKeyAndIndex() {
+        MigrationTableNew table = db.createTable("table");
+        table.addForeignKey("fk", "table2", "pk", true);
+        
+        assertEquals(3, table.getDatabase().getOperations().size());
+        assertTrue(table.getDatabase().getOperations().get(0) instanceof CreateTableToDb);
+        assertTrue(table.getDatabase().getOperations().get(1) instanceof ArbitrarySqlToDb);
+        assertTrue(table.getDatabase().getOperations().get(2) instanceof AddRelationshipToDb);
+
+        AddRelationshipToDb operation = (AddRelationshipToDb) table.getDatabase().getOperations().get(2);
+        DbRelationship relationship = operation.getRelationship();
+        assertEquals("table2", relationship.getTargetEntityName());
+        assertEquals("fk", relationship.getJoins().get(0).getSource().getName());
+        assertEquals("pk", relationship.getJoins().get(0).getTarget().getName());
+    }
+
 }