Project

General

Profile

Download (7.39 KB) Statistics
| Branch: | 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.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
}
(14-14/17)