Project

General

Profile

Download (5.97 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.List;
14

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

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

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

    
27
    public static final String ID = "id";
28
    public static final String UUID_ID = "uuid";
29

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

    
48
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
49
    }
50

    
51
    public static QueryDelegate generateTaxonDistributionQuery(List<String> termList, int classificationID) throws SQLException {
52
        String FROM_QUERY =
53
        		" FROM TaxonNode tn " +
54
        		"INNER JOIN TaxonBase tb on tn.taxon_id = tb.id " +
55
        		"INNER JOIN Classification cl ON tn.classification_id = cl.id " +
56
        		"LEFT OUTER JOIN TaxonNameBase tnb ON tnb.id=tb.id " +
57
        		"LEFT OUTER JOIN DescriptionBase db ON db.taxon_id=tb.id " +
58
        		"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 " +
59
        		"LEFT OUTER JOIN DefinedTermBase dtb on deb.status_id=dtb.id " +
60
        		"LEFT OUTER JOIN DefinedTermBase dtb1 on deb.area_id=dtb1.id " +
61
        		"LEFT OUTER JOIN DefinedTermBase dtb2 on tnb.rank_id = dtb2.id " +
62
        		"WHERE tn.classification_id = "+ classificationID +" AND tb.DTYPE = 'Taxon'" ;
63

    
64
        String GROUP_BY = " GROUP BY tb.id ";
65

    
66
        String SELECT_QUERY=
67
        		"SELECT tb.DTYPE," +
68
        		"tb.id, " +
69
        		"tn.classification_id, " +
70
        		"tb.titleCache AS Taxon, " +
71
        		"dtb2.titleCache AS Rank, " +
72
        		"deb.DTYPE," +
73
        		"deb.id, " +
74
        		"deb.area_id, "+
75
        		"dtb.vocabulary_id, " +
76
        		"dtb1.vocabulary_id, ";
77
        int count = termList.size();
78
        for(String term : termList){
79
        	if(count == 1){
80
        		SELECT_QUERY= SELECT_QUERY +
81
            			"MAX( IF(dtb1.titleCache = '"+ term +"', dtb.titleCache, NULL) ) as '"+ term +"' " ;
82
        	}else{
83
        		SELECT_QUERY= SELECT_QUERY +
84
        				"MAX( IF(dtb1.titleCache = '"+ term +"', dtb.titleCache, NULL) ) as '"+ term +"'," ;
85
        	}
86
        	count--;
87
        }
88
        SELECT_QUERY= SELECT_QUERY + FROM_QUERY + GROUP_BY;
89
        String COUNT_QUERY = "SELECT count(DISTINCT tb.id)" + FROM_QUERY;
90
        String CONTAINS_QUERY = "SELECT * FROM TaxonNode tn WHERE tn.id = ?";
91

    
92
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
93
    }
94

    
95
    public static QueryDelegate generateSynonymofTaxonQuery(String name_id) throws SQLException {
96
    	String FROM_QUERY = " FROM TaxonBase tb " +
97
    			"INNER JOIN TaxonNameBase tnb on tb.name_id=tnb.id " +
98
    			"INNER JOIN SynonymRelationship sr on tb.id=sr.relatedfrom_id ";
99
    	String SELECT_QUERY="SELECT tb.id as " + ID +
100
    			", tnb.titleCache as " + name_id +
101
    			FROM_QUERY;
102
    	String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
103
    	String CONTAINS_QUERY = "SELECT * FROM SynonymRelationship sr WHERE sr.relatedfrom_id = ?";
104

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

    
108
    public static QueryDelegate generateTaxonRelatedToQuery() throws SQLException {
109
        String FROM_QUERY = " FROM TaxonRelationship tr inner join TaxonBase tb on tr.relatedto_id = tb.id";
110
        String SELECT_QUERY= "SELECT tr.id, tr.uuid, tb.titleCache" + FROM_QUERY;
111
        String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
112
        String CONTAINS_QUERY = "SELECT * FROM TaxonRelationship tr where tr.relatedfrom_id = ?";
113

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

    
117
    /**
118
     * Creates a FreeformQuery which mimics a TableQuery.
119
     * This method works around the bug at http://dev.vaadin.com/ticket/12370
120
     *
121
     * @param tableName
122
     * @return
123
     * @throws SQLException
124
     */
125
    public static QueryDelegate generateTableQuery(String tableName) throws SQLException {
126
        String FROM_QUERY = " FROM " + tableName;
127
        String SELECT_QUERY=" SELECT * " +
128
                FROM_QUERY;
129
        String COUNT_QUERY = "SELECT count(*) " + FROM_QUERY;
130
        String CONTAINS_QUERY = "SELECT * FROM " + tableName + "  WHERE id = ?";
131

    
132
        return generateQueryDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
133
    }
134

    
135
    public static QueryDelegate generateQueryDelegate(String SELECT_QUERY, String COUNT_QUERY, String CONTAINS_QUERY) throws SQLException {
136
        FreeformQuery query = new FreeformQuery("This query is not used", CdmSpringContextHelper.getCurrent().getConnectionPool(), ID);
137
        CdmStatementDelegate delegate = new CdmStatementDelegate(SELECT_QUERY, COUNT_QUERY, CONTAINS_QUERY);
138
        query.setDelegate(delegate);
139
        return query;
140
    }
141

    
142
}
(1-1/7)