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