~mortenoh/+junk/dhis2-detailed-import-export

« back to all changes in this revision

Viewing changes to dhis-2/dhis-services/dhis-service-jdbc/src/main/java/org/hisp/dhis/jdbc/statementbuilder/H2StatementBuilder.java

  • Committer: larshelge at gmail
  • Date: 2009-03-03 16:46:36 UTC
  • Revision ID: larshelge@gmail.com-20090303164636-2sjlrquo7ib1gf7r
Initial check-in

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.hisp.dhis.jdbc.statementbuilder;
 
2
 
 
3
/*
 
4
 * Copyright (c) 2004-2007, University of Oslo
 
5
 * All rights reserved.
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions are met:
 
9
 * * Redistributions of source code must retain the above copyright notice, this
 
10
 *   list of conditions and the following disclaimer.
 
11
 * * Redistributions in binary form must reproduce the above copyright notice,
 
12
 *   this list of conditions and the following disclaimer in the documentation
 
13
 *   and/or other materials provided with the distribution.
 
14
 * * Neither the name of the HISP project nor the names of its contributors may
 
15
 *   be used to endorse or promote products derived from this software without
 
16
 *   specific prior written permission.
 
17
 *
 
18
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 
19
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 
20
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
21
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 
22
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 
23
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
24
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 
25
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 
27
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
28
 */
 
29
 
 
30
import java.util.Iterator;
 
31
import java.util.Map;
 
32
import java.util.Map.Entry;
 
33
 
 
34
import org.hisp.dhis.period.Period;
 
35
import org.hisp.dhis.period.RelativePeriodType;
 
36
 
 
37
/**
 
38
 * @author Lars Helge Overland
 
39
 * @version $Id: H2StatementBuilder.java 5715 2008-09-17 14:05:28Z larshelg $
 
40
 */
 
41
public class H2StatementBuilder
 
42
    extends AbstractStatementBuilder
 
