Project

General

Profile

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

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.ArrayList;
15
import java.util.List;
16

    
17
import org.apache.log4j.Logger;
18

    
19
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
20
import eu.etaxonomy.cdm.database.ICdmDataSource;
21

    
22
/**
23
 * Removes a given term if it is not in use.
24
 * TODO does not yet check all DefinedTermBase_XXX tables except for representations.
25
 * Does also not handle AUD tables
26
 * 
27
 * @author a.mueller
28
 * @date 06.09.2013
29
 *
30
 */
31
public class SingleTermRemover extends SchemaUpdaterStepBase<SingleTermRemover> implements ITermUpdaterStep{
32
	@SuppressWarnings("unused")
33
	private static final Logger logger = Logger.getLogger(SingleTermRemover.class);
34
	
35
	public static final SingleTermRemover NewInstance(String stepName, String uuidTerm, List<String> checkUsedQueries, int adapt){
36
		return new SingleTermRemover(stepName, uuidTerm, checkUsedQueries);	
37
	}
38
	
39
	/**
40
	 * @param firstCheckUsedQuery The first query to check if this term is used. Must return a single int value > 0 
41
	 * if this term is used at the given place.
42
	 * @return
43
	 */
44
	public static final SingleTermRemover NewInstance(String stepName, String uuidTerm, String firstCheckUsedQuery, int adapt){
45
		List<String> checkUsedQueries = new ArrayList<String>();
46
		checkUsedQueries.add(firstCheckUsedQuery);
47
		return new SingleTermRemover(stepName, uuidTerm, checkUsedQueries);	
48
	}
49
	
50
	
51
	private String uuidTerm ;
52
	private List<String> checkUsedQueries = new ArrayList<String>();
53
	
54

    
55
	private SingleTermRemover(String stepName, String uuidTerm, List<String> checkUsedQueries) {
56
		super(stepName);
57
		this.uuidTerm = uuidTerm;
58
		this.checkUsedQueries = checkUsedQueries; 
59
	}
60

    
61
	@Override
62
	public Integer invoke(ICdmDataSource datasource, IProgressMonitor monitor, CaseType caseType) throws SQLException{
63
 		//get term id
64
		String sql = " SELECT id FROM %s WHERE uuid = '%s'";
65
		Integer id = (Integer)datasource.getSingleValue(String.format(sql, 
66
				caseType.transformTo("DefinedTermBase"), this.uuidTerm));
67
		if (id == null || id == 0){
68
			return 0;
69
		}
70
		
71
		//check if in use
72
		if (checkTermInUse(datasource, monitor, id, caseType)){
73
			return 0;
74
		}
75
		
76
		//if not ... remove
77
		removeTerm(datasource, monitor, id, caseType);
78
		
79
		return 0;
80
	}
81

    
82
	private void removeTerm(ICdmDataSource datasource, IProgressMonitor monitor, int id, CaseType caseType) throws SQLException {
83
		
84
		//get representation ids
85
		List<Integer> repIDs = new ArrayList<Integer>();
86
		getRepIds(datasource, id, repIDs, "representations_id", "DefinedTermBase_Representation", caseType );
87
		getRepIds(datasource, id, repIDs, "inverserepresentations_id", "RelationshipTermBase_inverseRepresentation", caseType);
88
		
89
		//remove MN table
90
		String sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";
91
		sql = String.format(sql, caseType.transformTo("DefinedTermBase_Representation"), id);
92
		datasource.executeUpdate(sql);
93
		sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";
94
		sql = String.format(sql, caseType.transformTo("RelationshipTermBase_inverseRepresentation"), id);
95
		datasource.executeUpdate(sql);
96
		
97
		//remove representations
98
		for (Integer repId : repIDs){
99
			sql = " DELETE FROM %s WHERE id = %d ";
100
			sql = String.format(sql, 
101
					caseType.transformTo("Representation"), 
102
					repId);
103
			datasource.executeUpdate(sql);
104
		}
105
		
106
		//remove term
107
		sql = " DELETE FROM %s WHERE id = %d";
108
		sql = String.format(sql, 
109
				caseType.transformTo("DefinedTermBase"), 
110
				id);
111
		datasource.executeUpdate(sql);
112
	}
113

    
114
	private void getRepIds(ICdmDataSource datasource, int id,
115
			List<Integer> repIDs, String mnRepresentationIdAttr, String mnTableName, CaseType caseType) throws SQLException {
116
		String sql = " SELECT DISTINCT %s as repId FROM %s WHERE DefinedTermBase_id = %d";
117
		sql = String.format(sql, mnRepresentationIdAttr, caseType.transformTo(mnTableName), id);
118
		ResultSet rs = datasource.executeQuery(sql);
119
		while (rs.next()){
120
			Integer repId = rs.getInt("repId");  //TODO nullSafe, but should not happen
121
			if (repId != null){  
122
				repIDs.add(repId);
123
			}
124
		}
125
	}
126

    
127
	private boolean checkTermInUse(ICdmDataSource datasource, IProgressMonitor monitor, int id, CaseType caseType) throws SQLException {
128
		for (String query : checkUsedQueries){
129
			query = String.format(caseType.replaceTableNames(query), id);
130
			Number i = (Number)datasource.getSingleValue(query);
131
			if (i != null && (Long)i > 0.0){
132
				return true;
133
			}
134
		}
135
		return false;
136
	}
137

    
138
	public SingleTermRemover addCheckUsedQuery(String query, int adapt){
139
		this.checkUsedQueries.add(query);
140
		return this;
141
	}
142
	
143

    
144

    
145
}
(22-22/34)