Project

General

Profile

Download (19.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 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

    
10
package eu.etaxonomy.cdm.database.update.v40_50;
11

    
12
import java.util.ArrayList;
13
import java.util.List;
14

    
15
import org.apache.log4j.Logger;
16

    
17
import eu.etaxonomy.cdm.database.update.ColumnAdder;
18
import eu.etaxonomy.cdm.database.update.ColumnNameChanger;
19
import eu.etaxonomy.cdm.database.update.ColumnRemover;
20
import eu.etaxonomy.cdm.database.update.ISchemaUpdater;
21
import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;
22
import eu.etaxonomy.cdm.database.update.IndexRenamer;
23
import eu.etaxonomy.cdm.database.update.MnTableCreator;
24
import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase;
25
import eu.etaxonomy.cdm.database.update.SimpleSchemaUpdaterStep;
26
import eu.etaxonomy.cdm.database.update.TableCreator;
27
import eu.etaxonomy.cdm.database.update.TableNameChanger;
28
import eu.etaxonomy.cdm.database.update.UniqueIndexDropper;
29

    
30
/**
31
 * @author a.mueller
32
 * @since 09.05.2017
33
 *
34
 */
35
public class SchemaUpdater_41_47 extends SchemaUpdaterBase {
36

    
37
	@SuppressWarnings("unused")
38
	private static final Logger logger = Logger.getLogger(SchemaUpdater_41_47.class);
39
	private static final String startSchemaVersion = "4.1.0.0.201607300000";
40
	private static final String endSchemaVersion = "4.7.0.0.201710040000";
41

    
42
	// ********************** FACTORY METHOD *************************************
43

    
44
	public static SchemaUpdater_41_47 NewInstance() {
45
		return new SchemaUpdater_41_47();
46
	}
47

    
48
	/**
49
	 * @param startSchemaVersion
50
	 * @param endSchemaVersion
51
	 */
52
	protected SchemaUpdater_41_47() {
53
		super(startSchemaVersion, endSchemaVersion);
54
	}
55

    
56
	@Override
57
	protected List<ISchemaUpdaterStep> getUpdaterList() {
58

    
59
		String stepName;
60
		String tableName;
61
		String newColumnName;
62

    
63
		List<ISchemaUpdaterStep> stepList = new ArrayList<>();
64

    
65
	    //#6600 remove unique indexes from Rights MN tables
66
        removeUniqueIndexForRights(stepList);
67

    
68
        //#5149 remove unique index on Sequence_Reference.citations_id
69
        tableName = "Sequence_Reference";
70
        String columnName = "citations_id";
71
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
72

    
73
        //#6340 nom status invalid updater
74
        NomStatusInvalidUpdater.NewInstance(stepList);
75

    
76
		//#6529
77
		//Extend WorkingSet to allow a more fine grained definiton of taxon set
78
		//min rank
79
        stepName = "Add minRank column";
80
        tableName = "WorkingSet";
81
        newColumnName = "minRank_id";
82
        String referencedTable = "DefinedTermBase";
83
        ColumnAdder.NewIntegerInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
84

    
85
        //max rank
86
        stepName = "Add maxRank column";
87
        tableName = "WorkingSet";
88
        newColumnName = "maxRank_id";
89
        referencedTable = "DefinedTermBase";
90
        ColumnAdder.NewIntegerInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
91

    
92
        //geo filter
93
        stepName= "Add geo filter MN table to WorkingSet";
94
        String firstTableName = "WorkingSet";
95
        String secondTableName = "DefinedTermBase";
96
        String secondTableAlias = "NamedArea";
97
        String attributeName = "geoFilter";
98
        boolean isList = ! IS_LIST;
99
        MnTableCreator.NewMnInstance(stepList, stepName, firstTableName, null, secondTableName, secondTableAlias, attributeName, INCLUDE_AUDIT, isList, IS_M_TO_M);
100

    
101
        //subtree filter
102
        stepName= "Add subtree filter MN table to WorkingSet";
103
        firstTableName = "WorkingSet";
104
        secondTableName = "TaxonNode";
105
        secondTableAlias = null;
106
        attributeName = "taxonSubtreeFilter";
107
        isList = ! IS_LIST;
108
        MnTableCreator.NewMnInstance(stepList, stepName, firstTableName, null, secondTableName, secondTableAlias, attributeName, INCLUDE_AUDIT, isList, IS_M_TO_M);
109

    
110
        //#6258
111
        stepName = "Add Registration table";
112
        tableName = "Registration";
113
        String[] columnNames = new String[]{"identifier","specificIdentifier","registrationDate","status",
114
                "institution_id","name_id","submitter_id"};
115
        String[] referencedTables = new String[]{null, null, null, null,
116
                "AgentBase","TaxonNameBase","UserAccount"};
117
        String[] columnTypes = new String[]{"string_255","string_255","datetime","string_10","int","int","int"};
118
        TableCreator.NewAnnotatableInstance(stepList, stepName, tableName,
119
                columnNames, columnTypes, referencedTables, INCLUDE_AUDIT);
120

    
121
        //add blockedBy_id
122
        stepName= "Add blockedBy_id to Registration";
123
        firstTableName = "Registration";
124
        secondTableName = "Registration";
125
        attributeName = "blockedBy";
126
        isList = ! IS_LIST;
127
        MnTableCreator.NewMnInstance(stepList, stepName, firstTableName, null, secondTableName, null, attributeName, INCLUDE_AUDIT, isList, IS_M_TO_M);
128

    
129
        //add type designations
130
        stepName= "Add type designations to Registration";
131
        firstTableName = "Registration";
132
        String firstColumnName = "registrations";
133
        secondTableName = "TypeDesignationBase";
134
        attributeName = "typeDesignations";
135
        isList = false;
136
        MnTableCreator.NewMnInstance(stepList, stepName, firstTableName, null, firstColumnName, secondTableName, null, attributeName, INCLUDE_AUDIT, isList, IS_M_TO_M);
137

    
138
        //#5258
139
        //Add "accessed" to Reference
140
        stepName = "Add 'accessed' to Reference";
141
        tableName = "Reference";
142
        newColumnName = "accessed";
143
        ColumnAdder.NewDateTimeInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL);
144

    
145
        //#6618 Add structure column to DefinedTermBase (Character)
146
        stepName = "Add structure column to DefinedTermBase (Character)";
147
        tableName = "DefinedTermBase";
148
        newColumnName = "structure_id";
149
        referencedTable = "FeatureNode";
150
        ColumnAdder.NewIntegerInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
151

    
152
        //#6618 Add property column to DefinedTermBase (Character)
153
        stepName = "Add property column to DefinedTermBase (Character)";
154
        tableName = "DefinedTermBase";
155
        newColumnName = "property_id";
156
        referencedTable = "FeatureNode";
157
        ColumnAdder.NewIntegerInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
158

    
159
        //#6361 and children
160
        mergeTaxonName(stepList);
161

    
162
        //#6535 update termtype for CdmMetaData (int => string)
163
        updateTermTypeForCdmMetaDataPropertyName(stepList);
164

    
165
        //##6661 Add initials to agent base
166
        stepName = "Add initials to AgentBase";
167
        tableName = "AgentBase";
168
        newColumnName = "initials";
169
        int length = 80;
170
        ColumnAdder.NewStringInstance(stepList, stepName, tableName, newColumnName, length, INCLUDE_AUDIT);
171

    
172
        stepName = "Update initials and firstname";
173
        InitialsUpdater.NewInstance(stepList);
174

    
175
        //#6663
176
        //Add "lastRetrieved" to Reference
177
        stepName = "Add 'lastRetrieved' to Reference";
178
        tableName = "Reference";
179
        newColumnName = "lastRetrieved";
180
        ColumnAdder.NewDateTimeInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL);
181

    
182
        stepName = "Add externalId to Reference";
183
        tableName = "Reference";
184
        newColumnName = "externalId";
185
        length = 255;
186
        ColumnAdder.NewStringInstance(stepList, stepName, tableName, newColumnName, length, INCLUDE_AUDIT);
187

    
188
        stepName = "Add externalLink to Reference";
189
        tableName = "Reference";
190
        newColumnName = "externalLink";
191
        ColumnAdder.NewClobInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT);
