create primary keys on directly on table creation instead of a seperate operation

This commit is contained in:
wea_ondara
2022-11-27 07:58:29 +01:00
parent 1f90bc551b
commit 3e581a9e4a
9 changed files with 56 additions and 54 deletions

View File

@@ -152,11 +152,18 @@ public class MigrationBuilderGenerator {
private String addTableOp(AddTableOperation op) {
imports.add(List.class);
imports.add(AddFieldOperation.class);
imports.add(AddFieldOperation.Builder.class);
if (op.getPrimaryKey() != null) {
imports.add(AddPrimaryKeyOperation.class);
}
return "mb.addTable(\"" + op.getTable() + "\", List.of(\n"
+ op.getFields().stream()
/**/.map(f -> " new AddFieldOperation.Builder(\"" + op.getTable() + "\", \"" + f.build().getField() + "\")" + addFieldOpOptional(f.build()).replace("\n", "\n "))
/**/.collect(Collectors.joining(",\n")) + "\n"
/**/.collect(Collectors.joining(",\n")) + "),\n"
+ (op.getPrimaryKey() != null
? " new AddPrimaryKeyOperation.Builder(\"" + op.getPrimaryKey().build().getName() + "\", \"" + op.getPrimaryKey().build().getTable() + "\", List.of("
+ op.getPrimaryKey().build().getFields().stream().map(e -> "\"" + e + "\"").collect(Collectors.joining(", "))
+ ")"
: " null")
+ "));";
}

View File

@@ -146,7 +146,10 @@ public class MigrationCreator {
.map(e -> new AddFieldOperation.Builder(toEntity.getName(), e.getName())
.notNull(e.isNotNull())
.sqlType(getSqlType(e)))
.toList()
.toList(),
Optional.ofNullable(toEntity.getPrimaryKey())
.map(e -> new AddPrimaryKeyOperation.Builder(e.getName(), toEntity.getName(), e.getFields().stream().map(DbField::getName).toList()))
.orElse(null)
));
}
}
@@ -265,7 +268,9 @@ public class MigrationCreator {
var involvedFields = toEntity.getFields();
var involvedForeignKeys = originalEntity.getPrimaryKey() != null
&& originalEntity.getPrimaryKey().getFields().stream().anyMatch(involvedFields::contains);
if (involvedForeignKeys) {
var alreadyCreatedDuringTableCreation = steps.stream().anyMatch(e -> e instanceof AddTableOperation.Builder ato
&& ato.build().getTable().equals(originalEntity.getPrimaryKey().getEntity().getName()));
if (involvedForeignKeys && !alreadyCreatedDuringTableCreation) {
steps.add(new AddPrimaryKeyOperation.Builder(
originalEntity.getPrimaryKey().getName(),
originalEntity.getPrimaryKey().getEntity().getName(),
@@ -347,6 +352,12 @@ public class MigrationCreator {
private void addPrimaryKeyDropGeneration(ModelBuilder fromReduced, ModelBuilder toReduced, ModelBuilder from, ModelBuilder to, List<MigrationOperation.Builder<?>> steps) {
for (var fromEntity : fromReduced.getEntities()) {
var toEntity = toReduced.getEntity(fromEntity.getTypeName());
if (toEntity == null) {
//table will be dropped -> no need to drop the primary key separately
continue;
}
var originalEntity = from.getEntities().stream().filter(e -> e.getName().equals(fromEntity.getName())).findFirst().orElse(null);
Check.notNull(originalEntity, "originalEntity"); //may never be null
var involvedFields = fromEntity.getFields();

View File

@@ -46,19 +46,17 @@ public class MigrationCreatorAddEntityTest extends MigrationCreatorTestBase {
}
private void validateUp(MigrationCreator.Result res) {
assertEquals(3, res.getStepsUp().size());
assertEquals(2, res.getStepsUp().size());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddTableOperation o
&& o.getTable().equals("AddedEntity")
&& o.getFields().size() == 2
&& o.getFields().stream().filter(f -> f.build().getField().equals("id")).count() == 1
&& o.getFields().stream().filter(f -> f.build().getField().equals("addedField")).count() == 1)
.count());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddPrimaryKeyOperation o
&& o.getTable().equals("AddedEntity")
&& o.getFields().size() == 1
&& o.getFields().get(0).equals("id"))
&& o.getFields().stream().filter(f -> f.build().getField().equals("addedField")).count() == 1
&& o.getPrimaryKey() != null
&& o.getPrimaryKey().build().getTable().equals("AddedEntity")
&& o.getPrimaryKey().build().getFields().size() == 1
&& o.getPrimaryKey().build().getFields().get(0).equals("id"))
.count());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddForeignKeyOperation o
@@ -72,17 +70,12 @@ public class MigrationCreatorAddEntityTest extends MigrationCreatorTestBase {
}
private void validateDown(MigrationCreator.Result res) {
assertEquals(3, res.getStepsDown().size());
assertEquals(2, res.getStepsDown().size());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropConstraintOperation o
&& o.getTable().equals("AddedEntity")
&& o.getName().equals("FK_AddedEntity_AddedEntity_addedField"))
.count());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropConstraintOperation o
&& o.getTable().equals("AddedEntity")
&& o.getName().equals("PRIMARY"))
.count());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropTableOperation o
&& o.getTable().equals("AddedEntity"))

