prepare cdm 4.7
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / update / v40_41 / SchemaUpdater_40_41.java
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_41;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.apache.log4j.Logger;
16
17 import eu.etaxonomy.cdm.common.UTF8;
18 import eu.etaxonomy.cdm.database.DatabaseTypeEnum;
19 import eu.etaxonomy.cdm.database.update.ColumnAdder;
20 import eu.etaxonomy.cdm.database.update.ColumnRemover;
21 import eu.etaxonomy.cdm.database.update.ISchemaUpdater;
22 import eu.etaxonomy.cdm.database.update.ISchemaUpdaterStep;
23 import eu.etaxonomy.cdm.database.update.IndexAdder;
24 import eu.etaxonomy.cdm.database.update.LanguageStringTableCreator;
25 import eu.etaxonomy.cdm.database.update.SchemaUpdaterBase;
26 import eu.etaxonomy.cdm.database.update.SimpleSchemaUpdaterStep;
27 import eu.etaxonomy.cdm.database.update.SortIndexUpdater;
28 import eu.etaxonomy.cdm.database.update.TableDroper;
29 import eu.etaxonomy.cdm.database.update.v36_40.SchemaUpdater_36_40;
30 import eu.etaxonomy.cdm.database.update.v41_47.SchemaUpdater_41_47;
31
32 /**
33 * @author a.mueller
34 * @created 16.04.2016
35 */
36 public class SchemaUpdater_40_41 extends SchemaUpdaterBase {
37
38 @SuppressWarnings("unused")
39 private static final Logger logger = Logger.getLogger(SchemaUpdater_40_41.class);
40 private static final String endSchemaVersion = "4.1.0.0.201607300000";
41 private static final String startSchemaVersion = "4.0.0.0.201604200000";
42
43 // ********************** FACTORY METHOD *************************************
44
45 public static SchemaUpdater_40_41 NewInstance() {
46 return new SchemaUpdater_40_41();
47 }
48
49 /**
50 * @param startSchemaVersion
51 * @param endSchemaVersion
52 */
53 protected SchemaUpdater_40_41() {
54 super(startSchemaVersion, endSchemaVersion);
55 }
56
57 @Override
58 protected List<ISchemaUpdaterStep> getUpdaterList() {
59
60 String stepName;
61 String tableName;
62 ISchemaUpdaterStep step;
63 String query;
64 String newColumnName;
65 String oldColumnName;
66
67 List<ISchemaUpdaterStep> stepList = new ArrayList<ISchemaUpdaterStep>();
68
69
70 //#3658 update nomenclatural code
71 NomenclaturalCodeUpdater.NewInstance(stepList);
72
73 //#5970
74 //Implement allowOverride in CdmPreference
75 stepName = "Add allowOverride in CdmPreference";
76 tableName = "CdmPreference";
77 newColumnName = "allowOverride";
78 step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, ! INCLUDE_AUDIT, false);
79 stepList.add(step);
80
81 //#5875
82 //Implement isDefault to DescriptionBase
83 stepName = "Add isDefault in DescriptionBase";
84 tableName = "DescriptionBase";
85 newColumnName = "isDefault";
86 step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false);
87 stepList.add(step);
88
89 //#5826
90 //Cleanup empty name descriptions
91 stepName = "Cleanup empty name descriptions";
92 // query = " DELETE FROM @@DescriptionBase@@ db " +
93 // " WHERE db.DTYPE = 'TaxonNameDescription' " +
94 // " AND NOT EXISTS (SELECT * FROM @@DescriptionElementBase@@ deb WHERE deb.indescription_id = db.id )";
95 query = "DELETE FROM @@DescriptionBase@@ "
96 + " WHERE DTYPE = 'TaxonNameDescription' AND id IN (SELECT id FROM " +
97 " (SELECT id FROM DescriptionBase db "
98 + " WHERE NOT EXISTS (SELECT * FROM DescriptionElementBase deb WHERE deb.indescription_id = db.id )"
99 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_Annotation MN WHERE MN.descriptionbase_id = db.id) "
100 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_Credit MN WHERE MN.descriptionbase_id = db.id) "
101 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_Extension MN WHERE MN.descriptionbase_id = db.id) "
102 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_Identifier MN WHERE MN.descriptionbase_id = db.id) "
103 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_Marker MN WHERE MN.descriptionbase_id = db.id) "
104 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_OriginalSourceBase MN WHERE MN.descriptionbase_id = db.id) "
105 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_Reference MN WHERE MN.descriptionbase_id = db.id) "
106 + " AND NOT EXISTS (SELECT * FROM DescriptionBase_RightsInfo MN WHERE MN.descriptionbase_id = db.id) "
107 + " AND NOT EXISTS (SELECT * FROM WorkingSet_DescriptionBase MN WHERE MN.descriptions_id = db.id) "
108 + " ) as drvTbl) ";
109 SimpleSchemaUpdaterStep simpleStep = SimpleSchemaUpdaterStep.NewNonAuditedInstance(stepName, query, -99);
110 stepList.add(simpleStep);
111
112 //#5921
113 //UPDATE congruent symbol in DefinedTermBase
114 stepName = "UPDATE congruent symbol in DefinedTermBase";
115 query = " UPDATE @@DefinedTermBase@@ "
116 + " SET idInVocabulary = Replace(idInVocabulary, '\u2245', '\u225c'), symbol = Replace(symbol, '\u2245', '\u225c'), inverseSymbol = Replace(inverseSymbol, '\u2245', '\u225c')"
117 + " WHERE DTYPE like 'TaxonRel%' "
118 + " AND (idInVocabulary like '%\u2245%' OR symbol like '%\u2245%' OR inverseSymbol like '%\u2245%' )";
119 simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "DefinedTermBase", -99);
120 stepList.add(simpleStep);
121
122 //#5921
123 //UPDATE congruent symbol in Representations
124 stepName = "UPDATE congruent symbol in Representations";
125 query = " UPDATE @@Representation@@ "
126 + " SET abbreviatedLabel = Replace(abbreviatedLabel, '\u2245', '\u225c') "
127 + " WHERE (abbreviatedLabel like '%\u2245%' )";
128 simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "Representation", -99);
129 stepList.add(simpleStep);
130
131
132 //#5976
133 //update sortindex on FeatureNode children
134 stepName = "Update sort index on FeatureNode children";
135 tableName = "FeatureNode";
136 String parentIdColumn = "parent_id";
137 String sortIndexColumn = "sortIndex";
138 SortIndexUpdater updateSortIndex = SortIndexUpdater.NewUpdateExistingSortindexInstance(stepName, tableName, parentIdColumn, sortIndexColumn, INCLUDE_AUDIT);
139 stepList.add(updateSortIndex);
140
141 //#5976
142 // update sortindex for TaxonNodes
143 stepName = "Update sort index on TaxonNode children";
144 tableName = "TaxonNode";
145 parentIdColumn = "parent_id";
146 sortIndexColumn = "sortIndex";
147 updateSortIndex = SortIndexUpdater.NewUpdateExistingSortindexInstance(
148 stepName, tableName, parentIdColumn, sortIndexColumn,
149 INCLUDE_AUDIT);
150 stepList.add(updateSortIndex);
151
152 //#5976
153 stepName = "Update sort index on PolytomousKeyNode children";
154 tableName = "PolytomousKeyNode";
155 parentIdColumn = "parent_id";
156 sortIndexColumn = "sortIndex";
157 updateSortIndex = SortIndexUpdater.NewUpdateExistingSortindexInstance(
158 stepName, tableName, parentIdColumn, sortIndexColumn,
159 INCLUDE_AUDIT);
160 stepList.add(updateSortIndex);
161
162 //#3925
163 //excluded to TaxonNode
164 stepName = "Add excluded to TaxonNode";
165 tableName = "TaxonNode";
166 newColumnName = "excluded";
167 step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false);
168 stepList.add(step);
169
170 //#3925
171 //Move excluded from Taxon to TaxonNode
172 stepName = "Move excluded from Taxon to TaxonNode";
173 query = "UPDATE @@TaxonNode@@ tn " +
174 " SET excluded = (SELECT DISTINCT excluded FROM @@TaxonBase@@ tb WHERE tb.id = tn.taxon_id)";
175 simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonNode", -99)
176 //.addDefaultAuditing("TaxonBase") removed due to non unique results in subquery, solving this problem is too much work to be implemented here, so audited values will not be correct partly but always representing the current state
177 ;
178 stepList.add(simpleStep);
179
180 stepName = "Move excluded from Taxon to TaxonNode/set null to false";
181 query = "UPDATE @@TaxonNode@@ SET excluded = 0 WHERE excluded IS NULL";
182 simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonNode", -99);
183 simpleStep.put(DatabaseTypeEnum.PostgreSQL, query.replace("0", "false"));
184 simpleStep.putAudited(DatabaseTypeEnum.PostgreSQL, query.replace("TaxonNode","TaxonNode_AUD").replace("0", "false"));
185 stepList.add(simpleStep);
186
187 //#3925
188 //remove excluded from TaxonNode
189 stepName = "Remove excluded from TaxonBase";
190 tableName = "TaxonBase";
191 oldColumnName = "excluded";
192 step = ColumnRemover.NewInstance(stepName, tableName, oldColumnName, INCLUDE_AUDIT);
193 stepList.add(step);
194
195 //#3925
196 //unplaced to TaxonNode
197 stepName = "Add unplaced to TaxonNode";
198 tableName = "TaxonNode";
199 newColumnName = "unplaced";
200 step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false);
201 stepList.add(step);
202
203
204 //#3925
205 //Move unplaced from Taxon to TaxonNode
206
207 stepName = "Move unplaced from Taxon to TaxonNode";
208 query = "UPDATE @@TaxonNode@@ tn " +
209 " SET unplaced = (SELECT DISTINCT unplaced FROM @@TaxonBase@@ tb WHERE tb.id = tn.taxon_id)";
210 simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonNode", -99)
211 //.addDefaultAuditing("TaxonBase") removed due to non unique results in subquery, solving this problem is too much work to be implemented here, so audited values will not be correct partly but always representing the current state
212 ;
213 stepList.add(simpleStep);
214
215 stepName = "Move unplaced from Taxon to TaxonNode/set null to false";
216 query = "UPDATE @@TaxonNode@@ SET unplaced = 0 WHERE unplaced IS NULL";
217 simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "TaxonNode", -99);
218 simpleStep.put(DatabaseTypeEnum.PostgreSQL, query.replace("0", "false"));
219 simpleStep.putAudited(DatabaseTypeEnum.PostgreSQL, query.replace("TaxonNode","TaxonNode_AUD").replace("0", "false"));
220 stepList.add(simpleStep);
221
222 //#3925
223 //remove unplaced from TaxonNode
224 stepName = "Remove unplaced from TaxonBase";
225 tableName = "TaxonBase";
226 oldColumnName = "unplaced";
227 step = ColumnRemover.NewInstance(stepName, tableName, oldColumnName, INCLUDE_AUDIT);
228 stepList.add(step);
229
230 //#5778
231 //update PresenceAbsenceTerm symbols
232 updatePresenceAbsenceTermSymbols(stepList);
233
234 //#6089
235 //Remove taxonomicParentCache from Taxon
236 stepName = "Remove taxonomicParentCache from Taxon";
237 tableName = "TaxonBase";
238 oldColumnName = "taxonomicParentCache_id";
239 step = ColumnRemover.NewInstance(stepName, tableName, oldColumnName, INCLUDE_AUDIT);
240 stepList.add(step);
241
242 //#6089
243 //Remove taxonomicChildrenCount from Taxon
244 stepName = "Remove taxonomicChildrenCount from Taxon";
245 tableName = "TaxonBase";
246 oldColumnName = "taxonomicChildrenCount";
247 step = ColumnRemover.NewInstance(stepName, tableName, oldColumnName, INCLUDE_AUDIT);
248 stepList.add(step);
249
250 //#5974 Remove synonym relationships
251 removeSynonymRelationships_5974(stepList);
252
253
254 //#5981 Add abbreviation to Rank "Cultivar"
255 stepName = "Add abbreviation to Rank 'Cultivar'";
256 String updateSql = "UPDATE Representation SET abbreviatedLabel='cv.' WHERE label='Cultivar'";
257 String nonAuditedTableName = "Representation";
258 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, nonAuditedTableName, -99);
259 stepList.add(step);
260
261 //#5981 Add abbreviation to idInVoc for 'Cultivar'
262 stepName = "#5981 Add abbreviation to idInVoc for 'Cultivar'";
263 updateSql = "UPDATE DefinedTermBase SET idInVocabulary='cv.' WHERE uuid='5e98415b-dc6e-440b-95d6-ea33dbb39ad0'";
264 nonAuditedTableName = "DefinedTermBase";
265 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, nonAuditedTableName, -99);
266 stepList.add(step);
267
268 //#5952 Add identityCache
269 stepName = "Add identityCache";
270 tableName = "SpecimenOrObservationBase";
271 newColumnName = "identityCache";
272 step = ColumnAdder.NewStringInstance (stepName, tableName, newColumnName, INCLUDE_AUDIT);
273 stepList.add(step);
274
275 //index
276 stepName = "Add identityCache index";
277 tableName = "SpecimenOrObservationBase";
278 newColumnName = "identityCache";
279 step = IndexAdder.NewInstance(stepName, tableName, newColumnName, null);
280 stepList.add(step);
281
282 stepName = "Add protectedIdentityCache";
283 tableName = "SpecimenOrObservationBase";
284 newColumnName = "protectedIdentityCache";
285 step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false);
286 stepList.add(step);
287
288 //#5634 Add excluded note
289 stepName = "Add excluded note";
290 tableName = "TaxonNode";
291 String attributeName = "excludedNote";
292 step = LanguageStringTableCreator.NewLanguageStringInstance(stepName, tableName, attributeName, INCLUDE_AUDIT);
293 stepList.add(step);
294
295 return stepList;
296 }
297
298 private void removeSynonymRelationships_5974(List<ISchemaUpdaterStep> stepList) {
299 //add partial column to Synonym
300 String stepName = "Add partial column to Synonym";
301 String tableName = "TaxonBase";
302 String newColumnName = "partial";
303 ISchemaUpdaterStep step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false);
304 stepList.add(step);
305
306 //add proParte column to Synonym
307 stepName = "Add proParte column to Synonym";
308 tableName = "TaxonBase";
309 newColumnName = "proParte";
310 step = ColumnAdder.NewBooleanInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, false);
311 stepList.add(step);
312
313 //add type column to Synonym
314 stepName = "Add type column to Synonym";
315 tableName = "TaxonBase";
316 newColumnName = "type_id";
317 String referencedTable = "DefinedTermBase";
318 step = ColumnAdder.NewIntegerInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
319 stepList.add(step);
320
321 //add acceptedTaxon_id to Synonym
322 stepName = "Add acceptedTaxon to Synonym";
323 tableName = "TaxonBase";
324 newColumnName = "acceptedTaxon_id";
325 referencedTable = "TaxonBase";
326 step = ColumnAdder.NewIntegerInstance(stepName, tableName, newColumnName, INCLUDE_AUDIT, !NOT_NULL, referencedTable);
327 stepList.add(step);
328
329 //move data
330 //move duplicates first
331 step = SynonymDeduplicator.NewInstance();
332 stepList.add(step);
333
334 //update pro parte
335 stepName = "Update proParte";
336 String updateSql = "UPDATE @@TaxonBase@@ syn " +
337 " SET proParte = (SELECT DISTINCT proParte FROM @@SynonymRelationship@@ sr WHERE sr.relatedFrom_id = syn.id) " +
338 " WHERE acceptedTaxon_id IS NULL ";
339 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, "TaxonBase", -99)
340 //.addDefaultAuditing("SynonymRelationship") //difficult to implement due to non-uniqueness in subquery
341 ;
342 stepList.add(step);
343
344 updateSql = "UPDATE @@TaxonBase@@ " +
345 " SET proParte = @FALSE@ " +
346 " WHERE DTYPE='Synonym' AND proParte IS NULL ";
347 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, "TaxonBase", -99);
348 stepList.add(step);
349
350
351 //update partial
352 stepName = "Update partial";
353 updateSql = "UPDATE @@TaxonBase@@ syn " +
354 " SET partial=(SELECT DISTINCT partial FROM @@SynonymRelationship@@ sr WHERE sr.relatedFrom_id = syn.id) " +
355 " WHERE acceptedTaxon_id IS NULL ";
356 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, "TaxonBase", -99)
357 //.addDefaultAuditing("SynonymRelationship") //difficult to implement due to non-uniqueness in subquery
358 ;
359 stepList.add(step);
360
361 updateSql = "UPDATE @@TaxonBase@@ " +
362 " SET partial = @FALSE@ " +
363 " WHERE DTYPE='Synonym' AND partial IS NULL ";
364 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, "TaxonBase", -99);
365 stepList.add(step);
366
367 //update synonym type
368 stepName = "Update Synonym type";
369 updateSql = "UPDATE @@TaxonBase@@ syn " +
370 " SET type_id=(SELECT DISTINCT type_id FROM @@SynonymRelationship@@ sr WHERE sr.relatedFrom_id = syn.id)" +
371 " WHERE acceptedTaxon_id IS NULL ";
372 // String updateSqlAud = updateSql.replace("TaxonBase", "TaxonBase_AUD").replace("SynonymRelationship", "SynonymRelationship_AUD");
373 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, "TaxonBase", -99);
374 stepList.add(step);
375
376 //update acceptedTaxon_id
377 stepName = "Update acceptedTaxon_id";
378 updateSql = "UPDATE @@TaxonBase@@ syn " +
379 " SET acceptedTaxon_id=(SELECT DISTINCT relatedTo_id FROM @@SynonymRelationship@@ sr WHERE sr.relatedFrom_id = syn.id)" +
380 " WHERE acceptedTaxon_id IS NULL ";
381 // updateSqlAud = updateSql.replace("TaxonBase", "TaxonBase_AUD").replace("SynonymRelationship", "SynonymRelationship_AUD");
382 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, "TaxonBase", -99);
383 stepList.add(step);
384
385
386
387 //rename SynonymRelationshipType to SynonymType in DefinedTermBase.DTYPE
388 stepName = "Rename SynonymRelationshipType to SynonymType in DefinedTermBase.DTYPE";
389 updateSql = "UPDATE DefinedTermBase SET DTYPE='SynonymType' WHERE DTYPE='SynonymRelationshipType'";
390 String nonAuditedTableName = "DefinedTermBase";
391 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, nonAuditedTableName, -99);
392 stepList.add(step);
393
394 //rename SynonymRelationshipType to SynonymType in DefinedTermBase.titleCache
395 stepName = "Rename SynonymRelationshipType to SynonymType in DefinedTermBase.titleCache";
396 updateSql = "UPDATE DefinedTermBase SET titleCache='SynonymType' WHERE titleCache='SynonymRelationshipType'";
397 nonAuditedTableName = "DefinedTermBase";
398 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, nonAuditedTableName, -99);
399 stepList.add(step);
400
401 //rename SynonymRelationshipType to SynonymType in Representation labels
402 stepName = "Rename SynonymRelationshipType to SynonymType in Representation labels";
403 updateSql = "UPDATE Representation SET label='Synonym Type' WHERE label='Synonym Relationship Type'";
404 nonAuditedTableName = "Representation";
405 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, nonAuditedTableName, -99);
406 stepList.add(step);
407
408 //rename SynonymRelationshipType to SynonymType in Representation text
409 stepName = "Rename SynonymRelationshipType to SynonymType in Representation text";
410 updateSql = "UPDATE Representation SET text='Synonym Type' WHERE text='Synonym Relationship Type'";
411 nonAuditedTableName = "Representation";
412 step = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, updateSql, nonAuditedTableName, -99);
413 stepList.add(step);
414
415 //remove SynonymRelationship_Annotation
416 stepName = "Remove SynonymRelationship_Annotation table";
417 tableName = "SynonymRelationship_Annotation";
418 step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
419 stepList.add(step);
420
421 //remove SynonymRelationship_Marker
422 stepName = "Remove SynonymRelationship_Marker table";
423 tableName = "SynonymRelationship_Marker";
424 step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
425 stepList.add(step);
426
427 //remove SynonymRelationship table
428 stepName = "Remove synonym relationship table";
429 tableName = "SynonymRelationship";
430 step = TableDroper.NewInstance(stepName, tableName, INCLUDE_AUDIT);
431 stepList.add(step);
432 }
433
434 /**
435 * @param stepList
436 */
437 private void updatePresenceAbsenceTermSymbols(List<ISchemaUpdaterStep> stepList) {
438 String enDash = UTF8.EN_DASH.toString();
439
440 //endemic
441 updateSinglePATsymbol(stepList, "c3ee7048-15b7-4be1-b687-9ce9c1a669d6", "e", "" + UTF8.BLACK_CIRCLE);
442 //present
443 updateSinglePATsymbol(stepList, "cef81d25-501c-48d8-bbea-542ec50de2c2", "p", "");
444 //doubtfully present
445 updateSinglePATsymbol(stepList, "75a60279-a4c2-4f53-bc57-466028a4b3db", "pd", "?");
446 //native
447 updateSinglePATsymbol(stepList, "ddeac4f2-d8fa-43b8-ad7e-ca13abdd32c7", "n", "");
448 //native: doubtfully native
449 updateSinglePATsymbol(stepList, "310373bf-7df4-4d02-8cb3-bcc7448805fc", "nd", "d");
450 //introduced: naturalized
451 updateSinglePATsymbol(stepList, "e191e89a-a751-4b0c-b883-7f1de70915c9", "in", "n");
452 //introduced: adventitious (casual)
453 updateSinglePATsymbol(stepList, "42946bd6-9c22-45ad-a910-7427e8f60bfd", "ia", "a");
454 //naturalised
455 updateSinglePATsymbol(stepList, "4e04990a-66fe-4fdf-856c-f40772fbcf0a", "na", "n");
456 //native: presence questionable
457 updateSinglePATsymbol(stepList, "925662c1-bb10-459a-8c53-da5a738ac770", "nq", "?");
458 //introduced: presence questionable
459 updateSinglePATsymbol(stepList, "83eb0aa0-1a45-495a-a3ca-bf6958b74366", "iq", "?");
460 //introduced: cultivated
461 updateSinglePATsymbol(stepList, "fac8c347-8262-44a1-b0a4-db4de451c021", "ic", "c");
462 //cultivated, presence questionable
463 updateSinglePATsymbol(stepList, "4f31bfc8-3058-4d83-aea5-3a1fe9773f9f", "cq", "?c");
464 //absent
465 updateSinglePATsymbol(stepList, "59709861-f7d9-41f9-bb21-92559cedd598", "a", enDash);
466 //reported in error
467 updateSinglePATsymbol(stepList, "38604788-cf05-4607-b155-86db456f7680", "f", enDash);
468 //native: reported in error
469 updateSinglePATsymbol(stepList, "aeec2947-2700-4623-8e32-9e3a430569d1", "if", enDash);
470 //cultivated: reported in error
471 updateSinglePATsymbol(stepList, "9d4d3431-177a-4abe-8e4b-1558573169d6", "cf", enDash);
472
473 }
474
475 /**
476 * @param uuid the uuid
477 * @param oldSymbol
478 * @param newSybol
479 */
480 private void updateSinglePATsymbol(List<ISchemaUpdaterStep> stepList,
481 String uuid, String oldSymbol, String newSymbol) {
482 String stepName = "Update single symbol for PresenceAbsenceTerm " + uuid;
483 String query = "UPDATE @@DefinedTermBase@@ dtb "
484 + " SET symbol = '" + newSymbol + "'"
485 + " WHERE uuid = '" + uuid + "' AND symbol = '" + oldSymbol + "'" ;
486 SimpleSchemaUpdaterStep simpleStep = SimpleSchemaUpdaterStep.NewAuditedInstance(stepName, query, "DefinedTermBase", -99);
487 stepList.add(simpleStep);
488 }
489
490 @Override
491 public ISchemaUpdater getNextUpdater() {
492 return SchemaUpdater_41_47.NewInstance();
493 }
494
495 @Override
496 public ISchemaUpdater getPreviousUpdater() {
497 return SchemaUpdater_36_40.NewInstance();
498 }
499
500 }