192

    
193
        stepName = "Add authorityType to Reference";
194
        tableName = "Reference";
195
        newColumnName = "authorityType";
196
        length = 10;
197
        ColumnAdder.NewStringInstance(stepList, stepName, tableName, newColumnName, length, INCLUDE_AUDIT);
198

    
199
        //#6472 add key to IntextReference
200
        stepName = "Add key to IntextReference";
201
        tableName = "IntextReference";
202
        newColumnName = "key_id";
203
        referencedTable = "PolytomousKey";
204
        ColumnAdder.NewIntegerInstance(stepList, stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
205

    
206
        //#5817 rename relationshipTermBase_inverseRepresentation
207
        stepName = "Rename relationshipTermBase_inverseRepresentation";
208
        String oldName = "RelationshipTermBase_inverseRepresentation";
209
        String newName = "TermBase_inverseRepresentation";
210
        TableNameChanger.NewInstance(stepList, stepName, oldName, newName, INCLUDE_AUDIT);
211

    
212
        //#5817 rename TermBase_inverseRepresentation.relationshipTermBase_id
213
        stepName = "Rename relationshipTermBase_inverseRepresentation.relationshipTermBase_id";
214
        tableName = newName;
215
        String oldColumnName = "relationshipTermBase_id";
216
        newColumnName = "term_id";
217
        ColumnNameChanger.NewIntegerInstance(stepList, stepName, tableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
218

    
219
        //#6226 remove orphaned PolytomousKeyNodes
220
        stepName = "remove orphaned PolytomousKeyNodes";
221
        String query = " DELETE FROM @@PolytomousKeyNode@@ WHERE key_id NOT IN (SELECT id FROM @@PolytomousKey@@)";
222
        String aud_query = " DELETE FROM @@PolytomousKeyNode_AUD@@ WHERE key_id NOT IN (SELECT id FROM @@PolytomousKey_AUD@@)";
223
        SimpleSchemaUpdaterStep.NewExplicitAuditedInstance(stepList, stepName, query, aud_query, -99);
224

    
225
        //#6226 remove orphaned key statements
226
        OrphanedKeyStatementRemover.NewInstance(stepList);
227

    
228
        return stepList;
229
    }
230

    
231
    /**
232
     * @param stepList
233
     */
234
	//#6600 remove Unique indexes from Rights MN tables
235
    private void removeUniqueIndexForRights(List<ISchemaUpdaterStep> stepList) {
236
        String tableName;
237

    
238
        tableName = "AgentBase_RightsInfo";
239
        String columnName = "rights_id";
240
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
241

    
242
        tableName = "Classification_RightsInfo";
243
        columnName = "rights_id";
244
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
245

    
246
        tableName = "Collection_RightsInfo";
247
        columnName = "rights_id";
248
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
249

    
250
        tableName = "DefinedTermBase_RightsInfo";
251
        columnName = "rights_id";
252
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
253

    
254
        tableName = "DescriptionBase_RightsInfo";
255
        columnName = "rights_id";
256
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
257

    
258
        tableName = "FeatureTree_RightsInfo";
259
        columnName = "rights_id";
260
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
261

    
262
        tableName = "Media_RightsInfo";
263
        columnName = "rights_id";
264
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
265

    
266
        tableName = "PolytomousKey_RightsInfo";
267
        columnName = "rights_id";
268
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
269

    
270
        tableName = "Reference_RightsInfo";
271
        columnName = "rights_id";
272
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
273

    
274
        tableName = "SpecimenOrObservationBase_RightsInfo";
275
        columnName = "rights_id";
276
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
277

    
278
        tableName = "TaxonBase_RightsInfo";
279
        columnName = "rights_id";
280
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
281

    
282
        tableName = "TaxonNameBase_RightsInfo";
283
        columnName = "rights_id";
284
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
285

    
286
        tableName = "TermVocabulary_RightsInfo";
287
        columnName = "rights_id";
288
        UniqueIndexDropper.NewInstance(stepList, tableName, columnName, !INCLUDE_AUDIT);
289
    }
290

    
291

    
292
    /**
293
     * #6535 update termtype for CdmMetaData (int => string)
294
     */
295
    private void updateTermTypeForCdmMetaDataPropertyName(List<ISchemaUpdaterStep> stepList) {
296
        String stepName = "Rename CdmMetaData.propertyName column";
297
        String tableName = "CdmMetaData";
298
        String oldColumnName = "propertyName";
299
        String newColumnName = "propertyNameOld";
300
        ColumnNameChanger.NewIntegerInstance(stepList, stepName, tableName, oldColumnName, newColumnName, ! INCLUDE_AUDIT);
301

    
302
        //... create new column
303
        stepName = "Create new CdmMetaData.propertyName column";
304
        tableName = "CdmMetaData";
305
        newColumnName = "propertyName";
306
        ColumnAdder.NewStringInstance(stepList, stepName, tableName, newColumnName, 20, ! INCLUDE_AUDIT);
307

    
308
        updateSingleTermTypeForCdmMetaDataPropertyName(stepList, "SCHEMA_VERSION", 0);
309
        updateSingleTermTypeForCdmMetaDataPropertyName(stepList, "TERM_VERSION", 1 );
310
        updateSingleTermTypeForCdmMetaDataPropertyName(stepList, "CREATED", 2 );
311
        updateSingleTermTypeForCdmMetaDataPropertyName(stepList, "CREATE_NOTE", 3 );
312
        updateSingleTermTypeForCdmMetaDataPropertyName(stepList, "INST_NAME", 4 );
313
        updateSingleTermTypeForCdmMetaDataPropertyName(stepList, "INST_ID", 5 );
314

    
315
        //... create new column
316
        stepName = "Remove column CdmMetaData.propertyNameOld";
317
        tableName = "CdmMetaData";
318
        oldColumnName = "propertyNameOld";
319
        ColumnRemover.NewInstance(stepList, stepName, tableName, oldColumnName, ! INCLUDE_AUDIT);
320

    
321
    }
322

    
323

    
324
    /**
325
     * @param stepList
326
     * @param name
327
     * @param index
328
     */
329
    private void updateSingleTermTypeForCdmMetaDataPropertyName(List<ISchemaUpdaterStep> stepList,
330
            String name, int index) {
331
        String stepName = "Update value for " + name;
332
        String query = "UPDATE @@CdmMetaData@@ SET propertyName = '"+name+"' WHERE propertyNameOld = "+index;
333
        SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepList, stepName, query, -99);
334
    }
