Skip to content
Snippets Groups Projects
Verified Commit fbc982d9 authored by Martin Weise's avatar Martin Weise
Browse files

Hotfix Foreign Keys

parent be1d1ad0
No related branches found
No related tags found
9 merge requests!296Dev,!293Dev,!289Dev,!287Dev,!285Dev,!284Dev,!283Dev,!281Dev,!279Dev
...@@ -26,17 +26,17 @@ public class ForeignKeyReference { ...@@ -26,17 +26,17 @@ public class ForeignKeyReference {
private Long id; private Long id;
@ToString.Exclude @ToString.Exclude
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false) @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false)
private ForeignKey foreignKey; private ForeignKey foreignKey;
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "cid", referencedColumnName = "id", nullable = false) @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false)
}) })
private TableColumn column; private TableColumn column;
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false) @JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false)
}) })
......
...@@ -540,17 +540,14 @@ public interface MetadataMapper { ...@@ -540,17 +540,14 @@ public interface MetadataMapper {
pk.getColumn().setDatabaseId(data.getDatabase().getId()); pk.getColumn().setDatabaseId(data.getDatabase().getId());
}); });
for (ForeignKeyDto fk : table.getConstraints().getForeignKeys()) { for (ForeignKeyDto fk : table.getConstraints().getForeignKeys()) {
fk.getTable().setDatabaseId(table.getTdbid());
fk.getReferencedTable().setDatabaseId(table.getTdbid());
for (ForeignKeyReferenceDto ref : fk.getReferences()) { for (ForeignKeyReferenceDto ref : fk.getReferences()) {
ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk)); ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk));
ref.getColumn().setTableId(table.getId()); ref.getColumn().setTableId(table.getId());
ref.getColumn().setDatabaseId(table.getTdbid()); 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(); ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId());
if (optional.isEmpty()) { ref.getReferencedColumn().setDatabaseId(table.getTdbid());
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());
} }
} }
table.getConstraints() table.getConstraints()
...@@ -594,7 +591,7 @@ public interface MetadataMapper { ...@@ -594,7 +591,7 @@ public interface MetadataMapper {
Unique uniqueDtoToUnique(UniqueDto data); Unique uniqueDtoToUnique(UniqueDto data);
@Mappings({ @Mappings({
@Mapping(target = "ownedBy", source = "owner.id"), @Mapping(target = "ownedBy", source = "owner.id")
}) })
Table tableDtoToTable(TableDto data); Table tableDtoToTable(TableDto data);
......
...@@ -13,6 +13,7 @@ spring: ...@@ -13,6 +13,7 @@ spring:
default_schema: fda default_schema: fda
jdbc: jdbc:
time_zone: UTC time_zone: UTC
format_sql: false
application: application:
name: metadata-service name: metadata-service
rabbitmq: rabbitmq:
...@@ -43,6 +44,7 @@ logging: ...@@ -43,6 +44,7 @@ logging:
root: warn root: warn
at.tuwien.: trace at.tuwien.: trace
org.springframework.security.web.FilterChainProxy: debug org.springframework.security.web.FilterChainProxy: debug
# org.hibernate.resource.jdbc: trace
org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
dbrepo: dbrepo:
repository-name: Database Repository repository-name: Database Repository
......
...@@ -285,7 +285,9 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { ...@@ -285,7 +285,9 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete()); assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete());
assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate()); assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate());
assertEquals(TABLE_1_ID, table1fk.getTable().getId()); assertEquals(TABLE_1_ID, table1fk.getTable().getId());
assertEquals(DATABASE_1_ID, table1fk.getTable().getDatabaseId());
assertEquals(TABLE_2_ID, table1fk.getReferencedTable().getId()); assertEquals(TABLE_2_ID, table1fk.getReferencedTable().getId());
assertEquals(DATABASE_1_ID, table1fk.getReferencedTable().getDatabaseId());
final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0); final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0);
assertEquals(1L, table1fkr.getId()); assertEquals(1L, table1fkr.getId());
assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId()); assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId());
......
...@@ -6,13 +6,13 @@ import at.tuwien.api.database.DatabaseModifyVisibilityDto; ...@@ -6,13 +6,13 @@ import at.tuwien.api.database.DatabaseModifyVisibilityDto;
import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.ViewDto;
import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.internal.CreateDatabaseDto;
import at.tuwien.api.database.table.TableDto; 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.api.user.internal.UpdateUserPasswordDto;
import at.tuwien.entities.container.Container; import at.tuwien.entities.container.Container;
import at.tuwien.entities.database.*; import at.tuwien.entities.database.*;
import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.Table;
import at.tuwien.entities.database.table.columns.TableColumn; 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.database.table.constraints.primaryKey.PrimaryKey;
import at.tuwien.entities.user.User; import at.tuwien.entities.user.User;
import at.tuwien.exception.*; import at.tuwien.exception.*;
...@@ -238,6 +238,46 @@ public class DatabaseServiceImpl implements DatabaseService { ...@@ -238,6 +238,46 @@ public class DatabaseServiceImpl implements DatabaseService {
database.getTables() database.getTables()
.add(tableEntity); .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 */ /* update in metadata database */
database = databaseRepository.save(database); database = databaseRepository.save(database);
/* save in search service */ /* save in search service */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment