Project

General

Profile

Download (5.33 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 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
package eu.etaxonomy.cdm.database.update;
10

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

    
16
import org.apache.log4j.Logger;
17

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

    
21
/**
22
 * Removes a given term if it is not in use.
23
 * TODO does not yet check all DefinedTermBase_XXX tables except for representations.
24
 * Does also not handle AUD tables
25
 *
26
 * @author a.mueller
27
 * @since 06.09.2013
28
 *
29
 */
30
public class SingleTermRemover
31
        extends SchemaUpdaterStepBase{
32

    
33
    @SuppressWarnings("unused")
34
	private static final Logger logger = Logger.getLogger(SingleTermRemover.class);
35

    
36
	public static final SingleTermRemover NewInstance(String stepName, String uuidTerm, List<String> checkUsedQueries, int adapt){
37
		return new SingleTermRemover(stepName, uuidTerm, checkUsedQueries);
38
	}
39

    
40
	/**
41
	 * @param firstCheckUsedQuery The first query to check if this term is used. Must return a single int value > 0
42
	 * if this term is used at the given place.
43
	 * @return
44
	 */
45
	public static final SingleTermRemover NewInstance(String stepName, String uuidTerm, String firstCheckUsedQuery, int adapt){
46
		List<String> checkUsedQueries = new ArrayList<String>();
47
		checkUsedQueries.add(firstCheckUsedQuery);
48
		return new SingleTermRemover(stepName, uuidTerm, checkUsedQueries);
49
	}
50

    
51

    
52
	private String uuidTerm ;
53
	private List<String> checkUsedQueries = new ArrayList<String>();
54

    
55

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

    
62
    @Override
63
    public void invoke(ICdmDataSource datasource, IProgressMonitor monitor,
64
            CaseType caseType, SchemaUpdateResult result) throws SQLException {
65
        //get term id
66
		String sql = " SELECT id FROM %s WHERE uuid = '%s'";
67
		Integer id = (Integer)datasource.getSingleValue(String.format(sql,
68
				caseType.transformTo("DefinedTermBase"), this.uuidTerm));
69
		if (id == null || id == 0){
70
			return;
71
		}
72

    
73
		//check if in use
74
		if (checkTermInUse(datasource, monitor, id, caseType)){
75
			return;
76
		}
77

    
78
		//if not ... remove
79
		removeTerm(datasource, monitor, id, caseType, result);
80

    
81
		return;
82
	}
83

    
84
	private void removeTerm(ICdmDataSource datasource, IProgressMonitor monitor, int id,
85
	        CaseType caseType, SchemaUpdateResult result) {
86

    
87
		try {
88
            //get representation ids
89
            List<Integer> repIDs = new ArrayList<>();
90
            getRepIds(datasource, id, repIDs, "representations_id", "DefinedTermBase_Representation", caseType );
91
            getRepIds(datasource, id, repIDs, "inverserepresentations_id", "RelationshipTermBase_inverseRepresentation", caseType);
92

    
93
            //remove MN table
94
            String sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";
95
            sql = String.format(sql, caseType.transformTo("DefinedTermBase_Representation"), id);
96
            datasource.executeUpdate(sql);
97
            sql = " DELETE FROM %s WHERE DefinedTermBase_id = %d";
98
            sql = String.format(sql, caseType.transformTo("RelationshipTermBase_inverseRepresentation"), id);
99
            datasource.executeUpdate(sql);
100

    
101
            //remove representations
102
            for (Integer repId : repIDs){
103
            	sql = " DELETE FROM %s WHERE id = %d ";
104
            	sql = String.format(sql,
105
            			caseType.transformTo("Representation"),
106
            			repId);
107
            	datasource.executeUpdate(sql);
108
            }
109

    
110
            //remove term
111
            sql = " DELETE FROM %s WHERE id = %d";
112
            sql = String.format(sql,
113
            		caseType.transformTo("DefinedTermBase"),
114
            		id);
115
            datasource.executeUpdate(sql);
116
        } catch (SQLException e) {
117
            String message = e.getMessage();
118
            monitor.warning(message, e);
119
            result.addException(e, message, this, "removeTerm");
120
        }
121
	}
122

    
123
	private void getRepIds(ICdmDataSource datasource, int id,
124
			List<Integer> repIDs, String mnRepresentationIdAttr, String mnTableName, CaseType caseType) throws SQLException {
125
		String sql = " SELECT DISTINCT %s as repId FROM %s WHERE DefinedTermBase_id = %d";
126
		sql = String.format(sql, mnRepresentationIdAttr, caseType.transformTo(mnTableName), id);
127
		ResultSet rs = datasource.executeQuery(sql);
128
		while (rs.next()){
129
			Integer repId = rs.getInt("repId");  //TODO nullSafe, but should not happen
130
			if (repId != null){
131
				repIDs.add(repId);
132
			}
133
		}
134
	}
135

    
136
	private boolean checkTermInUse(ICdmDataSource datasource, IProgressMonitor monitor, int id, CaseType caseType) throws SQLException {
137
		for (String query : checkUsedQueries){
138
			query = String.format(caseType.replaceTableNames(query), id);
139
			Number i = (Number)datasource.getSingleValue(query);
140
			if (i != null && (Long)i > 0.0){
141
				return true;
142
			}
143
		}
144
		return false;
145
	}
146

    
147
	public SingleTermRemover addCheckUsedQuery(String query, int adapt){
148
		this.checkUsedQueries.add(query);
149
		return this;
150
	}
151

    
152

    
153

    
154
}
(24-24/35)