Project

General

Profile

Download (8.59 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2016 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.database.update.v40_50;
10

    
11
import java.sql.ResultSet;
12
import java.sql.SQLException;
13
import java.util.List;
14
import java.util.UUID;
15

    
16
import org.apache.log4j.Logger;
17

    
18
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
19
import eu.etaxonomy.cdm.database.ICdmDataSource;
20
import eu.etaxonomy.cdm.database.update.CaseType;
21
import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;
22
import eu.etaxonomy.cdm.database.update.SchemaUpdateResult;
23
import eu.etaxonomy.cdm.database.update.SchemaUpdaterStepBase;
24

    
25
/**
26
 * Creates new synonym records for all synonym having >1 synonym relationships.
27
 * Expects unplaced, excluded and taxonomicChildrenCount to not exist anymore
28
 * @author a.mueller
29
 * @since 14.11.2016
30
 *
31
 */
32
public class SynonymDeduplicator
33
            extends SchemaUpdaterStepBase{
34

    
35
    @SuppressWarnings("unused")
36
    private static final Logger logger = Logger.getLogger(SynonymDeduplicator.class);
37

    
38
    /**
39
     * @return
40
     */
41
    public static SynonymDeduplicator NewInstance(List<ISchemaUpdaterStep> stepList) {
42
        return new SynonymDeduplicator(stepList);
43
    }
44

    
45
    private static final String stepName = "Deduplicate synonyms code";
46

    
47
    /**
48
     * @param stepList
49
     * @param stepName
50
     */
51
    protected SynonymDeduplicator(List<ISchemaUpdaterStep> stepList) {
52
        super(stepList, stepName);
53
    }
54

    
55
    String idListSelect = " SELECT sr.uuid, sr.relatedfrom_id ";
56
    String selectAll = " SELECT syn.DTYPE, (SELECT Max(id)+1 FROM TaxonBase), " +
57
            " sr.created, sr.uuid, sr.updated, " +
58
            " syn.lsid_authority, syn.lsid_lsid, syn.lsid_namespace, syn.lsid_object, syn.lsid_revision, " +
59
            " syn.protectedtitlecache, syn.titleCache, syn.appendedphrase, " +
60
            " syn.doubtful, syn.usenamecache, syn.taxonstatusunknown, " +
61
            " sr.createdby_id,sr.updatedby_id, " +
62
            " syn.name_id, syn.sec_id, syn.publish, syn.secMicroReference,"
63
            + "sr.partial, sr.proParte, sr.type_id, sr.relatedTo_id ";
64
    String insert = " INSERT INTO @@TaxonBase@@ (DTYPE, id, created,uuid, updated,"
65
            + "lsid_authority,lsid_lsid,lsid_namespace,lsid_object,lsid_revision, protectedtitlecache,titleCache, appendedphrase,"
66
            + "doubtful, usenamecache,taxonstatusunknown,"
67
            + "createdby_id, updatedby_id, name_id, sec_id, publish, secMicroReference,"
68
            + "partial, proParte, type_id, acceptedTaxon_id)";
69

    
70
    String fromSQL =
71
       " FROM @@TaxonBase@@ syn INNER JOIN @@SynonymRelationship@@ sr ON sr.relatedfrom_id = syn.id ";
72
    String whereSQL =  " WHERE EXISTS ( " +
73
           "  SELECT * FROM @@SynonymRelationship@@ srFirst " +
74
           "  WHERE srFirst.id < sr.id " +
75
           "    AND srFirst.relatedfrom_id = sr.relatedfrom_id " +
76
        " )";
77

    
78
    @Override
79
    public void invoke(ICdmDataSource datasource, IProgressMonitor monitor,
80
            CaseType caseType, SchemaUpdateResult result) throws SQLException {
81

    
82
        //id list of all synonym relationships that need the synonym to be duplicated
83
        String listSql = caseType.replaceTableNames(idListSelect + fromSQL + whereSQL);
84
        ResultSet rs = datasource.executeQuery(listSql);
85
        while (rs.next()){
86
            String uuid = "'" + rs.getString(1) +"'";
87
            Integer oldSynonymId = rs.getInt(2);
88

    
89
            //create new synonym
90
            String update = insert + selectAll + fromSQL + " WHERE sr.uuid = " + uuid;
91
            datasource.executeUpdate(caseType.replaceTableNames(update));
92

    
93
            String sqlGetId = "SELECT id FROM @@TaxonBase@@ WHERE uuid = " + uuid;
94
            Integer newSynonymId = (Integer)datasource.getSingleValue(caseType.replaceTableNames(sqlGetId));
95

    
96
            //clone annotations
97
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "annotations_id", "Annotation", "text, linkbackUri, language_id, annotationtype_id, commentator_id", false);
98
            //clone marker
99
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "markers_id", "Marker", "flag, markertype_id", false);
100
            //clone credit
101
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "credits_id", "Credit", "text, abbreviatedtext, language_id, agent_id", true);
102
            //clone extension
103
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "extensions_id", "Extension", "value, type_id", false);
104
            //clone identifier