43
{
 
44
    // -------------------------------------------------------------------------
 
45
    // Constructor
 
46
    // -------------------------------------------------------------------------
 
47
 
 
48
    public H2StatementBuilder()
 
49
    {
 
50
        super();
 
51
    }    
 
52
 
 
53
    // -------------------------------------------------------------------------
 
54
    // AbstractStatementBuilder implementation
 
55
    // -------------------------------------------------------------------------
 
56
 
 
57
    public String getInsertStatementOpening( String table )
 
58
    {
 
59
        StringBuffer buffer = new StringBuffer();
 
60
        
 
61
        buffer.append( "INSERT INTO " + table + " (" );
 
62
        
 
63
        for ( String column : columns )
 
64
        {
 
65
            buffer.append( column + SEPARATOR );
 
66
        }
 
67
        
 
68
        if ( columns.size() > 0 )
 
69
        {
 
70
            buffer.deleteCharAt( buffer.length() - 1 );
 
71
        }
 
72
        
 
73
        buffer.append( BRACKET_END + " VALUES " );
 
74
        
 
75
        columns.clear();
 
76
        
 
77
        return buffer.toString();
 
78
    }
 
79
    
 
80
    public String getNoColumnInsertStatementOpening( String table )
 
81
    {
 
82
        String sql = "INSERT INTO " + table + " VALUES ";
 
83
        
 
84
        return sql;
 
85
    }
 
86
    
 
87
    public String getInsertStatementValues()
 
88
    {
 
89
        StringBuffer buffer = new StringBuffer();
 
90
        
 
91
        buffer.append( BRACKET_START );
 
92
        
 
93
        for ( String value : values )
 
94
        {
 
95
            buffer.append( value + SEPARATOR );
 
96
        }
 
97
        
 
98
        if ( values.size() > 0 )
 
99
        {
 
100
            buffer.deleteCharAt( buffer.length() - 1 );
 
101
        }
 
102
        
 
103
        buffer.append( BRACKET_END + SEPARATOR );
 
104
        
 
105
        values.clear();
 
106
        
 
107
        return buffer.toString();
 
108
    }
 
109
    
 
110
    public String getUpdateStatement( String table )
 
111
    {
 
112
        StringBuffer buffer = new StringBuffer();
 
113
        
 
114
        buffer.append( "UPDATE " + table + " SET " );
 
115
 
 
116
        Iterator<String> columnIterator = columns.iterator();
 
117
        Iterator<String> valueIterator = values.iterator();
 
118
        
 
119
        while ( columnIterator.hasNext() )
 
120
        {
 
121
            buffer.append( columnIterator.next() + "=" + valueIterator.next() + SEPARATOR );
 
122
        }
 
123
        
 
124
        if ( columns.size() > 0 && values.size() > 0 )
 
125
        {
 
126
            buffer.deleteCharAt( buffer.length() - 1 );
 
127
        }
 
128
        
 
129
        buffer.append( " WHERE " + identifierColumnName + "=" + identifierColumnValue );
 
130
        
 
131
        columns.clear();
 
132
        values.clear();
 
133
        
 
134
        return buffer.toString();
 
135
    }
 
136
    
 
137
    public String getValueStatement( String table, String returnField, String compareField, String value )
 
138
    {
 
139
        String sql = "SELECT " + returnField + " FROM " + table + " WHERE " + compareField + " = '" + sqlEncode( value ) + "'";
 
140
        
 
141
        return sql;
 
142
    }
 
143
    
 
144
    public String getValueStatement( String table, String returnField1, String returnField2, String compareField1, String value1, String compareField2, String value2 )
 
145
    {
 
146
        String sql = "SELECT " + returnField1 + ", " + returnField2 + " FROM " + table + " WHERE " + compareField1 + "='" + sqlEncode( value1 ) + "' AND " + compareField2 + "='" + value2 + "'";
 
147
        
 
148
        return sql;
 
149
    }
 
150
    
 
151
    public String getValueStatement( String table, String returnField, Map<String, String> fieldMap, boolean union )
 
152
    {
 
153
        String operator = union ? " AND " : " OR ";
 
154
        
 
155
        StringBuffer sqlBuffer = new StringBuffer();
 
156
        sqlBuffer.append( "SELECT " ).append( returnField ).append( " FROM " ).append( table ).append( " WHERE " );
 
157
        
 
158
        for ( Entry<String, String> entry : fieldMap.entrySet() )
 
159
        {
 
160
            sqlBuffer.append( entry.getKey() ).append( "='" ).append( sqlEncode( entry.getValue() ) ).append( "'" ).append( operator );
 
161
        }
 
162
 
 
163
        String sql = sqlBuffer.toString();
 
164
        
 
165
        sql = sql.substring( 0, sql.length() - operator.length() );
 
166
        
 
167
        return sql;
 
168
    }
 
169
 
 
170
    public String getDoubleColumnType()
 
171
    {
 
172
        String type = "DOUBLE";
 
173
        
 
174
        return type;
 
175
    }
 
176
    
 
177
    public String getPeriodIdentifierStatement( Period period )
 
178
    {
 
179
        String sql =
 
180
            "SELECT periodid FROM period WHERE periodtypeid=" + period.getPeriodType().getId() + " " + 
 
181
            "AND startdate='" + getDateString( period.getStartDate() ) + "' " +
 
182
            "AND enddate='" + getDateString( period.getEndDate() ) + "'";
 
183
        
 
184
        return sql;
 
185
    }
 
186
    
 
187
    public String getCreateAggregatedDataValueTable()
 
188
    {
 
189
        String sql = 
 
190
            "CREATE TABLE aggregateddatavalue ( " +
 
191
            "dataelementid INTEGER, " +
 
192
            "categoryoptioncomboid INTEGER, " +
 
193
            "periodid INTEGER, " +
 
194
            "organisationunitid INTEGER, " +
 
195
            "periodtypeid INTEGER, " +
 
196
            "level INTEGER, " +
 
197
            "value DOUBLE );";
 
198
        
 
199
        return sql;
 
200
    }
 
201
    
 
202
    public String getCreateAggregatedIndicatorTable()
 
203
    {
 
204
        String sql = 
 
205
            "CREATE TABLE aggregatedindicatorvalue ( " +
 
206
            "indicatorid INTEGER, " +
 
207
            "periodid INTEGER, " +
 
208
            "organisationunitid INTEGER, " +
 
209
            "periodtypeid INTEGER, " +
 
210
            "level INTEGER, " +
 
211
            "annualized VARCHAR( 10 ), " +
 
212
            "factor DOUBLE, " +
 
213
            "value DOUBLE, " +
 
214
            "numeratorvalue DOUBLE, " +
 
215
            "denominatorvalue DOUBLE );";
 
216
        
 
217
        return sql;
 
218
    }
 
219
 
 
220
    public String getCreateDataSetCompletenessTable()
 
221
    {
 
222
        String sql = "CREATE TABLE aggregateddatasetcompleteness ( " +
 
223
            "datasetid INTEGER, " +
 
224
            "periodid INTEGER, " +
 
225
            "periodname VARCHAR( 30 ), " +
 
226
            "organisationunitid INTEGER, " +
 
227
            "reporttableid INTEGER, " +
 
228
            "sources INTEGER, " +
 
229
            "registrations INTEGER, " +
 
230
            "registrationsOnTime INTEGER, " +
 
231
            "value DOUBLE, " +
 
232
            "valueOnTime DOUBLE );";
 
233
        
 
234
        return sql;
 
235
    }
 
236
    
 
237
    public String getCreateDataValueIndex()
 
238
    {
 
239
        String sql =
 
240
            "CREATE INDEX crosstab " +
 
241
            "ON datavalue ( periodid, sourceid );";
 
242
        
 
243
        return sql;
 
244
    }
 
245
 
 
246
    public String getDeleteRelativePeriods()
 
247
    {
 
248
        String sql =
 
249
            "DELETE FROM period " +
 
250
            "USING periodtype " +
 
251
            "WHERE period.periodtypeid = periodtype.periodtypeid " +
 
252
            "AND periodtype.name = '" + RelativePeriodType.NAME + "';";
 
253
        
 
254
        return sql;
 
255
    }
 
256
 
 
257
    public String getDeleteZeroDataValues()
 
258
    {
 
259
        String sql = 
 
260
            "DELETE FROM datavalue " +
 
261
            "USING dataelement " +
 
262
            "WHERE datavalue.dataelementid = dataelement.dataelementid " +
 
263
            "AND dataelement.aggregationtype = 'sum' " +
 
264
            "AND datavalue.value IN ( '0', '0.', '.0', '0.0', ' 0', '0 ', '0 0' )";
 
265
        
 
266
        return sql;
 
267
    }
 
268
}