335

    
336
    /**
337
     * #6361 and children
338
     */
339
    private void mergeTaxonName(List<ISchemaUpdaterStep> stepList) {
340

    
341
        //#6367 Add nameType column to TaxonNameBase
342
        String stepName = "Add nameType column to TaxonNameBase";
343
        String tableName = "TaxonNameBase";
344
        String newColumnName = "nameType";
345
        int length = 15;
346
        ColumnAdder.NewStringInstance(stepList, stepName, tableName, newColumnName, length, INCLUDE_AUDIT);
347

    
348
        //#6367 #6368
349
        updateNameTypes(stepList);
350

    
351
        // update anamorphic
352
        stepName = "Update anamorphic ";
353
        String query = "UPDATE @@TaxonNameBase@@ tnb "
354
                + " SET anamorphic = @FALSE@ "
355
                + " WHERE anamorphic IS NULL " ;
356
        SimpleSchemaUpdaterStep.NewAuditedInstance(stepList, stepName, query, "TaxonNameBase", -99);
357

    
358
        //#6368 Remove DTYPE
359
        stepName = "Remove DTYPE from TaxonNameBase";
360
        tableName = "TaxonNameBase";
361
        String oldColumnName = "DTYPE";
362
        ColumnRemover.NewInstance(stepList, stepName, tableName, oldColumnName, INCLUDE_AUDIT);
363

    
364
        //#6368
365
        changeTaxonNameTableName(stepList);
366

    
367
        //#6717 update index names
368
        IndexRenamer.NewStringInstance(stepList, "TaxonName",
369
                "taxonNameBaseNameCacheIndex", "taxonNameNameCacheIndex", "nameCache", 255);
370

    
371
        IndexRenamer.NewStringInstance(stepList, "TaxonName",
372
                "taxonNameBaseTitleCacheIndex", "taxonNameTitleCacheIndex", "titleCache", 333);
373

    
374
    }
375

    
376
    /**
377
     * #6368
378
     */
379
    private void changeTaxonNameTableName(List<ISchemaUpdaterStep> stepList) {
380

    
381
        //Update
382
        String oldName = "TaxonNameBase";
383
        changeSingleTaxonNameTableName(stepList, oldName);
384

    
385
        oldName = "TaxonNameBase_Annotation";
386
        changeSingleTaxonNameTableName(stepList, oldName);
387

    
388
        oldName = "TaxonNameBase_Credit";
389
        changeSingleTaxonNameTableName(stepList, oldName);
390

    
391
        oldName = "TaxonNameBase_Extension";
392
        changeSingleTaxonNameTableName(stepList, oldName);
393

    
394
        oldName = "TaxonNameBase_Identifier";
395
        changeSingleTaxonNameTableName(stepList, oldName);
396

    
397
        oldName = "TaxonNameBase_Marker";
398
        changeSingleTaxonNameTableName(stepList, oldName);
399

    
400
        oldName = "TaxonNameBase_NomenclaturalStatus";
401
        changeSingleTaxonNameTableName(stepList, oldName);
402

    
403
        oldName = "TaxonNameBase_OriginalSourceBase";
404
        changeSingleTaxonNameTableName(stepList, oldName);
405

    
406
        oldName = "TaxonNameBase_RightsInfo";
407
        changeSingleTaxonNameTableName(stepList, oldName);
408

    
409
        oldName = "TaxonNameBase_TypeDesignationBase";
410
        changeSingleTaxonNameTableName(stepList, oldName);
411

    
412
        //hibernate sequence
413
        String stepName = "Update hibernate sequence entry name for TaxonNameBase";
414
        String query = "UPDATE hibernate_sequences SET sequence_name = 'TaxonName' WHERE sequence_name = 'TaxonNameBase'";
415
        SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepList, stepName, query, -99);
