Project

General

Profile

Download (6.8 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
    public static final String ID = "id";
29
    public static final String UUID_ID = "uuid";
30

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

    
51
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
52
    }
53

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

    
76
        String GROUP_BY = " GROUP BY tb.id ";
77

    
78
        String SELECT_QUERY=
79
        		"SELECT tb.DTYPE," +
80
        		"tb.id, " +
81
        		"tb.uuid, " +
82
        		"tn.classification_id, " +
83
        		"tb.titleCache AS Taxon, " +
84
        		"dtb2.titleCache AS Rank, ";
85

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

    
102
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
103
    }
104

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

    
115
    	return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
116
    }
117

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

    
136
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
137
    }
138

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

    
154
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
155
    }
156

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

    
164
}
(1-1/8)