ref #9322 handle also AUD table in SingleTermRemover and connect the schema updater
authorAndreas Müller <a.mueller@bgbm.org>
Wed, 2 Dec 2020 17:20:05 +0000 (18:20 +0100)
committerAndreas Müller <a.mueller@bgbm.org>
Wed, 2 Dec 2020 17:20:36 +0000 (18:20 +0100)
cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/metadata/CdmMetaData.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/CdmUpdater.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/SingleTermRemover.java
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/database/update/v515_518/SchemaUpdater_5185_5186.java

index ec771c9c555ce5b9bca92fb65529de129fbc5b79..6aa13884b71172999f24b8b884c4d47aadf095ac 100644 (file)
@@ -53,7 +53,7 @@ public class CdmMetaData extends CdmBase{
         * be handled by SCHEMA_VALIDATION.UPDATE
         * The last number represents the date of change.
         */
-       private static final String dbSchemaVersion = CdmVersion.V_05_18_05.versionString;
+       private static final String dbSchemaVersion = CdmVersion.V_05_18_06.versionString;
 
        public enum CdmVersion {
            V_05_12_00("5.12.0.0.20191202"),
@@ -65,7 +65,8 @@ public class CdmMetaData extends CdmBase{
         V_05_18_02("5.18.2.0.20200921"),
         V_05_18_03("5.18.3.0.20200924"),
         V_05_18_04("5.18.4.0.20201020"),
-        V_05_18_05("5.18.5.0.20201103")
+        V_05_18_05("5.18.5.0.20201103"),
+        V_05_18_06("5.18.6.0.20201124")
         ;
         private String versionString;
            private CdmVersion(String versionString){
index 1562941a1a3bbd6e2cf5e54eb6726efe4d01d116..9b4cdbf71c393204305aaa784f0fba6ce48b2f9b 100644 (file)
@@ -17,7 +17,7 @@ import eu.etaxonomy.cdm.common.monitor.DefaultProgressMonitor;
 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
 import eu.etaxonomy.cdm.database.CdmDataSource;
 import eu.etaxonomy.cdm.database.ICdmDataSource;
-import eu.etaxonomy.cdm.database.update.v515_518.SchemaUpdater_5184_5185;
+import eu.etaxonomy.cdm.database.update.v515_518.SchemaUpdater_5185_5186;
 import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
 
 /**
@@ -62,6 +62,7 @@ import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
  * @since 10.09.2010
  */
 public class CdmUpdater {
+
     private static final Logger logger = Logger.getLogger(CdmUpdater.class);
 
     public static CdmUpdater NewInstance(){
@@ -69,7 +70,7 @@ public class CdmUpdater {
     }
 
     private ISchemaUpdater getCurrentSchemaUpdater() {
-        return SchemaUpdater_5184_5185.NewInstance();
+        return SchemaUpdater_5185_5186.NewInstance();
     }
 
     public SchemaUpdateResult updateToCurrentVersion(ICdmDataSource datasource, IProgressMonitor monitor){
index a300d54a78e99b85be0932de55c37f57fa26ec9f..553bea4ea4c11fde9d7f0a228c1c28a959530a05 100644 (file)
@@ -21,7 +21,8 @@ import eu.etaxonomy.cdm.database.ICdmDataSource;
 /**\r
  * Removes a given term if it is not in use.\r
  * TODO does not yet check all DefinedTermBase_XXX tables except for representations.\r
- * Does also not handle AUD tables\r
+ * Does also not handle AUD tables => should probably be handled as DeleteEvent, not simply delete the record;\r
+ * There is now a factory method for handling AUDs.\r
  *\r
  * @author a.mueller\r
  * @since 06.09.2013\r
@@ -31,13 +32,14 @@ public class SingleTermRemover
 \r
     private String uuidTerm ;\r
     private List<String> checkUsedQueries = new ArrayList<>();\r
+    private boolean isAudit = false;\r
 \r
     @SuppressWarnings("unused")\r
        private static final Logger logger = Logger.getLogger(SingleTermRemover.class);\r
 \r
        public static final SingleTermRemover NewInstance(List<ISchemaUpdaterStep> stepList, String stepName,\r
                String uuidTerm, List<String> checkUsedQueries, int adapt){\r
-               return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries);\r
+               return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries, false);\r
        }\r
 \r
        /**\r
@@ -49,22 +51,38 @@ public class SingleTermRemover
                String uuidTerm, String firstCheckUsedQuery, int adapt){\r
                List<String> checkUsedQueries = new ArrayList<>();\r
                checkUsedQueries.add(firstCheckUsedQuery);\r
-               return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries);\r
+               return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries, false);\r
        }\r
 \r
-       private SingleTermRemover(List<ISchemaUpdaterStep> stepList, String stepName, String uuidTerm, List<String> checkUsedQueries) {\r
+       /**\r
+     * @param firstCheckUsedQuery The first query to check if this term is used. Must return a single int value > 0\r
+     * if this term is used at the given place.\r
+     * @return\r
+     */\r
+    public static final SingleTermRemover NewAudInstance(List<ISchemaUpdaterStep> stepList, String stepName,\r
+            String uuidTerm, String firstCheckUsedQuery, int adapt){\r
+        List<String> checkUsedQueries = new ArrayList<>();\r
+        checkUsedQueries.add(firstCheckUsedQuery);\r
+        return new SingleTermRemover(stepList, stepName, uuidTerm, checkUsedQueries, true);\r
+    }\r
+\r
+       private SingleTermRemover(List<ISchemaUpdaterStep> stepList, String stepName, String uuidTerm,\r
+               List<String> checkUsedQueries, boolean isAudit) {\r
                super(stepList, stepName);\r
                this.uuidTerm = uuidTerm;\r
                this.checkUsedQueries = checkUsedQueries;\r
+               this.isAudit = isAudit;\r
        }\r
 \r
     @Override\r
     public void invoke(ICdmDataSource datasource, IProgressMonitor monitor,\r
             CaseType caseType, SchemaUpdateResult result) throws SQLException {\r
+\r
         //get term id\r
                String sql = " SELECT id FROM %s WHERE uuid = '%s'";\r
+               String tableName = isAudit ? "DefinedTermBase_AUD" : "DefinedTermBase";\r
                Integer id = (Integer)datasource.getSingleValue(String.format(sql,\r
-                               caseType.transformTo("DefinedTermBase"), this.uuidTerm));\r
+                               caseType.transformTo(tableName), this.uuidTerm));\r
                if (id == null || id == 0){\r
                        return;\r
                }\r
@@ -86,30 +104,34 @@ public class SingleTermRemover
                try {\r
             //get representation ids\r
             List<Integer> repIDs = new ArrayList<>();\r
-            getRepIds(datasource, id, repIDs, "representations_id", "DefinedTermBase_Representation", caseType );\r
-            getRepIds(datasource, id, repIDs, "inverserepresentations_id", "DefinedTermBase_InverseRepresentation", caseType);\r
+            String tableName = isAudit ? "DefinedTermBase_Representation_AUD" : "DefinedTermBase_Representation";\r
+            String inverseTableName = isAudit ? "DefinedTermBase_InverseRepresentation_AUD" : "DefinedTermBase_InverseRepresentation";\r
+            getRepIds(datasource, id, repIDs, "representations_id", tableName, caseType );\r
+            getRepIds(datasource, id, repIDs, "inverserepresentations_id", inverseTableName, caseType);\r
 \r
             //remove from MN table\r
             String sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";\r
-            sql = String.format(sql, caseType.transformTo("DefinedTermBase_Representation"), id);\r
+            sql = String.format(sql, caseType.transformTo(tableName), id);\r
             datasource.executeUpdate(sql);\r
             sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";\r
-            sql = String.format(sql, caseType.transformTo("DefinedTermBase_InverseRepresentation"), id);\r
+            sql = String.format(sql, caseType.transformTo(tableName), id);\r
             datasource.executeUpdate(sql);\r
 \r
             //remove representations\r
+            tableName = isAudit ? "Representation_AUD" : "Representation";\r
             for (Integer repId : repIDs){\r
                sql = " DELETE FROM %s WHERE id = %d ";\r
                sql = String.format(sql,\r
-                               caseType.transformTo("Representation"),\r
+                               caseType.transformTo(tableName),\r
                                repId);\r
                datasource.executeUpdate(sql);\r
             }\r
 \r
             //remove term\r
+            tableName = isAudit ? "DefinedTermBase_AUD" : "DefinedTermBase";\r
             sql = " DELETE FROM %s WHERE id = %d";\r
             sql = String.format(sql,\r
-                       caseType.transformTo("DefinedTermBase"),\r
+                       caseType.transformTo(tableName),\r
                        id);\r
             datasource.executeUpdate(sql);\r
         } catch (SQLException e) {\r
index 7bdaedd45a705f8f8b7cc573099e38d186683b18..ce48ed53c33debc898b388ea4809f1e165be0c42 100644 (file)
@@ -31,7 +31,7 @@ public class SchemaUpdater_5185_5186 extends SchemaUpdaterBase {
 
        private static final CdmVersion startSchemaVersion = CdmVersion.V_05_18_05;
        //FIXME
-       private static final CdmVersion endSchemaVersion = CdmVersion.V_05_18_05;
+       private static final CdmVersion endSchemaVersion = CdmVersion.V_05_18_06;
 
 // ********************** FACTORY METHOD *************************************
 
@@ -58,6 +58,13 @@ public class SchemaUpdater_5185_5186 extends SchemaUpdaterBase {
                 + " WHERE trType.uuid = '605b1d01-f2b1-4544-b2e0-6f08def3d6ed'";
         SingleTermRemover.NewInstance(stepList, stepName, uuidTerm, checkUsedQueries, -99);
 
+        stepName = "remove invalid designation taxon relationship type";
+        uuidTerm = "605b1d01-f2b1-4544-b2e0-6f08def3d6ed";
+        checkUsedQueries = "SELECT count(*) FROM @@TaxonRelationship_AUD@@ tr "
+                + " INNER JOIN @@DefinedTermBase_AUD@@ trType ON trType.id = tr.type_id "
+                + " WHERE trType.uuid = '605b1d01-f2b1-4544-b2e0-6f08def3d6ed'";
+        SingleTermRemover.NewAudInstance(stepList, stepName, uuidTerm, checkUsedQueries, -99);
+
         return stepList;
     }