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

Fixed mapping problem where UK and FK share columns they are inserted

				 twice
parent 157f556f
No related branches found
No related tags found
8 merge requests!345Updated docs and endpoints:,!341Fixed mapping problem where UK and FK share columns they are inserted,!339Fixed mapping problem where UK and FK share columns they are inserted,!338Fixed mapping problem where UK and FK share columns they are inserted,!334Fixed mapping problem where UK and FK share columns they are inserted,!333Fixed mapping problem where UK and FK share columns they are inserted,!327Fixed mapping problem where UK and FK share columns they are inserted,!326Fixed mapping problem where UK and FK share columns they are inserted
Showing
with 40 additions and 21 deletions
...@@ -194,6 +194,7 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest { ...@@ -194,6 +194,7 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
assertEquals(1, uniques.size()); assertEquals(1, uniques.size());
final UniqueDto unique0 = uniques.get(0); final UniqueDto unique0 = uniques.get(0);
assertNotNull(unique0.getTable()); assertNotNull(unique0.getTable());
assertEquals("some_constraint", unique0.getName());
assertNull(unique0.getTable().getId()); assertNull(unique0.getTable().getId());
assertEquals(TABLE_1_INTERNALNAME, unique0.getTable().getName()); assertEquals(TABLE_1_INTERNALNAME, unique0.getTable().getName());
assertEquals(TABLE_1_INTERNALNAME, unique0.getTable().getInternalName()); assertEquals(TABLE_1_INTERNALNAME, unique0.getTable().getInternalName());
......
...@@ -17,7 +17,7 @@ CREATE TABLE weather_aus ...@@ -17,7 +17,7 @@ CREATE TABLE weather_aus
mintemp DOUBLE PRECISION NULL, mintemp DOUBLE PRECISION NULL,
rainfall DOUBLE PRECISION NULL, rainfall DOUBLE PRECISION NULL,
FOREIGN KEY (location) REFERENCES weather_location (location) ON DELETE SET NULL, FOREIGN KEY (location) REFERENCES weather_location (location) ON DELETE SET NULL,
UNIQUE (`date`), CONSTRAINT some_constraint UNIQUE (`date`),
CHECK (`mintemp` > 0) CHECK (`mintemp` > 0)
) WITH SYSTEM VERSIONING COMMENT 'Weather in Australia'; ) WITH SYSTEM VERSIONING COMMENT 'Weather in Australia';
......
...@@ -176,8 +176,9 @@ CREATE TABLE IF NOT EXISTS `mdb_columns` ...@@ -176,8 +176,9 @@ CREATE TABLE IF NOT EXISTS `mdb_columns`
std_dev Numeric NULL, std_dev Numeric NULL,
created timestamp NOT NULL DEFAULT NOW(), created timestamp NOT NULL DEFAULT NOW(),
last_modified timestamp, last_modified timestamp,
PRIMARY KEY (ID),
FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE,
PRIMARY KEY (ID) UNIQUE (tID, internal_name)
) WITH SYSTEM VERSIONING; ) WITH SYSTEM VERSIONING;
CREATE TABLE IF NOT EXISTS `mdb_columns_enums` CREATE TABLE IF NOT EXISTS `mdb_columns_enums`
......
...@@ -24,7 +24,7 @@ import java.util.List; ...@@ -24,7 +24,7 @@ import java.util.List;
@EqualsAndHashCode(onlyExplicitlyIncluded = true) @EqualsAndHashCode(onlyExplicitlyIncluded = true)
@EntityListeners(AuditingEntityListener.class) @EntityListeners(AuditingEntityListener.class)
@jakarta.persistence.Table(name = "mdb_columns", uniqueConstraints = { @jakarta.persistence.Table(name = "mdb_columns", uniqueConstraints = {
@UniqueConstraint(columnNames = {"tid", "internalName"}) @UniqueConstraint(columnNames = {"tID", "internal_name"})
}) })
@NamedQueries({ @NamedQueries({
@NamedQuery(name = "TableColumn.findAllByDatabaseId", query = "select c from TableColumn c where c.table.database.id = ?1"), @NamedQuery(name = "TableColumn.findAllByDatabaseId", query = "select c from TableColumn c where c.table.database.id = ?1"),
...@@ -56,7 +56,7 @@ public class TableColumn implements Comparable<TableColumn> { ...@@ -56,7 +56,7 @@ public class TableColumn implements Comparable<TableColumn> {
@Column(name = "auto_generated", columnDefinition = "BOOLEAN default false") @Column(name = "auto_generated", columnDefinition = "BOOLEAN default false")
private Boolean autoGenerated; private Boolean autoGenerated;
@Column(nullable = false, columnDefinition = "VARCHAR(64)") @Column(name = "internal_name", nullable = false, columnDefinition = "VARCHAR(64)")
private String internalName; private String internalName;
@Column(columnDefinition = "VARCHAR(2048)") @Column(columnDefinition = "VARCHAR(2048)")
......
...@@ -50,7 +50,8 @@ public class TableColumnConcept { ...@@ -50,7 +50,8 @@ public class TableColumnConcept {
private Instant created; private Instant created;
@ToString.Exclude @ToString.Exclude
@OneToMany(fetch = FetchType.LAZY) @org.springframework.data.annotation.Transient
@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinTable(name = "mdb_columns_concepts", @JoinTable(name = "mdb_columns_concepts",
inverseJoinColumns = { inverseJoinColumns = {
@JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false) @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false)
......
...@@ -49,7 +49,8 @@ public class TableColumnUnit { ...@@ -49,7 +49,8 @@ public class TableColumnUnit {
private Instant created; private Instant created;
@ToString.Exclude @ToString.Exclude
@OneToMany(fetch = FetchType.LAZY) @org.springframework.data.annotation.Transient
@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinTable(name = "mdb_columns_units", @JoinTable(name = "mdb_columns_units",
inverseJoinColumns = { inverseJoinColumns = {
@JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false) @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false)
......
...@@ -32,12 +32,14 @@ public class ForeignKeyReference { ...@@ -32,12 +32,14 @@ public class ForeignKeyReference {
@JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false) @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false)
private ForeignKey foreignKey; private ForeignKey foreignKey;
@org.springframework.data.annotation.Transient
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @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;
@org.springframework.data.annotation.Transient
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false) @JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false)
......
...@@ -27,7 +27,7 @@ public class PrimaryKey { ...@@ -27,7 +27,7 @@ public class PrimaryKey {
@ToString.Exclude @ToString.Exclude
@org.springframework.data.annotation.Transient @org.springframework.data.annotation.Transient
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "tid", referencedColumnName = "id", nullable = false) @JoinColumn(name = "tid", referencedColumnName = "id", nullable = false)
}) })
...@@ -35,7 +35,7 @@ public class PrimaryKey { ...@@ -35,7 +35,7 @@ public class PrimaryKey {
@ToString.Exclude @ToString.Exclude
@org.springframework.data.annotation.Transient @org.springframework.data.annotation.Transient
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "cid", referencedColumnName = "id", nullable = false) @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false)
}) })
......
...@@ -33,13 +33,14 @@ public class Unique { ...@@ -33,13 +33,14 @@ public class Unique {
@ToString.Exclude @ToString.Exclude
@org.springframework.data.annotation.Transient @org.springframework.data.annotation.Transient
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinColumns({ @JoinColumns({
@JoinColumn(name = "tid", referencedColumnName = "id") @JoinColumn(name = "tid", referencedColumnName = "id")
}) })
private Table table; private Table table;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @org.springframework.data.annotation.Transient
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinTable( @JoinTable(
name = "mdb_constraints_unique_columns", name = "mdb_constraints_unique_columns",
joinColumns = { joinColumns = {
......
...@@ -555,7 +555,6 @@ public interface MetadataMapper { ...@@ -555,7 +555,6 @@ public interface MetadataMapper {
ref.getColumn().setDatabaseId(table.getTdbid()); ref.getColumn().setDatabaseId(table.getTdbid());
ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId()); ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId());
ref.getReferencedColumn().setDatabaseId(table.getTdbid()); ref.getReferencedColumn().setDatabaseId(table.getTdbid());
log.trace("mapped foreign key part ({}) reference ({})", ref.getColumn().getInternalName(), ref.getReferencedColumn().getInternalName());
}); });
}); });
table.getConstraints() table.getConstraints()
......
...@@ -11,9 +11,11 @@ import at.tuwien.entities.container.Container; ...@@ -11,9 +11,11 @@ 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.Constraints;
import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey; 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.foreignKey.ForeignKeyReference;
import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey; import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey;
import at.tuwien.entities.database.table.constraints.unique.Unique;
import at.tuwien.entities.user.User; import at.tuwien.entities.user.User;
import at.tuwien.exception.*; import at.tuwien.exception.*;
import at.tuwien.gateway.DataServiceGateway; import at.tuwien.gateway.DataServiceGateway;
...@@ -212,12 +214,14 @@ public class DatabaseServiceImpl implements DatabaseService { ...@@ -212,12 +214,14 @@ public class DatabaseServiceImpl implements DatabaseService {
.forEach(column -> { .forEach(column -> {
column.setTable(tableEntity); column.setTable(tableEntity);
}); });
log.trace("mapped unique constraint: {} ({})", tableEntity.getName(), uk.getColumns().stream().map(TableColumn::getInternalName).toList());
}); });
/* map foreign key constraint(s) */ /* map foreign key constraint(s) */
tableEntity.getConstraints() tableEntity.getConstraints()
.getForeignKeys() .getForeignKeys()
.forEach(fk -> { .forEach(fk -> {
fk.setTable(tableEntity); fk.setTable(tableEntity);
log.trace("mapped foreign key constraint: {} ({}) -> {} ({})", fk.getTable().getInternalName(), fk.getReferences().stream().map(r -> r.getColumn().getInternalName()).toList(), fk.getReferencedTable().getInternalName(), fk.getReferences().stream().map(r -> r.getReferencedColumn().getInternalName()).toList());
}); });
/* map primary key constraint */ /* map primary key constraint */
for (PrimaryKey key : tableEntity.getConstraints().getPrimaryKey()) { for (PrimaryKey key : tableEntity.getConstraints().getPrimaryKey()) {
...@@ -237,7 +241,6 @@ public class DatabaseServiceImpl implements DatabaseService { ...@@ -237,7 +241,6 @@ public class DatabaseServiceImpl implements DatabaseService {
} }
/* update referenced tables after they are known to the service */ /* 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()) { 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() final Optional<Table> optional = database.getTables()
.stream() .stream()
.filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName())) .filter(t -> t.getInternalName().equals(foreignKey.getReferencedTable().getInternalName()))
...@@ -275,15 +278,25 @@ public class DatabaseServiceImpl implements DatabaseService { ...@@ -275,15 +278,25 @@ public class DatabaseServiceImpl implements DatabaseService {
reference.setReferencedColumn(optional2.get()); reference.setReferencedColumn(optional2.get());
} }
} }
database.getTables() /* correct the unique constraint columns */
for (Table table : database.getTables()) {
for (Unique uniqueConstraint : table.getConstraints().getUniques()) {
uniqueConstraint.setColumns(uniqueConstraint.getColumns()
.stream() .stream()
.filter(t -> t.getConstraints().getForeignKeys().size() > 0) .map(column -> {
.map(t -> t.getConstraints().getForeignKeys()) final Optional<TableColumn> optional = table.getColumns()
.flatMap(List::stream) .stream()
.filter(fk -> fk.getReferences().size() > 1) .filter(c -> c.getInternalName().equals(column.getInternalName()))
.forEach(fk -> { .findFirst();
log.debug(""); if (optional.isEmpty()) {
}); log.error("Failed to find unique constraint column: {}", column.getInternalName());
throw new IllegalArgumentException("Failed to find unique constraint column: " + column.getInternalName());
}
return optional.get();
})
.toList());
}
}
/* 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