416

    
417
        //grantedauthority for taxonnamebase
418
        stepName = "Update GrantedAuthorityImpl for TaxonNameBase";
419
        query = "UPDATE GrantedAuthorityImpl " +
420
                " SET authority = Replace (authority, 'TAXONNAMEBASE','TAXONNAME') " +
421
                " WHERE authority like '%TAXONNAMEBASE%' ";
422
        SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepList, stepName, query, -99);
423

    
424

    
425
        //LSIDAuthority_namespaces for taxonnamebase
426
        stepName = "Upate LSIDAuthority_namespaces for TaxonNameBase";
427
        query = "UPDATE @@LSIDAuthority_namespaces@@ " +
428
                " SET namespaces_element = Replace (namespaces_element, 'TaxonNameBase','TaxonName') " +
429
                " WHERE namespaces_element like '%TaxonNameBase%' ";
430
        SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepList, stepName, query, -99);
431
    }
432

    
433
    /**
434
     * @param #6368
435
     */
436
    private void changeSingleTaxonNameTableName(List<ISchemaUpdaterStep> stepList, String oldTableName) {
437
        String stepName = "Rename " +  oldTableName;
438
        String newTableName = oldTableName.replace("TaxonNameBase", "TaxonName");
439
        TableNameChanger.NewInstance(stepList, stepName, oldTableName, newTableName, INCLUDE_AUDIT);
440

    
441
        if (oldTableName.contains("_")){
442
            stepName = "Rename " +  oldTableName + ".taxonNameBase_id";
443
            String oldColumnName = "TaxonNameBase_id";
444
            String newColumnName = "TaxonName_id";
445
            ColumnNameChanger.NewIntegerInstance(stepList, stepName, newTableName, oldColumnName, newColumnName, INCLUDE_AUDIT);
446
        }
447
    }
448

    
449
    /**
450
     * #6367
451
     */
452
    private void updateNameTypes(List<ISchemaUpdaterStep> stepList) {
453
        updateSingleNameType(stepList, "ViralName", "ICVCN");
454
        updateSingleNameType(stepList, "NonViralName", "NonViral");
455
        updateSingleNameType(stepList, "BotanicalName", "ICNAFP");
456
        updateSingleNameType(stepList, "ZoologicalName", "ICZN");
457
        updateSingleNameType(stepList, "CultivarPlantName", "ICNCP");
458
        updateSingleNameType(stepList, "BacterialName", "ICNB");
459
    }
460

    
461
    /**
462
     * @param uuid the uuid
463
     * @param oldSymbol
464
     * @param newSybol
465
     */
466
    private void updateSingleNameType(List<ISchemaUpdaterStep> stepList,
467
            String dtype, String nameType) {
468

    
469
        String stepName = "Update nameType for " + dtype;
470
        String query = "UPDATE @@TaxonNameBase@@ tnb "
471
                + " SET nameType = '" + nameType + "'"
472
                + " WHERE dtype = '" + dtype + "'" ;
473
        SimpleSchemaUpdaterStep.NewAuditedInstance(stepList, stepName, query, "TaxonNameBase", -99);
474
    }
475

    
476
	@Override
477
	public ISchemaUpdater getPreviousUpdater() {
478
		return SchemaUpdater_40_41.NewInstance();
479
	}
480

    
481
}
(7-7/10)