Skip to content

Commit

Permalink
Do unittest the new created service
Browse files Browse the repository at this point in the history
  • Loading branch information
sdbuehlmann committed Feb 19, 2024
1 parent 1def889 commit 35be171
Show file tree
Hide file tree
Showing 9 changed files with 329 additions and 50 deletions.
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ dependencies {
testImplementation("org.assertj:assertj-core:3.24.2")
testImplementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2")
testImplementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2")
testImplementation("org.mockito:mockito-core:4.11.0") // latest version which supports java 8

// testcontainers
testImplementation("org.testcontainers:testcontainers:1.19.0")
Expand Down
34 changes: 31 additions & 3 deletions src/main/java/ch/admin/bar/siard2/cmd/ArchiveMapping.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import java.io.*;
import java.util.*;
import ch.admin.bar.siard2.api.*;
import ch.admin.bar.siard2.cmd.mapping.ColumnIdMapper;
import ch.admin.bar.siard2.cmd.model.QualifiedColumnId;
import lombok.val;

public class ArchiveMapping
{
public class ArchiveMapping implements ColumnIdMapper {
private Map<String,SchemaMapping> _mapSchemas = new HashMap<String,SchemaMapping>();
public SchemaMapping getSchemaMapping(String sSchemaName) { return _mapSchemas.get(sSchemaName); }
public String getMappedSchemaName(String sSchemaName) { return getSchemaMapping(sSchemaName).getMappedSchemaName(); }
Expand Down Expand Up @@ -35,5 +37,31 @@ public static ArchiveMapping newInstance(boolean bSupportsArrays, boolean bSuppo
return new ArchiveMapping(bSupportsArrays,bSupportsUdts,
mapSchemas, md, iMaxTableNameLength, iMaxColumnNameLength);
} /* newInstance */


@Override
public QualifiedColumnId map(QualifiedColumnId origQualifiedColumnId) {
val sm = getSchemaMapping(origQualifiedColumnId.getSchema());
if (sm == null) {
return origQualifiedColumnId;
}

val builder = origQualifiedColumnId.toBuilder()
.schema(sm.getMappedSchemaName());

val tm = sm.getTableMapping(origQualifiedColumnId.getTable());
if (tm == null) {
return builder.build();
}

builder.table(tm.getMappedTableName());

val mappedColumnName = tm.getMappedColumnName(origQualifiedColumnId.getColumn());
if (mappedColumnName == null) {
return builder.build();
}

return builder
.column(mappedColumnName)
.build();
}
} /* class ArchiveMapping */
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ch.admin.bar.siard2.cmd.mapping;

import ch.admin.bar.siard2.cmd.model.QualifiedColumnId;

public interface ColumnIdMapper {
QualifiedColumnId map(QualifiedColumnId origQualifiedColumnId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ch.admin.bar.siard2.cmd.mapping;

import ch.admin.bar.siard2.cmd.model.QualifiedTableId;

public interface TableIdMapper {
QualifiedTableId map(QualifiedTableId origQualifiedTableId);
}
28 changes: 28 additions & 0 deletions src/main/java/ch/admin/bar/siard2/cmd/model/QualifiedColumnId.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ch.admin.bar.siard2.cmd.model;

import lombok.Builder;
import lombok.NonNull;
import lombok.Value;

@Value
@Builder(toBuilder = true)
public class QualifiedColumnId {
@NonNull String schema;
@NonNull String table;
@NonNull String column;

public QualifiedTableId getQualifiedTableId() {
return QualifiedTableId.builder()
.schema(schema)
.table(table)
.build();
}

public static class QualifiedColumnIdBuilder {
public QualifiedColumnIdBuilder qualifiedTable(final QualifiedTableId qualifiedTableId) {
schema(qualifiedTableId.getSchema());
table(qualifiedTableId.getTable());
return this;
}
}
}
12 changes: 12 additions & 0 deletions src/main/java/ch/admin/bar/siard2/cmd/model/QualifiedTableId.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ch.admin.bar.siard2.cmd.model;

import lombok.Builder;
import lombok.NonNull;
import lombok.Value;

@Value
@Builder(toBuilder = true)
public class QualifiedTableId {
@NonNull String schema;
@NonNull String table;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package ch.admin.bar.siard2.cmd.sql;

import ch.admin.bar.siard2.api.MetaForeignKey;
import ch.admin.bar.siard2.cmd.ArchiveMapping;
import ch.admin.bar.siard2.cmd.SchemaMapping;
import ch.admin.bar.siard2.cmd.TableMapping;
import ch.admin.bar.siard2.cmd.mapping.ColumnIdMapper;
import ch.admin.bar.siard2.cmd.mapping.TableIdMapper;
import ch.admin.bar.siard2.cmd.model.QualifiedColumnId;
import ch.admin.bar.siard2.cmd.model.QualifiedTableId;
import ch.admin.bar.siard2.cmd.utils.ListAssembler;
import lombok.Builder;
import lombok.NonNull;
Expand All @@ -16,47 +17,48 @@
import java.util.Optional;
import java.util.stream.Collectors;

// TODO FIXME Match-Type currently not supported
@Slf4j
@RequiredArgsConstructor
public class TableDependantStatementGenerator {
@Builder
public class CreateForeignKeySqlGenerator {

private final String schemaName;
private final String tableName;
@NonNull private final QualifiedTableId tableId;

private final ArchiveMapping archiveMapping;
@NonNull private final TableIdMapper tableIdMapper;
@NonNull private final ColumnIdMapper columnIdMapper;
@NonNull private final IdEncoder idEncoder;

// String createForeignKeyQuery = "ALTER TABLE deine_tabelle "
// + "ADD CONSTRAINT fk_foreign_key_name "
// + "FOREIGN KEY (spalte_in_deiner_tabelle) "
// + "REFERENCES referenzierte_tabelle (referenzierte_spalte) "
// + "ON DELETE CASCADE "
// + "ON UPDATE CASCADE";
private String createConstraintStatement(final MetaForeignKey foreignKeyMetaData) {
public String create(final MetaForeignKey foreignKeyMetaData) {
if (foreignKeyMetaData.getReferences() == 0) {
log.error("SIARD metadata for foreign-key {} has no references and will be ignored.", foreignKeyMetaData.getName());
return "";
}

val references = resolveReferences(foreignKeyMetaData);

val referencedTable = references.stream()
.map(foreignKeyReference -> String.format(
"%s.%s",
foreignKeyReference.getReferenced().getSchema(),
foreignKeyReference.getReferenced().getTable()))
.map(foreignKeyReference -> foreignKeyReference.getReferenced().getQualifiedTableId())
.findFirst()
.orElseThrow(() -> new IllegalStateException("No references found"));

val sb = new StringBuilder("ADD CONSTRAINT ").append(foreignKeyMetaData.getName())
.append(" FOREIGN KEY(")
val mappedTableId = tableIdMapper.map(tableId);

val sb = new StringBuilder()
.append("ALTER TABLE ")
.append(idEncoder.encodeKeySensitive(mappedTableId))
.append(" ADD CONSTRAINT ")
.append(foreignKeyMetaData.getName())
.append(" FOREIGN KEY (")
.append(references.stream()
.map(foreignKeyReference -> foreignKeyReference.getColumn().getColumn())
.map(foreignKeyReference -> idEncoder.encodeKeySensitive(foreignKeyReference.getColumn().getColumn()))
.collect(Collectors.joining(", ")))
.append(")")
.append(") ")
.append("REFERENCES ")
.append(referencedTable)
.append(idEncoder.encodeKeySensitive(referencedTable))
.append(" (")
.append(references.stream()
.map(foreignKeyReference -> foreignKeyReference.getReferenced().getColumn())
.map(foreignKeyReference -> idEncoder.encodeKeySensitive(foreignKeyReference.getReferenced().getColumn()))
.collect(Collectors.joining(", ")))
.append(")");

Expand All @@ -67,6 +69,8 @@ private String createConstraintStatement(final MetaForeignKey foreignKeyMetaData
Optional.ofNullable(foreignKeyMetaData.getUpdateAction())
.ifPresent(action -> sb.append(" ON UPDATE ").append(action));

log.error("SQL statement for creating foreign-key {}: {}", foreignKeyMetaData.getName(), sb);

return sb.toString();
}

Expand All @@ -81,8 +85,7 @@ private List<ForeignKeyReference> resolveReferences(final MetaForeignKey foreign
.build();

val column = QualifiedColumnId.builder()
.schema(schemaName)
.table(tableName)
.qualifiedTable(tableId)
.column(foreignKeyMetaData.getColumn(index))
.build();

Expand All @@ -99,19 +102,8 @@ private List<ForeignKeyReference> resolveReferences(final MetaForeignKey foreign

private ForeignKeyReference resolveMappings(ForeignKeyReference origForeignKeyReference) {
return origForeignKeyReference.toBuilder()
.column(resolveMappings(origForeignKeyReference.getColumn()))
.referenced(resolveMappings(origForeignKeyReference.getReferenced()))
.build();
}

private QualifiedColumnId resolveMappings(QualifiedColumnId origQualifiedColumnId) {
final SchemaMapping sm = archiveMapping.getSchemaMapping(origQualifiedColumnId.getSchema()); // TODO FIXME can return null
final TableMapping tm = sm.getTableMapping(origQualifiedColumnId.getTable()); // TODO FIXME can return null

return origQualifiedColumnId.toBuilder()
.schema(sm.getMappedSchemaName())
.table(tm.getMappedTableName())
.column(tm.getMappedColumnName(origQualifiedColumnId.getColumn())) // TODO FIXME can return null
.column(columnIdMapper.map(origForeignKeyReference.getColumn()))
.referenced(columnIdMapper.map(origForeignKeyReference.getReferenced()))
.build();
}

Expand All @@ -121,12 +113,4 @@ private static class ForeignKeyReference {
@NonNull QualifiedColumnId column;
@NonNull QualifiedColumnId referenced;
}

@Value
@Builder(toBuilder = true)
private static class QualifiedColumnId {
@NonNull String schema;
@NonNull String table;
@NonNull String column;
}
}
18 changes: 18 additions & 0 deletions src/main/java/ch/admin/bar/siard2/cmd/sql/IdEncoder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ch.admin.bar.siard2.cmd.sql;

import ch.admin.bar.siard2.cmd.model.QualifiedTableId;

public class IdEncoder {

public String encodeKeySensitive(final QualifiedTableId tableId) {
return encodeKeySensitive(tableId.getSchema()) +
"." +
encodeKeySensitive(tableId.getTable());
}

public String encodeKeySensitive(final String value) {
return "\"" +
value +
"\"";
}
}

0 comments on commit 35be171

Please sign in to comment.