Skip to content

Commit

Permalink
Normalize sp_name and res_type columns from hfj_spidx_* tables - Iden…
Browse files Browse the repository at this point in the history
…tity table task added
  • Loading branch information
volodymyr-korzh committed Feb 13, 2025
1 parent 756c1f3 commit 58b6d93
Show file tree
Hide file tree
Showing 8 changed files with 474 additions and 99 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
import ca.uhn.fhir.i18n.Msg;
import ca.uhn.fhir.jpa.migrate.taskdef.ColumnTypeEnum;
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.QualifiedSequenceName;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver;
import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter;
Expand All @@ -44,6 +46,7 @@
import org.hibernate.tool.schema.extract.spi.ExtractionContext;
import org.hibernate.tool.schema.extract.spi.SequenceInformation;
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
import org.intellij.lang.annotations.Language;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.ColumnMapRowMapper;
Expand All @@ -60,9 +63,11 @@
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import javax.sql.DataSource;

public class JdbcUtils {
Expand Down Expand Up @@ -410,101 +415,45 @@ public static Set<String> getColumnNames(

public static Set<String> getSequenceNames(DriverTypeEnum.ConnectionProperties theConnectionProperties)
throws SQLException {
DataSource dataSource = Objects.requireNonNull(theConnectionProperties.getDataSource());
try (Connection connection = dataSource.getConnection()) {
return theConnectionProperties.getTxTemplate().execute(t -> {
try {
DialectResolver dialectResolver = new StandardDialectResolver();
Dialect dialect = dialectResolver.resolveDialect(
new DatabaseMetaDataDialectResolutionInfoAdapter(connection.getMetaData()));

Set<String> sequenceNames = new HashSet<>();
if (dialect.getSequenceSupport().supportsSequences()) {

// Use Hibernate to get a list of current sequences
SequenceInformationExtractor sequenceInformationExtractor =
dialect.getSequenceInformationExtractor();
ExtractionContext extractionContext = new ExtractionContext.EmptyExtractionContext() {

@Override
public Connection getJdbcConnection() {
return connection;
}

@Override
public ServiceRegistry getServiceRegistry() {
return super.getServiceRegistry();
}

@Override
public JdbcEnvironment getJdbcEnvironment() {
return new JdbcEnvironment() {
List<SequenceInformation> sequenceInformation = getSequenceInformation(theConnectionProperties);

@Override
public Dialect getDialect() {
return dialect;
}

@Override
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
return null;
}

@Override
public ExtractedDatabaseMetaData getExtractedDatabaseMetaData() {
return null;
}

@Override
public Identifier getCurrentCatalog() {
return null;
}

@Override
public Identifier getCurrentSchema() {
return null;
}

@Override
public QualifiedObjectNameFormatter getQualifiedObjectNameFormatter() {
return null;
}

@Override
public IdentifierHelper getIdentifierHelper() {
return new NormalizingIdentifierHelperImpl(
this, null, true, true, true, true, null, null, null);
}

@Override
public NameQualifierSupport getNameQualifierSupport() {
return null;
}

@Override
public SqlExceptionHelper getSqlExceptionHelper() {
return null;
}
return sequenceInformation.stream()
.map(SequenceInformation::getSequenceName)
.map(QualifiedSequenceName::getSequenceName)
.map(Identifier::getText)
.collect(Collectors.toSet());
}

@Override
public LobCreatorBuilder getLobCreatorBuilder() {
return null;
}
};
@Nonnull
public static List<SequenceInformation> getSequenceInformation(
DriverTypeEnum.ConnectionProperties theConnectionProperties) throws SQLException {
DataSource dataSource = Objects.requireNonNull(theConnectionProperties.getDataSource());
try (Connection connection = dataSource.getConnection()) {
return Objects.requireNonNull(
theConnectionProperties.getTxTemplate().execute(t -> {
try {
DialectResolver dialectResolver = new StandardDialectResolver();
Dialect dialect = dialectResolver.resolveDialect(
new DatabaseMetaDataDialectResolutionInfoAdapter(connection.getMetaData()));

List<SequenceInformation> sequenceInformation = new ArrayList<>();
if (dialect.getSequenceSupport().supportsSequences()) {

// Use Hibernate to get a list of current sequences
SequenceInformationExtractor sequenceInformationExtractor =
dialect.getSequenceInformationExtractor();
ExtractionContext extractionContext = new EmptyExtractionContext(connection, dialect);
Iterable<SequenceInformation> sequenceInformationIterator =
sequenceInformationExtractor.extractMetadata(extractionContext);

return StreamSupport.stream(sequenceInformationIterator.spliterator(), false)
.collect(Collectors.toList());
}
};
Iterable<SequenceInformation> sequences =
sequenceInformationExtractor.extractMetadata(extractionContext);
for (SequenceInformation next : sequences) {
sequenceNames.add(
next.getSequenceName().getSequenceName().getText());
return sequenceInformation;
} catch (SQLException e) {
throw new InternalErrorException(Msg.code(39) + e);
}
}
return sequenceNames;
} catch (SQLException e) {
throw new InternalErrorException(Msg.code(39) + e);
}
});
}));
}
}

Expand Down Expand Up @@ -588,6 +537,25 @@ public static boolean isColumnNullable(
}
}

public static void executeSql(
DriverTypeEnum.ConnectionProperties theConnectionProperties,
@Language("SQL") String theSql,
Object... theArgs) {
theConnectionProperties.getTxTemplate().execute(t -> {
theConnectionProperties.newJdbcTemplate().update(theSql, theArgs);
return null;
});
}

public static List<Map<String, Object>> executeQuery(
DriverTypeEnum.ConnectionProperties theConnectionProperties,
@Language("SQL") String theSql,
Object... theArgs) {
return theConnectionProperties.getTxTemplate().execute(t -> theConnectionProperties
.newJdbcTemplate()
.query(theSql, theArgs, new ColumnMapRowMapper()));
}

private static String massageIdentifier(DatabaseMetaData theMetadata, String theCatalog) throws SQLException {
String retVal = theCatalog;
if (theCatalog == null) {
Expand Down Expand Up @@ -672,4 +640,81 @@ public boolean equals(ColumnTypeEnum theTaskColumnType, Long theTaskColumnLength
&& (theTaskColumnLength == null || theTaskColumnLength.equals(myLength));
}
}

private static class EmptyExtractionContext extends ExtractionContext.EmptyExtractionContext {

private final Connection connection;
private final Dialect dialect;

public EmptyExtractionContext(Connection connection, Dialect dialect) {
this.connection = connection;
this.dialect = dialect;
}

@Override
public Connection getJdbcConnection() {
return connection;
}

@Override
public ServiceRegistry getServiceRegistry() {
return super.getServiceRegistry();
}

@Override
public JdbcEnvironment getJdbcEnvironment() {
return new JdbcEnvironment() {

@Override
public Dialect getDialect() {
return dialect;
}

@Override
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
return null;
}

@Override
public ExtractedDatabaseMetaData getExtractedDatabaseMetaData() {
return null;
}

@Override
public Identifier getCurrentCatalog() {
return null;
}

@Override
public Identifier getCurrentSchema() {
return null;
}

@Override
public QualifiedObjectNameFormatter getQualifiedObjectNameFormatter() {
return null;
}

@Override
public IdentifierHelper getIdentifierHelper() {
return new NormalizingIdentifierHelperImpl(this, null, true, true, true, true, null, null, null);
}

@Override
public NameQualifierSupport getNameQualifierSupport() {
return null;
}

@Override
public SqlExceptionHelper getSqlExceptionHelper() {
return null;
}

@Override
public LobCreatorBuilder getLobCreatorBuilder() {
return null;
}
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,22 @@

public class AddIdGeneratorTask extends BaseTask {

private static final Integer DEFAULT_INCREMENT = 50;
private static final Logger ourLog = LoggerFactory.getLogger(AddIdGeneratorTask.class);
private final String myGeneratorName;
private final Integer myIncrement;

public AddIdGeneratorTask(String theProductVersion, String theSchemaVersion, String theGeneratorName) {
super(theProductVersion, theSchemaVersion);
myGeneratorName = theGeneratorName;
myIncrement = DEFAULT_INCREMENT;
}

public AddIdGeneratorTask(
String theProductVersion, String theSchemaVersion, String theGeneratorName, Integer theIncrement) {
super(theProductVersion, theSchemaVersion);
myGeneratorName = theGeneratorName;
myIncrement = theIncrement;
}

@Override
Expand All @@ -58,6 +68,7 @@ public void doExecute() throws SQLException {
case MARIADB_10_1:
case MYSQL_5_7:
// These require a separate table
// Increment value is controlled globally using the auto_increment_increment variable
if (!tableNames.contains(myGeneratorName)) {

String creationSql = "create table " + myGeneratorName + " ( next_val bigint ) engine=InnoDB";
Expand All @@ -69,17 +80,13 @@ public void doExecute() throws SQLException {
break;
case DERBY_EMBEDDED:
case H2_EMBEDDED:
sql = "create sequence " + myGeneratorName + " start with 1 increment by 50";
case ORACLE_12C:
case MSSQL_2012:
sql = "create sequence " + myGeneratorName + " start with 1 increment by " + myIncrement;
break;
case COCKROACHDB_21_1:
case POSTGRES_9_4:
sql = "create sequence " + myGeneratorName + " start 1 increment 50";
break;
case ORACLE_12C:
sql = "create sequence " + myGeneratorName + " start with 1 increment by 50";
break;
case MSSQL_2012:
sql = "create sequence " + myGeneratorName + " start with 1 increment by 50";
sql = "create sequence " + myGeneratorName + " start 1 increment " + myIncrement;
break;
default:
throw new IllegalStateException(Msg.code(63));
Expand Down
Loading

0 comments on commit 58b6d93

Please sign in to comment.