View File

@@ -6,7 +6,6 @@ import jef.model.ModelBuilder;
import jef.model.annotations.Clazz;
import jef.model.annotations.Id;
import jef.model.migration.operation.AddForeignKeyOperation;
import jef.model.migration.operation.AddPrimaryKeyOperation;
import jef.model.migration.operation.AddTableOperation;
import jef.model.migration.operation.DropConstraintOperation;
import jef.model.migration.operation.DropTableOperation;
@@ -39,12 +38,16 @@ public class MigrationCreatorInitialMigrationTest extends MigrationCreatorTestBa
}
private void validateUp(MigrationCreator.Result res) {
assertEquals(5, res.getStepsUp().size());
assertEquals(3, res.getStepsUp().size());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddTableOperation o
&& o.getTable().equals("objects1")
&& o.getFields().size() == 1
&& o.getFields().get(0).build().getField().equals("i"))
&& o.getFields().get(0).build().getField().equals("i")
&& o.getPrimaryKey() != null
&& o.getPrimaryKey().build().getTable().equals("objects1")
&& o.getPrimaryKey().build().getFields().size() == 1
&& o.getPrimaryKey().build().getFields().get(0).equals("i"))
.count());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddTableOperation o
@@ -55,19 +58,11 @@ public class MigrationCreatorInitialMigrationTest extends MigrationCreatorTestBa
&& o.getFields().stream().filter(f -> f.build().getField().equals("i")).count() == 1
&& o.getFields().stream().filter(f -> f.build().getField().equals("l")).count() == 1
&& o.getFields().stream().filter(f -> f.build().getField().equals("o")).count() == 1
&& o.getFields().stream().filter(f -> f.build().getField().equals("nestedI")).count() == 1)
.count());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddPrimaryKeyOperation o
&& o.getTable().equals("objects1")
&& o.getFields().size() == 1
&& o.getFields().get(0).equals("i"))
.count());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddPrimaryKeyOperation o
&& o.getTable().equals("TestClass")
&& o.getFields().size() == 1
&& o.getFields().get(0).equals("i"))
&& o.getFields().stream().filter(f -> f.build().getField().equals("nestedI")).count() == 1
&& o.getPrimaryKey() != null
&& o.getPrimaryKey().build().getTable().equals("TestClass")
&& o.getPrimaryKey().build().getFields().size() == 1
&& o.getPrimaryKey().build().getFields().get(0).equals("i"))
.count());
assertEquals(1, res.getStepsUp().stream()
.filter(e -> e instanceof AddForeignKeyOperation o
@@ -81,22 +76,12 @@ public class MigrationCreatorInitialMigrationTest extends MigrationCreatorTestBa
}
private void validateDown(MigrationCreator.Result res) {
assertEquals(5, res.getStepsDown().size());
assertEquals(3, res.getStepsDown().size());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropConstraintOperation o
&& o.getTable().equals("TestClass")
&& o.getName().equals("FK_TestClass_objects1_nestedI"))
.count());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropConstraintOperation o
&& o.getTable().equals("TestClass")
&& o.getName().equals("PRIMARY"))
.count());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropConstraintOperation o
&& o.getTable().equals("objects1")
&& o.getName().equals("PRIMARY"))
.count());
assertEquals(1, res.getStepsDown().stream()
.filter(e -> e instanceof DropTableOperation o