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.io.pesi.erms;
|
11
|
|
12
|
import java.sql.ResultSet;
|
13
|
import java.sql.SQLException;
|
14
|
import java.util.HashMap;
|
15
|
import java.util.HashSet;
|
16
|
import java.util.Map;
|
17
|
import java.util.Set;
|
18
|
|
19
|
import org.apache.log4j.Logger;
|
20
|
import org.springframework.stereotype.Component;
|
21
|
|
22
|
import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;
|
23
|
import eu.etaxonomy.cdm.io.common.mapping.DbImportNameTypeDesignationMapper;
|
24
|
import eu.etaxonomy.cdm.io.common.mapping.DbImportSynonymMapper;
|
25
|
import eu.etaxonomy.cdm.io.common.mapping.DbImportTaxIncludedInMapper;
|
26
|
import eu.etaxonomy.cdm.io.common.mapping.ICheckIgnoreMapper;
|
27
|
import eu.etaxonomy.cdm.io.common.mapping.IDbImportMapper;
|
28
|
import eu.etaxonomy.cdm.model.common.CdmBase;
|
29
|
import eu.etaxonomy.cdm.model.name.TaxonName;
|
30
|
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
|
31
|
|
32
|
/**
|
33
|
* @author a.mueller
|
34
|
* @since 09.03.2010
|
35
|
*/
|
36
|
@Component
|
37
|
public class ErmsTaxonRelationImport extends ErmsImportBase<TaxonBase<?>> implements ICheckIgnoreMapper{
|
38
|
|
39
|
private static final long serialVersionUID = 4092728796922591257L;
|
40
|
|
41
|
@SuppressWarnings("unused")
|
42
|
private static final Logger logger = Logger.getLogger(ErmsTaxonRelationImport.class);
|
43
|
|
44
|
private DbImportMapping<ErmsImportState, ErmsImportConfigurator> mapping;
|
45
|
|
46
|
private static final String pluralString = "taxon relations";
|
47
|
private static final String dbTableName = "tu";
|
48
|
|
49
|
private static final Class<?> cdmTargetClass = TaxonBase.class;
|
50
|
|
51
|
@Override
|
52
|
protected int divideCountBy() { return 5;} //use only 1000 records
|
53
|
|
54
|
public ErmsTaxonRelationImport(){
|
55
|
super(pluralString, dbTableName, cdmTargetClass);
|
56
|
}
|
57
|
|
58
|
@Override
|
59
|
protected DbImportMapping<ErmsImportState, ErmsImportConfigurator> getMapping() {
|
60
|
if (mapping == null){
|
61
|
mapping = new DbImportMapping<>();
|
62
|
//incldued in
|
63
|
DbImportTaxIncludedInMapper<?> includedIn
|
64
|
= DbImportTaxIncludedInMapper.NewInstance("id", TAXON_NAMESPACE, "accId", TAXON_NAMESPACE,
|
65
|
"parentAccId", TAXON_NAMESPACE, null);
|
66
|
mapping.addMapper(includedIn);//there is only one tree
|
67
|
//synonym
|
68
|
mapping.addMapper(DbImportSynonymMapper.NewInstance("id", "tu_accfinal", TAXON_NAMESPACE,
|
69
|
"tu_unacceptreason", null, null, true));
|
70
|
//type designations
|
71
|
mapping.addMapper(DbImportNameTypeDesignationMapper.NewInstance("id", "tu_typetaxon", ErmsImportBase.NAME_NAMESPACE, "tu_typedesignationstatus"));
|
72
|
}
|
73
|
return mapping;
|
74
|
}
|
75
|
|
76
|
@Override
|
77
|
protected String getIdQuery(){
|
78
|
String result = " SELECT id FROM " + getTableName() +
|
79
|
" ORDER BY tu_sp";
|
80
|
return result;
|
81
|
}
|
82
|
|
83
|
@Override
|
84
|
protected String getRecordQuery(ErmsImportConfigurator config) {
|
85
|
//TODO get automatic by second path mappers
|
86
|
String selectAttributes =
|
87
|
" myTaxon.id, myTaxon.tu_parent, myTaxon.tu_typetaxon, myTaxon.tu_typedesignation, "
|
88
|
+ " myTaxon.tu_accfinal, myTaxon.tu_status, myTaxon.tu_unacceptreason, "
|
89
|
+ " parent.tu_status AS parentStatus, parent.id AS parentId, "
|
90
|
+ " parentAcc.id AS parentAccId,"
|
91
|
+ " accTaxon.tu_parent accParentId, "
|
92
|
+ " CASE WHEN myTaxon.id = parentAcc.id THEN parent.id ELSE ISNULL(parentAcc.id, parent.id) END as accId ";
|
93
|
String strRecordQuery =
|
94
|
" SELECT " + selectAttributes
|
95
|
+ " FROM tu AS myTaxon "
|
96
|
+ " LEFT JOIN tu AS accTaxon ON myTaxon.tu_accfinal = accTaxon.id "
|
97
|
+ " LEFT JOIN tu AS parent ON myTaxon.tu_parent = parent.id "
|
98
|
+ " LEFT JOIN tu AS parentAcc ON parentAcc.id = parent.tu_accfinal "
|
99
|
+ " WHERE ( myTaxon.id IN (" + ID_LIST_TOKEN + ") )";
|
100
|
return strRecordQuery;
|
101
|
}
|
102
|
|
103
|
@Override
|
104
|
protected void doInvoke(ErmsImportState state) {
|
105
|
super.doInvoke(state);
|
106
|
}
|
107
|
|
108
|
@Override
|
109
|
public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, ErmsImportState state) {
|
110
|
|
111
|
String nameSpace;
|
112
|
Set<String> idSet;
|
113
|
Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
|
114
|
|
115
|
try{
|
116
|
Set<String> taxonIdSet = new HashSet<>();
|
117
|
Set<String> nameIdSet = new HashSet<>();
|
118
|
while (rs.next()){
|
119
|
handleForeignKey(rs, taxonIdSet, "accId");
|
120
|
handleForeignKey(rs, taxonIdSet, "tu_accfinal");
|
121
|
handleForeignKey(rs, taxonIdSet, "id");
|
122
|
handleForeignKey(rs, nameIdSet, "tu_typetaxon");
|
123
|
handleForeignKey(rs, nameIdSet, "id");
|
124
|
}
|
125
|
|
126
|
//name map
|
127
|
nameSpace = ErmsImportBase.NAME_NAMESPACE;
|
128
|
idSet = nameIdSet;
|
129
|
Map<String, TaxonName> nameMap = getCommonService().getSourcedObjectsByIdInSourceC(TaxonName.class, idSet, nameSpace);
|
130
|
result.put(nameSpace, nameMap);
|
131
|
|
132
|
//taxon map
|
133
|
nameSpace = ErmsImportBase.TAXON_NAMESPACE;
|
134
|
idSet = taxonIdSet;
|
135
|
@SuppressWarnings("rawtypes")
|
136
|
Map<String, TaxonBase> taxonMap = getCommonService().getSourcedObjectsByIdInSourceC(TaxonBase.class, idSet, nameSpace);
|
137
|
result.put(nameSpace, taxonMap);
|
138
|
|
139
|
return result;
|
140
|
|
141
|
} catch (SQLException e) {
|
142
|
throw new RuntimeException(e);
|
143
|
}
|
144
|
}
|
145
|
|
146
|
@Override
|
147
|
public boolean checkIgnoreMapper(@SuppressWarnings("rawtypes") IDbImportMapper mapper, ResultSet rs) throws SQLException{
|
148
|
|
149
|
boolean result = false;
|
150
|
boolean isAccepted = isAccepted(rs);
|
151
|
|
152
|
if (mapper instanceof DbImportTaxIncludedInMapper){
|
153
|
//here we should add the direct parent or the accepted taxon of the parent
|
154
|
return !isAccepted;
|
155
|
}else if (mapper instanceof DbImportSynonymMapper){
|
156
|
//the only exact rule in ERMS is that the accepted taxon (tu_accfinal)
|
157
|
// of a synonym (def: id <> tu_accfinal) never again has another
|
158
|
// accepted taxon.
|
159
|
//So the synonym relation is clearly defined, no matter which status
|
160
|
//both related taxa have.
|
161
|
//TODO: check if data were only adapted by BGBM this way
|
162
|
return isAccepted;
|
163
|
}else if (mapper instanceof DbImportNameTypeDesignationMapper){
|
164
|
Object tu_typeTaxon = rs.getObject("tu_typetaxon");
|
165
|
if (tu_typeTaxon == null){
|
166
|
return true;
|
167
|
}
|
168
|
}
|
169
|
return result;
|
170
|
}
|
171
|
|
172
|
private boolean isAccepted(ResultSet rs) throws SQLException {
|
173
|
int id = rs.getInt("id");
|
174
|
Object accTaxonId = rs.getObject("tu_accfinal");
|
175
|
Object accParentId = rs.getObject("accParentId");
|
176
|
|
177
|
boolean isAccepted = false;
|
178
|
if(accTaxonId == null){
|
179
|
isAccepted = true; //if accTaxonId == null we can only assume this taxon is accepted as we have no other accepted taxon, though in most cases the status is not accepted
|
180
|
}else if (id == (int)accTaxonId){
|
181
|
isAccepted = true;
|
182
|
}else if (accParentId != null && id == (int)accParentId){
|
183
|
//see also ErmsTaxonImport.getAcceptedTaxaKeys, there with accepted taxon (alternate representation) being there own child. These should be fully accepted as other wise the link to the higher taxon (genus) is not given
|
184
|
isAccepted = true;
|
185
|
}
|
186
|
return isAccepted;
|
187
|
}
|
188
|
|
189
|
@Override
|
190
|
protected boolean doCheck(ErmsImportState state){
|
191
|
// IOValidator<ErmsImportState> validator = new ErmsTaxonImportValidator();
|
192
|
// return validator.validate(state);
|
193
|
return true;
|
194
|
}
|
195
|
|
196
|
@Override
|
197
|
protected boolean isIgnore(ErmsImportState state){
|
198
|
return ! state.getConfig().isDoRelTaxa();
|
199
|
}
|
200
|
}
|