105
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "identifiers_id", "Identifier", "identifier, type_id", true);
106
            //clone sources
107
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "sources_id", "OriginalSourceBase", "DTYPE, citationmicroreference, originalnamestring, idinsource, idnamespace, citation_id, nameusedinsource_id, sourceType", false);
108
            //clone rightsInfo
109
            cloneExtensions(oldSynonymId, newSynonymId, datasource, caseType, "rights_id", "RightsInfo", "text, abbreviatedtext, uri, language_id, agent_id, type_id ", false);
110

    
111
            //remove old relationship
112
            String delete = "DELETE FROM @@SynonymRelationship@@ WHERE uuid = " + uuid;
113
            datasource.executeUpdate(caseType.replaceTableNames(delete));
114
        }
115

    
116
        return;
117
    }
118

    
119
    private void cloneExtensions(Integer oldSynonymId, Integer newSynonymId, ICdmDataSource datasource, CaseType caseType, String mnCol, String tableName, String specificParams, boolean withSortIndex) throws SQLException {
120
        String mnTableName = caseType.transformTo("TaxonBase_" + tableName);
121
        String listSql = " SELECT @mnCol FROM @mnTable WHERE taxonBase_id = @oldSynonymId "
122
                .replace("@mnCol", mnCol)
123
                .replace("@mnTable", mnTableName)
124
                .replace("@oldSynonymId", String.valueOf(oldSynonymId))
125
                ;
126
        if (withSortIndex){
127
            listSql += " ORDER BY sortIndex ";
128
        }
129
        ResultSet rs = datasource.executeQuery(listSql);
130

    
131
        Integer sortIndex = 0;
132
        while (rs.next()){
133
            sortIndex++;
134
            Integer oldExtensionId = rs.getInt(1);
135
            cloneExtension(newSynonymId, oldExtensionId, mnTableName, mnCol, datasource, caseType, tableName, specificParams, withSortIndex ? sortIndex : null);
136
        }
137

    
138
    }
139

    
140
    /**
141
     * @param id
142
     * @param caseType
143
     * @throws SQLException
144
     */
145
    private void cloneExtension(Integer newSynonymId, Integer oldExtensionId, String mnTableName, String mnCol, ICdmDataSource datasource, CaseType caseType,
146
            String tableName, String specificParams, Integer sortIndex) throws SQLException {
147

    
148
        //new id
149
        String maxIdSql = "SELECT max(id) FROM @tableName"
150
                .replace("@tableName",  caseType.transformTo(tableName));
151
        int newExtensionId = (Integer)datasource.getSingleValue(maxIdSql) + 1;
152

    
153
//      insert clone record
154
        String idParams = "id, uuid,";
155
        String generalParams = "created, updated, createdBy_id, updatedBy_id,";
156
        String allParams = idParams + generalParams + specificParams;
157
        String idSelect = newExtensionId + ", '" + UUID.randomUUID() + "',";
158
        String selectParams = idSelect + generalParams + specificParams;
159
        String sql = "INSERT INTO @tableName (@allParams)"
160
                + " SELECT @selectParams FROM @tableName WHERE id = " + oldExtensionId;
161
        sql = sql.replace("@selectParams", selectParams)
162
                .replace("@allParams", allParams)
163
                .replace("@tableName", caseType.transformTo(tableName))
164
                ;
165
        datasource.executeUpdate(sql);
166

    
167
        //insert MN
168
        String sortIndexStr = "";
169
        String sortIndexValueStr = "";
170
        if (sortIndex != null){
171
            sortIndexStr = ", sortIndex";
172
            sortIndexValueStr = ", " + sortIndex;
173
        }
174
        String insertMNSql = ("INSERT INTO @mnTable (taxonbase_id, @mn_col @sortIndexInsert)"
175
                + "VALUES (@newSynonymId, @extensionId @sortIndexValue)")
176
                    .replace("@mnTable", mnTableName)
177
                    .replace("@mn_col", mnCol)
178
                    .replace("@newSynonymId", String.valueOf(newSynonymId))
179
                    .replace("@extensionId", String.valueOf(newExtensionId))
180
                    .replace("@sortIndexInsert", sortIndexStr)
181
                    .replace("@sortIndexValue", sortIndexValueStr)
182
                    ;
183
        datasource.executeUpdate(insertMNSql);
184

    
185
    }
186
}
(9-9/10)