diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/ExecuteRawSqlTask.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/ExecuteRawSqlTask.java new file mode 100644 index 00000000000..0459e9b834e --- /dev/null +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/taskdef/ExecuteRawSqlTask.java @@ -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 { + + private static final Logger ourLog = LoggerFactory.getLogger(ExecuteRawSqlTask.class); + private Map> myDriverToSqls = new HashMap<>(); + private List myDriverNeutralSqls = new ArrayList<>(); + + public ExecuteRawSqlTask addSql(DriverTypeEnum theDriverType, @Language("SQL") String theSql) { + Validate.notNull(theDriverType); + Validate.notBlank(theSql); + + List 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 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); + } + + } +} diff --git a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/BaseMigrationTasks.java b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/BaseMigrationTasks.java index e53546b7731..84eec4d7d0b 100644 --- a/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/BaseMigrationTasks.java +++ b/hapi-fhir-jpaserver-migrate/src/main/java/ca/uhn/fhir/jpa/migrate/tasks/api/BaseMigrationTasks.java @@ -60,7 +60,7 @@ public class BaseMigrationTasks { return retVal; } - protected Builder forVersion(T theVersion) { + public Builder forVersion(T theVersion) { IAcceptsTasks sink = theTask -> { theTask.validate(); myTasks.put(theVersion, theTask); @@ -72,7 +72,7 @@ public class BaseMigrationTasks { void addTask(BaseTask theTask); } - protected static class Builder { + public static class Builder { private final IAcceptsTasks mySink; @@ -92,6 +92,16 @@ public class BaseMigrationTasks { 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) { Validate.notBlank(theMessage); addTask(new LogStartSectionWithMessageTask(theMessage)); diff --git a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/ArbitrarySqlTaskTest.java b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/ArbitrarySqlTaskTest.java index da5da3f13d5..453bdb18fa2 100644 --- a/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/ArbitrarySqlTaskTest.java +++ b/hapi-fhir-jpaserver-migrate/src/test/java/ca/uhn/fhir/jpa/migrate/taskdef/ArbitrarySqlTaskTest.java @@ -1,5 +1,6 @@ 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.model.entity.SearchParamPresent; import ca.uhn.fhir.util.VersionEnum; @@ -69,19 +70,6 @@ public class ArbitrarySqlTaskTest extends BaseTest { } - private static class TestUpdateTasks extends BaseMigrationTasks { - - public TestUpdateTasks() { - Builder v = forVersion(VersionEnum.V3_5_0); - v - .addTableRawSql("A") - .addSql("delete from TEST_UPDATE_TASK where RES_TYPE = 'Patient'"); - } - - - } - - @Test public void testUpdateTask() { 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> rows = executeQuery("select * from TEST_UPDATE_TASK"); assertEquals(1, rows.size()); - TestUpdateTasks migrator = new TestUpdateTasks(); + BaseMigrationTasks migrator = new BaseMigrationTasks() { + }; + 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> rows = executeQuery("select * from TEST_UPDATE_TASK"); + assertEquals(2, rows.size()); + + BaseMigrationTasks migrator = new BaseMigrationTasks() { + }; + 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().migrate();