Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
bfd6066e99
|
@ -0,0 +1,71 @@
|
||||||
|
package ca.uhn.fhir.jpa.migrate.taskdef;
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* #%L
|
||||||
|
* HAPI FHIR JPA Server - Migration
|
||||||
|
* %%
|
||||||
|
* Copyright (C) 2014 - 2019 University Health Network
|
||||||
|
* %%
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* #L%
|
||||||
|
*/
|
||||||
|
|
||||||
|
import ca.uhn.fhir.jpa.migrate.DriverTypeEnum;
|
||||||
|
import org.apache.commons.lang3.Validate;
|
||||||
|
import org.intellij.lang.annotations.Language;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class ExecuteRawSqlTask extends BaseTask<ExecuteRawSqlTask> {
|
||||||
|
|
||||||
|
private static final Logger ourLog = LoggerFactory.getLogger(ExecuteRawSqlTask.class);
|
||||||
|
private Map<DriverTypeEnum, List<String>> myDriverToSqls = new HashMap<>();
|
||||||
|
private List<String> myDriverNeutralSqls = new ArrayList<>();
|
||||||
|
|
||||||
|
public ExecuteRawSqlTask addSql(DriverTypeEnum theDriverType, @Language("SQL") String theSql) {
|
||||||
|
Validate.notNull(theDriverType);
|
||||||
|
Validate.notBlank(theSql);
|
||||||
|
|
||||||
|
List<String> list = myDriverToSqls.computeIfAbsent(theDriverType, t -> new ArrayList<>());
|
||||||
|
list.add(theSql);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExecuteRawSqlTask addSql(String theSql) {
|
||||||
|
Validate.notBlank("theSql must not be null", theSql);
|
||||||
|
myDriverNeutralSqls.add(theSql);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validate() {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute() {
|
||||||
|
List<String> sqlStatements = myDriverToSqls.computeIfAbsent(getDriverType(), t -> new ArrayList<>());
|
||||||
|
sqlStatements.addAll(myDriverNeutralSqls);
|
||||||
|
|
||||||
|
ourLog.info("Going to execute {} SQL statements", sqlStatements.size());
|
||||||
|
|
||||||
|
for (String nextSql : sqlStatements) {
|
||||||
|
executeSql(null, nextSql);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,7 +60,7 @@ public class BaseMigrationTasks<T extends Enum> {
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Builder forVersion(T theVersion) {
|
public Builder forVersion(T theVersion) {
|
||||||
IAcceptsTasks sink = theTask -> {
|
IAcceptsTasks sink = theTask -> {
|
||||||
theTask.validate();
|
theTask.validate();
|
||||||
myTasks.put(theVersion, theTask);
|
myTasks.put(theVersion, theTask);
|
||||||
|
@ -72,7 +72,7 @@ public class BaseMigrationTasks<T extends Enum> {
|
||||||
void addTask(BaseTask<?> theTask);
|
void addTask(BaseTask<?> theTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class Builder {
|
public static class Builder {
|
||||||
|
|
||||||
private final IAcceptsTasks mySink;
|
private final IAcceptsTasks mySink;
|
||||||
|
|
||||||
|
@ -92,6 +92,16 @@ public class BaseMigrationTasks<T extends Enum> {
|
||||||
return new BuilderAddTableRawSql(theTableName);
|
return new BuilderAddTableRawSql(theTableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder executeRawSql(@Language("SQL") String theSql) {
|
||||||
|
mySink.addTask(new ExecuteRawSqlTask().addSql(theSql));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder executeRawSql(DriverTypeEnum theDriver, @Language("SQL") String theSql) {
|
||||||
|
mySink.addTask(new ExecuteRawSqlTask().addSql(theDriver, theSql));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder startSectionWithMessage(String theMessage) {
|
public Builder startSectionWithMessage(String theMessage) {
|
||||||
Validate.notBlank(theMessage);
|
Validate.notBlank(theMessage);
|
||||||
addTask(new LogStartSectionWithMessageTask(theMessage));
|
addTask(new LogStartSectionWithMessageTask(theMessage));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.uhn.fhir.jpa.migrate.taskdef;
|
package ca.uhn.fhir.jpa.migrate.taskdef;
|
||||||
|
|
||||||
|
import ca.uhn.fhir.jpa.migrate.DriverTypeEnum;
|
||||||
import ca.uhn.fhir.jpa.migrate.tasks.api.BaseMigrationTasks;
|
import ca.uhn.fhir.jpa.migrate.tasks.api.BaseMigrationTasks;
|
||||||
import ca.uhn.fhir.jpa.model.entity.SearchParamPresent;
|
import ca.uhn.fhir.jpa.model.entity.SearchParamPresent;
|
||||||
import ca.uhn.fhir.util.VersionEnum;
|
import ca.uhn.fhir.util.VersionEnum;
|
||||||
|
@ -69,19 +70,6 @@ public class ArbitrarySqlTaskTest extends BaseTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TestUpdateTasks extends BaseMigrationTasks<VersionEnum> {
|
|
||||||
|
|
||||||
public TestUpdateTasks() {
|
|
||||||
Builder v = forVersion(VersionEnum.V3_5_0);
|
|
||||||
v
|
|
||||||
.addTableRawSql("A")
|
|
||||||
.addSql("delete from TEST_UPDATE_TASK where RES_TYPE = 'Patient'");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateTask() {
|
public void testUpdateTask() {
|
||||||
executeSql("create table TEST_UPDATE_TASK (PID bigint not null, RES_TYPE varchar(255), PARAM_NAME varchar(255))");
|
executeSql("create table TEST_UPDATE_TASK (PID bigint not null, RES_TYPE varchar(255), PARAM_NAME varchar(255))");
|
||||||
|
@ -90,7 +78,37 @@ public class ArbitrarySqlTaskTest extends BaseTest {
|
||||||
List<Map<String, Object>> rows = executeQuery("select * from TEST_UPDATE_TASK");
|
List<Map<String, Object>> rows = executeQuery("select * from TEST_UPDATE_TASK");
|
||||||
assertEquals(1, rows.size());
|
assertEquals(1, rows.size());
|
||||||
|
|
||||||
TestUpdateTasks migrator = new TestUpdateTasks();
|
BaseMigrationTasks<VersionEnum> migrator = new BaseMigrationTasks<VersionEnum>() {
|
||||||
|
};
|
||||||
|
migrator
|
||||||
|
.forVersion(VersionEnum.V3_5_0)
|
||||||
|
.addTableRawSql("A")
|
||||||
|
.addSql("delete from TEST_UPDATE_TASK where RES_TYPE = 'Patient'");
|
||||||
|
|
||||||
|
getMigrator().addTasks(migrator.getTasks(VersionEnum.V3_3_0, VersionEnum.V3_6_0));
|
||||||
|
getMigrator().migrate();
|
||||||
|
|
||||||
|
rows = executeQuery("select * from TEST_UPDATE_TASK");
|
||||||
|
assertEquals(0, rows.size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testArbitrarySql() {
|
||||||
|
executeSql("create table TEST_UPDATE_TASK (PID bigint not null, RES_TYPE varchar(255), PARAM_NAME varchar(255))");
|
||||||
|
executeSql("insert into TEST_UPDATE_TASK (PID, RES_TYPE, PARAM_NAME) values (1, 'Patient', 'identifier')");
|
||||||
|
executeSql("insert into TEST_UPDATE_TASK (PID, RES_TYPE, PARAM_NAME) values (1, 'Encounter', 'identifier')");
|
||||||
|
|
||||||
|
List<Map<String, Object>> rows = executeQuery("select * from TEST_UPDATE_TASK");
|
||||||
|
assertEquals(2, rows.size());
|
||||||
|
|
||||||
|
BaseMigrationTasks<VersionEnum> migrator = new BaseMigrationTasks<VersionEnum>() {
|
||||||
|
};
|
||||||
|
migrator
|
||||||
|
.forVersion(VersionEnum.V3_5_0)
|
||||||
|
.executeRawSql(DriverTypeEnum.DERBY_EMBEDDED, "delete from TEST_UPDATE_TASK where RES_TYPE = 'Patient'")
|
||||||
|
.executeRawSql(DriverTypeEnum.DERBY_EMBEDDED, "delete from TEST_UPDATE_TASK where RES_TYPE = 'Encounter'");
|
||||||
|
|
||||||
getMigrator().addTasks(migrator.getTasks(VersionEnum.V3_3_0, VersionEnum.V3_6_0));
|
getMigrator().addTasks(migrator.getTasks(VersionEnum.V3_3_0, VersionEnum.V3_6_0));
|
||||||
getMigrator().migrate();
|
getMigrator().migrate();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue