BGTSchemaMapper.java

  1. /*
  2.  * Copyright (C) 2021 B3Partners B.V.
  3.  *
  4.  * SPDX-License-Identifier: MIT
  5.  *
  6.  */

  7. package nl.b3p.brmo.bgt.schema;

  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.stream.Collectors;
  11. import java.util.stream.Stream;
  12. import nl.b3p.brmo.bgt.loader.Utils;
  13. import nl.b3p.brmo.schema.ObjectType;
  14. import nl.b3p.brmo.schema.SchemaSQLMapper;
  15. import nl.b3p.brmo.sql.dialect.SQLDialect;

  16. public class BGTSchemaMapper extends SchemaSQLMapper {
  17.   public static BGTSchemaMapper instance;

  18.   private static final String SCHEMA_VERSION_VALUE = "1";

  19.   public static final String METADATA_TABLE_NAME = "brmo_metadata";

  20.   public enum Metadata {
  21.     SCHEMA_VERSION,
  22.     LOADER_VERSION,
  23.     BRMOVERSIE,
  24.     FEATURE_TYPES,
  25.     INCLUDE_HISTORY,
  26.     LINEARIZE_CURVES,
  27.     TABLE_PREFIX,
  28.     INITIAL_LOAD_TIME,
  29.     INITIAL_LOAD_DELTA_ID,
  30.     DELTA_ID,
  31.     DELTA_TIME_TO,
  32.     GEOM_FILTER;

  33.     public String getDbKey() {
  34.       return this.name().toLowerCase();
  35.     }
  36.   }

  37.   public static Map<String, String> bgtObjectTypeTableNames =
  38.       Stream.of(
  39.               new String[][] {
  40.                 {"PlantCover", "begroeidterreindeel"},
  41.                 {"BuildingInstallation", "gebouwinstallatie"},
  42.                 {"AuxiliaryTrafficArea", "ondersteunendwegdeel"},
  43.                 {"BridgeConstructionElement", "overbruggingsdeel"},
  44.                 {"BuildingPart", "pand"},
  45.                 {"Railway", "spoor"},
  46.                 {"TunnelPart", "tunneldeel"},
  47.                 {"SolitaryVegetationObject", "vegetatieobject"},
  48.                 {"TrafficArea", "wegdeel"}
  49.               })
  50.           .collect(Collectors.toMap(e -> e[0], e -> e[1]));

  51.   public BGTSchemaMapper() {
  52.     super(BGTSchema.getInstance());
  53.     objectTypeNameToTableName.putAll(bgtObjectTypeTableNames);
  54.   }

  55.   public static BGTSchemaMapper getInstance() {
  56.     if (instance == null) {
  57.       instance = new BGTSchemaMapper();
  58.     }
  59.     return instance;
  60.   }

  61.   @Override
  62.   public String getMetadataTableName() {
  63.     return METADATA_TABLE_NAME;
  64.   }

  65.   @Override
  66.   public String getColumnNameForObjectType(ObjectType objectType, String attributeName) {
  67.     if (attributeName.startsWith("geometrie")) {
  68.       return "geom";
  69.     }
  70.     if (attributeName.startsWith("kruinlijn")) {
  71.       return "geom_kruinlijn";
  72.     }

  73.     return super.getColumnNameForObjectType(objectType, attributeName);
  74.   }

  75.   @Override
  76.   public List<String> getCreateMetadataTableStatements(
  77.       SQLDialect dialect, String tablePrefix, boolean dropIfExists) {
  78.     List<String> statements =
  79.         super.getCreateMetadataTableStatements(dialect, tablePrefix, dropIfExists);

  80.     Map<BGTSchemaMapper.Metadata, String> defaultMetadata =
  81.         Stream.of(
  82.                 new Object[][] {
  83.                   {BGTSchemaMapper.Metadata.SCHEMA_VERSION, SCHEMA_VERSION_VALUE},
  84.                   {BGTSchemaMapper.Metadata.LOADER_VERSION, Utils.getLoaderVersion()},
  85.                   {BGTSchemaMapper.Metadata.BRMOVERSIE, Utils.getBrmoVersion()},
  86.                   {BGTSchemaMapper.Metadata.TABLE_PREFIX, tablePrefix},
  87.                 })
  88.             .collect(
  89.                 Collectors.toMap(
  90.                     entry -> (BGTSchemaMapper.Metadata) entry[0], entry -> (String) entry[1]));

  91.     Stream.of(BGTSchemaMapper.Metadata.values())
  92.         .forEach(
  93.             metadata -> {
  94.               String value = defaultMetadata.get(metadata);
  95.               statements.add(
  96.                   String.format(
  97.                       "insert into %s (naam, waarde) values ('%s', %s)",
  98.                       getMetadataTableName(),
  99.                       metadata.getDbKey(),
  100.                       value == null ? "null" : "'" + value + "'"));
  101.             });

  102.     return statements;
  103.   }
  104. }