diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java index 89f52c6cb2d2b199e5b1883d10b4969fad3ec612..15986289ba848215a44cd50d7f4f8fdd97b27220 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java @@ -26,17 +26,17 @@ public class ForeignKeyReference { private Long id; @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false) private ForeignKey foreignKey; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false) }) private TableColumn column; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false) }) diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java index 1cb8f6d3949704cb18f635f1d90af0829d7c95e6..a0a8eab0cfc51369fa540382340d3b00cf358c52 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -540,17 +540,14 @@ public interface MetadataMapper { pk.getColumn().setDatabaseId(data.getDatabase().getId()); }); for (ForeignKeyDto fk : table.getConstraints().getForeignKeys()) { + fk.getTable().setDatabaseId(table.getTdbid()); + fk.getReferencedTable().setDatabaseId(table.getTdbid()); for (ForeignKeyReferenceDto ref : fk.getReferences()) { ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk)); ref.getColumn().setTableId(table.getId()); ref.getColumn().setDatabaseId(table.getTdbid()); - final Optional<TableColumn> optional = data.getDatabase().getTables().stream().map(Table::getColumns).flatMap(List::stream).filter(c -> c.getId().equals(ref.getReferencedColumn().getId())).findFirst(); - if (optional.isEmpty()) { - log.error("Failed to find foreign key referenced column {}.{} in columns: {}", table.getInternalName(), ref.getReferencedColumn().getInternalName(), data.getDatabase().getTables().stream().map(Table::getColumns).flatMap(List::stream).toList()); - throw new IllegalArgumentException("Failed to find foreign key referenced column"); - } - ref.getReferencedColumn().setTableId(optional.get().getTable().getId()); - ref.getReferencedColumn().setDatabaseId(optional.get().getTable().getTdbid()); + ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId()); + ref.getReferencedColumn().setDatabaseId(table.getTdbid()); } } table.getConstraints() @@ -594,7 +591,7 @@ public interface MetadataMapper { Unique uniqueDtoToUnique(UniqueDto data); @Mappings({ - @Mapping(target = "ownedBy", source = "owner.id"), + @Mapping(target = "ownedBy", source = "owner.id") }) Table tableDtoToTable(TableDto data); diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml index 3312af7c5af638096be77f207d0b6524ea9d0dab..87987f76bc609a2bdcf430510b611cb2d5b8059e 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml @@ -13,6 +13,7 @@ spring: default_schema: fda jdbc: time_zone: UTC + format_sql: false application: name: metadata-service rabbitmq: @@ -43,6 +44,7 @@ logging: root: warn at.tuwien.: trace org.springframework.security.web.FilterChainProxy: debug +# org.hibernate.resource.jdbc: trace org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug dbrepo: repository-name: Database Repository diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java index 28ab4ccb41133b237c033adbf77c85e9dcf7bb3f..8b4e8ce13657453033c2ecf9e27c0450102795db 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java @@ -285,7 +285,9 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete()); assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate()); assertEquals(TABLE_1_ID, table1fk.getTable().getId()); + assertEquals(DATABASE_1_ID, table1fk.getTable().getDatabaseId()); assertEquals(TABLE_2_ID, table1fk.getReferencedTable().getId()); + assertEquals(DATABASE_1_ID, table1fk.getReferencedTable().getDatabaseId()); final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0); assertEquals(1L, table1fkr.getId()); assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId()); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index 16d23d7af1d31c4bbefa50c607f6ad42b23eac8e..76871aa68ac3ea416ca73df0c990e5588b94300d 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -6,13 +6,13 @@ import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.table.TableDto; -import at.tuwien.api.database.table.columns.ColumnDto; -import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.entities.container.Container; import at.tuwien.entities.database.*; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; +import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey; +import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference; import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey; import at.tuwien.entities.user.User; import at.tuwien.exception.*; @@ -238,6 +238,46 @@ public class DatabaseServiceImpl implements DatabaseService { database.getTables() .add(tableEntity); } + /* update referenced tables after they are known to the service */ + for (ForeignKey foreignKey : database.getTables().stream().map(t -> t.getConstraints().getForeignKeys()).flatMap(List::stream).toList()) { + log.trace("lookup table {} in tables: {}", foreignKey.getReferencedTable().getInternalName(), database.getTables().stream().map(Table::getInternalName).toList()); + final Optional<Table> optional = database.getTables() + .stream() + .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName())) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to find referenced table: {}.{}", database.getInternalName(), foreignKey.getReferencedTable().getInternalName()); + throw new IllegalArgumentException("Failed to find referenced table: " + database.getInternalName() + "." + foreignKey.getReferencedTable().getInternalName()); + } + foreignKey.setReferencedTable(optional.get()); + for (ForeignKeyReference reference : foreignKey.getReferences()) { + reference.setForeignKey(foreignKey); + final Optional<TableColumn> optional1 = database.getTables() + .stream() + .filter(t -> t.getInternalName().equals(foreignKey.getTable().getInternalName())) + .map(Table::getColumns) + .flatMap(List::stream) + .filter(c -> c.getInternalName().equals(reference.getColumn().getInternalName())) + .findFirst(); + if (optional1.isEmpty()) { + log.error("Failed to find foreign key column: {}.{}.{}", database.getInternalName(), foreignKey.getTable().getInternalName(), reference.getColumn().getInternalName()); + throw new IllegalArgumentException("Failed to find foreign key column: " + reference.getColumn().getInternalName()); + } + reference.setColumn(optional1.get()); + final Optional<TableColumn> optional2 = database.getTables() + .stream() + .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName())) + .map(Table::getColumns) + .flatMap(List::stream) + .filter(c -> c.getInternalName().equals(reference.getReferencedColumn().getInternalName())) + .findFirst(); + if (optional2.isEmpty()) { + log.error("Failed to find foreign key referenced column: {}", reference.getReferencedColumn().getInternalName()); + throw new IllegalArgumentException("Failed to find foreign key referenced column: " + reference.getReferencedColumn().getInternalName()); + } + reference.setReferencedColumn(optional2.get()); + } + } /* update in metadata database */ database = databaseRepository.save(database); /* save in search service */