Project

General

Profile

Download (6.92 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2015 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.vaadin.util;
11

    
12
import java.sql.SQLException;
13
import java.util.Iterator;
14
import java.util.List;
15

    
16
import com.vaadin.data.util.sqlcontainer.query.FreeformQuery;
17
import com.vaadin.data.util.sqlcontainer.query.QueryDelegate;
18

    
19
import eu.etaxonomy.cdm.vaadin.statement.CdmStatementDelegate;
20

    
21
/**
22
 * @author cmathew
23
 * @date 1 Apr 2015
24
 *
25
 */
26
public class CdmQueryFactory {
27

    
28

    
29
	public static final String RANK_COLUMN = "Rank";
30
	public static final String TAXON_COLUMN = "Taxon";
31
	
32
    public static final String ID = "id";
33
    public static final String UUID_ID = "uuid";
34

    
35
    public static QueryDelegate generateTaxonBaseQuery(String name_id,
36
            String pb_id,
37
            String unp_id,
38
            String rank_id,
39
            String has_syn_id) throws SQLException {
40
        String FROM_QUERY = " FROM TaxonBase tb " +
41
                "INNER JOIN TaxonNode tn on tn.taxon_id=tb.id " +
42
                "INNER JOIN TaxonNameBase tnb on tb.name_id=tnb.id " +
43
                "INNER JOIN DefinedTermBase dtb on tnb.rank_id = dtb.id";
44
        String SELECT_QUERY="SELECT tb.id as " + ID +
45
                ", tb.uuid as " + UUID_ID +
46
                ", tnb.titleCache as " + name_id +
47
                ", tb.publish as " + pb_id +
48
                ", tb.unplaced as " + unp_id +
49
                ", dtb.titleCache as " + rank_id +
50
                ", (SELECT COUNT(*) FROM  SynonymRelationship sr WHERE tb.id = sr.relatedto_id) as " + has_syn_id +
51
                FROM_QUERY;
52
        String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
53
        String CONTAINS_QUERY = "SELECT * FROM TaxonBase tb WHERE tb.id = ?";
54

    
55
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
56
    }
57

    
58
    public static QueryDelegate generateTaxonDistributionQuery(List<String> termList, List<Integer> taxonNodeIds) throws SQLException {
59
    	String idString = "";
60
    	Iterator<Integer> nodeIterator = taxonNodeIds.iterator();
61
    	while (nodeIterator.hasNext()) {
62
			Integer integer = (Integer) nodeIterator.next();
63
			idString += String.valueOf(integer);
64
			if(nodeIterator.hasNext()){
65
				idString += ", ";
66
			}
67
		}
68
        String FROM_QUERY =
69
        		" FROM TaxonNode tn " +
70
        		"INNER JOIN TaxonBase tb on tn.taxon_id = tb.id " +
71
        		"INNER JOIN Classification cl ON tn.classification_id = cl.id " +
72
        		"LEFT OUTER JOIN TaxonNameBase tnb ON tnb.id=tb.id " +
73
        		"LEFT OUTER JOIN DescriptionBase db ON db.taxon_id=tb.id " +
74
        		"LEFT OUTER JOIN (SELECT indescription_id, area_id, status_id, DTYPE, id FROM DescriptionElementBase deb WHERE deb.DTYPE LIKE 'Distribution') AS deb ON deb.indescription_id=db.id " +
75
        		"LEFT OUTER JOIN DefinedTermBase dtb on deb.status_id=dtb.id " +
76
        		"LEFT OUTER JOIN DefinedTermBase dtb1 on deb.area_id=dtb1.id " +
77
        		"LEFT OUTER JOIN DefinedTermBase dtb2 on tnb.rank_id = dtb2.id " +
78
        		"WHERE tn.id IN ("+ idString +") AND tb.DTYPE = 'Taxon'" ;
79

    
80
        String ORDER_BY = " ORDER BY tb.titleCache ";
81

    
82
        String SELECT_QUERY=
83
        		"SELECT tb.DTYPE," +
84
        		"tb.id, " +
85
        		"tb.uuid, " +
86
        		"tn.classification_id, " +
87
        		"tb.titleCache AS "+TAXON_COLUMN+", " +
88
        		"dtb2.titleCache AS "+RANK_COLUMN+", ";
89

    
90
        int count = termList.size();
91
        for(String term : termList){
92
        	if(count == 1){
93
        		SELECT_QUERY= SELECT_QUERY +
94
            			"IF(dtb1.titleCache = '"+ term +"', dtb.titleCache, NULL) as '"+ term +"' " ;
95
        	}else{
96
        		SELECT_QUERY= SELECT_QUERY +
97
        				"IF(dtb1.titleCache = '"+ term +"', dtb.titleCache, NULL) as '"+ term +"'," ;
98
        	}
99
        	count--;
100
        }
101
        SELECT_QUERY= SELECT_QUERY + FROM_QUERY + ORDER_BY;
102
        String COUNT_QUERY = "SELECT count(DISTINCT tb.id)" + FROM_QUERY;
103
//        String CONTAINS_QUERY = "SELECT * FROM TaxonNode tn WHERE tn.id = ?";
104
        String CONTAINS_QUERY = "SELECT * FROM TaxonBase tb WHERE tb.uuid = ?";
105

    
106
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
107
    }
108

    
109
    public static QueryDelegate generateSynonymofTaxonQuery(String name_id) throws SQLException {
110
    	String FROM_QUERY = " FROM TaxonBase tb " +
111
    			"INNER JOIN TaxonNameBase tnb on tb.name_id=tnb.id " +
112
    			"INNER JOIN SynonymRelationship sr on tb.id=sr.relatedfrom_id ";
113
    	String SELECT_QUERY="SELECT tb.id as " + ID +
114
    			", tnb.titleCache as " + name_id +
115
    			FROM_QUERY;
116
    	String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
117
    	String CONTAINS_QUERY = "SELECT * FROM SynonymRelationship sr WHERE sr.relatedfrom_id = ?";
118

    
119
    	return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
120
    }
121

    
122
    public static QueryDelegate generateTaxonRelatedToQuery(String reluuid_id,
123
            String reltype_id,
124
            String to_id,
125
            String touuid_id,
126
            String toname_id) throws SQLException {
127
        String FROM_QUERY = "     FROM TaxonRelationship tr " +
128
                "INNER JOIN TaxonBase tb on tr.relatedto_id = tb.id " +
129
                "INNER JOIN TaxonNode tn on tb.id = tn.taxon_id ";
130
        String SELECT_QUERY= "SELECT tr.id as " + ID +
131
                ", tr.uuid as " + reluuid_id +
132
                ", tr.type_id as " + reltype_id +
133
                ", tr.relatedto_id as " + to_id +
134
                ", tb.uuid as " + touuid_id +
135
                ", tb.titleCache as " + toname_id +
136
                FROM_QUERY;
137
        String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
138
        String CONTAINS_QUERY = "SELECT * FROM TaxonRelationship tr where tr.relatedfrom_id = ?";
139

    
140
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
141
    }
142

    
143
    /**
144
     * Creates a FreeformQuery which mimics a TableQuery.
145
     * This method works around the bug at http://dev.vaadin.com/ticket/12370
146
     *
147
     * @param tableName
148
     * @return
149
     * @throws SQLException
150
     */
151
    public static QueryDelegate generateTableQuery(String tableName) throws SQLException {
152
        String FROM_QUERY = " FROM " + tableName;
153
        String SELECT_QUERY=" SELECT * " +
154
                FROM_QUERY;
155
        String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
156
        String CONTAINS_QUERY = "SELECT * FROM " + tableName + "  WHERE id = ?";
157

    
158
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
159
    }
160

    
161
    public static QueryDelegate generateQueryDelegate(String SELECT_QUERY, String COUNT_QUERY, String CONTAINS_QUERY) throws SQLException {
162
        FreeformQuery query = new FreeformQuery("This query is not used", CdmSpringContextHelper.getCurrent().getConnectionPool(), ID);
163
        CdmStatementDelegate delegate = new CdmStatementDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
164
        query.setDelegate(delegate);
165
        return query;
166
    }
167

    
168
}
(1-1/8)