1
package org.hisp.gtool.action;
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.sql.Statement;
7
import java.util.ArrayList;
8
import java.util.Iterator;
11
public class DataMartAction {
13
Connection con = (new DBConnection()).openConnection();
16
* Returns the Period Ids for the periods between startdate and enddate
18
public List getPeriodIDsList(String startDate,String endDate)
24
String query = "SELECT id FROM period " +
25
"WHERE startdate BETWEEN '"+startDate+"' AND '"+endDate+"'";
27
String query = "SELECT periodid FROM period " +
28
"WHERE startdate BETWEEN '"+startDate+"' AND '"+endDate+"'";
30
List periodIDsList = new ArrayList();
33
st = con.createStatement();
34
rs = st.executeQuery(query);
37
periodIDsList.add(new Integer(rs.getInt(1)));
40
catch(Exception e) { return null; }
45
if(rs!=null) rs.close();
46
if(st!=null) st.close();
48
catch(Exception e){return null;}
51
}// getPeriodIDsList end
55
* Returns the Indicator Ids
57
public List getIndicatorIDsList(String ide_type,String[] indicatorNamesList)
60
//Statement st = null;
61
PreparedStatement ps = null;
66
if(ide_type.equals("indicatorsRadio"))
69
query = "SELECT id FROM indicator "+
72
query = "SELECT indicatorid FROM indicator "+
78
query = "SELECT id FROM dataelement " +
79
"WHERE shortname LIKE ?";
81
query = "SELECT dataelementid FROM dataelement " +
82
"WHERE alternativeName LIKE ?";
85
List indicatorIDsList = new ArrayList();
88
//st = con.createStatement();
89
ps = con.prepareStatement(query);
91
System.out.println(indicatorNamesList.length);
93
while(count1 < indicatorNamesList.length)
95
//rs = st.executeQuery(query);
97
ps.setString(1,indicatorNamesList[count1]);
98
rs = ps.executeQuery();
99
if(rs.next()) indicatorIDsList.add(new Integer(rs.getInt(1)));
100
else indicatorIDsList.add(new Integer(0));
104
catch(Exception e) { return null; }
109
if(rs!=null) rs.close();
110
//if(st!=null) st.close();
111
if(ps!=null) ps.close();
113
catch(Exception e){return null;}
114
}// finally block end
115
return indicatorIDsList;
116
}// getIndicatorIDsList end
120
* Returns the level number of selected orgunit
122
public int getOrgUnitLevel(int orgUnitID)
127
int orgUnitLevel = 0;
129
String query = "SELECT level FROM organisationunitstructure " +
130
"WHERE organisationUnitId = "+orgUnitID;
132
String query = "SELECT level FROM orgunitstructure " +
133
"WHERE organisationunitid = "+orgUnitID;
136
st = con.createStatement();
137
rs = st.executeQuery(query);
138
if(rs.next()) { orgUnitLevel = rs.getInt(1); }
140
catch(Exception e) { return 0; }
145
if(rs!=null) rs.close();
146
if(st!=null) st.close();
148
catch(Exception e){return 0;}
149
}// finally block end
151
} // getOrgUnitLevel end
155
* Returns the Maximum level number of selected orgunit
157
public int getMaxOrgUnitLevel()
162
int maxOrgUnitLevel = 0;
164
//String query = "SELECT MAX(level) FROM organisationunitstructure";
165
String query = "SELECT MAX(level) FROM orgunitstructure";
169
st = con.createStatement();
170
rs = st.executeQuery(query);
171
if(rs.next()) { maxOrgUnitLevel = rs.getInt(1); }
173
catch(Exception e) { return 0; }
178
if(rs!=null) rs.close();
179
if(st!=null) st.close();
181
catch(Exception e){return 0;}
182
}// finally block end
183
return maxOrgUnitLevel;
184
} // getMaxOrgUnitLevel end
189
* Returns the maximum id in the aggregatedindicatorvalue OR aggregateddatavalue table
191
public int getMaxIDofAggIndValue(String ide_type)
196
int maXAggIndValueID = 0;
198
if(ide_type.equals("indicatorsRadio"))
200
query = "SELECT MAX(id) FROM aggregatedindicatorvalue";
204
query = "SELECT MAX(id) FROM aggregateddatavalue";
209
st = con.createStatement();
210
rs = st.executeQuery(query);
211
if(rs.next()) { maXAggIndValueID = rs.getInt(1); }
213
catch(Exception e) { return 0; }
218
if(rs!=null) rs.close();
219
if(st!=null) st.close();
221
catch(Exception e){ return 0;}
222
}// finally block end
223
return maXAggIndValueID;
224
} // getMaxIDofAggIndValue end
228
* This returns the list of organisationunit ids as an array list
229
* which are at input level
231
public List getOUListForLevel(int selOULevel)
236
List li = new ArrayList();
238
String query = "SELECT organisationUnitId FROM organisationunitstructure " +
239
"WHERE level = "+selOULevel;
242
String query = "SELECT organisationunitid FROM orgunitstructure " +
243
"WHERE level = "+selOULevel;
247
st = con.createStatement();
248
rs = st.executeQuery(query);
251
li.add(new Integer(rs.getInt(1)));
254
catch(Exception e) { return null; }
259
if(rs!=null) rs.close();
260
if(st!=null) st.close();
262
catch(Exception e){ return null;}
263
}// finally block end
265
} // getOUListForLevel end
268
public int aggregateIndicatorValues(
273
String[] indNamesList)
276
int selOULevel = getOrgUnitLevel(selOUID);
277
int maxOULevel = getMaxOrgUnitLevel();
278
//int aggIndValueID = getMaxIDofAggIndValue(ide_type) + 1;
279
int periodTypeID = 1;
281
List ouList = (ArrayList) getOUListForLevel(selOULevel);
282
List periodIDsList = (ArrayList) getPeriodIDsList(startDate, endDate);
283
List indicatorIDsList = (ArrayList) getIndicatorIDsList(ide_type,indNamesList);
285
PreparedStatement ps1 = null;
286
PreparedStatement ps2 = null;
287
PreparedStatement ps3 = null;
289
ResultSet rs1 = null;
290
ResultSet rs2 = null;
292
if(ouList == null) {System.out.println("oulist is empty");}
293
if(periodIDsList == null) {System.out.println("periodlist is empty");}
294
if(indicatorIDsList == null) {System.out.println("indlist is empty");}
296
int totRecordCount = 0;
301
if(ide_type.equals("indicatorsRadio"))
304
query = "SELECT id FROM aggregatedindicatorvalue " +
305
"WHERE indicatorId = ? AND " +
307
"organisationUnitId = ?";
309
query = "SELECT value FROM aggregatedindicatorvalue " +
310
"WHERE indicatorid = ? AND " +
312
"organisationunitid = ?";
318
query = "SELECT id FROM aggregateddatavalue " +
319
"WHERE dataElementId = ? AND " +
321
"organisationUnitId = ?";
323
query = "SELECT value FROM aggregateddatavalue " +
324
"WHERE dataelementid = ? AND " +
326
"organisationunitid = ?";
328
ps1 = con.prepareStatement(query);
331
if(ide_type.equals("indicatorsRadio"))
334
query = "SELECT sum(value),count(*) FROM aggregatedindicatorvalue " +
335
"WHERE indicatorId=? AND " +
337
"organisationUnitId IN (SELECT id FROM organisationunit WHERE parent = ?)";
339
query = "SELECT sum(value),count(*) FROM aggregatedindicatorvalue " +
340
"WHERE indicatorid=? AND " +
342
"organisationunitid IN (SELECT organisationunitid FROM organisationunit WHERE parentid = ?)";
346
if(selOULevel == maxOULevel)
349
query = "SELECT SUM(value),count(*) FROM datavalue " +
350
"WHERE dataElement=? AND " +
354
query = "SELECT SUM(value),count(*) FROM datavalue " +
355
"WHERE dataelementid=? AND " +
362
query = "SELECT sum(value),count(*) FROM aggregateddatavalue " +
363
"WHERE dataElementId=? AND " +
365
"organisationUnitId IN (SELECT id FROM organisationunit WHERE parent = ?)";
367
query = "SELECT sum(value),count(*) FROM aggregateddatavalue " +
368
"WHERE dataelementid=? AND " +
370
"organisationunitid IN (SELECT organisationunitid FROM organisationunit WHERE parentid = ?)";
373
ps2 = con.prepareStatement(query);
375
if(ide_type.equals("indicatorsRadio"))
378
query = "INSERT IGNORE INTO aggregatedindicatorvalue " +
379
"(indicatorId,periodId,periodTypeId,organisationUnitId,level,value) " +
380
"values(?,?,?,?,?,?)";
382
query = "INSERT IGNORE INTO aggregatedindicatorvalue " +
383
"(indicatorid,periodid,periodtypeid,organisationunitid,level,value) " +
384
"VALUES(?,?,?,?,?,?)";
389
query = "INSERT IGNORE INTO aggregateddatavalue " +
390
"(dataElementId,periodId,periodTypeId,organisationUnitId,level,value) " +
391
"values(?,?,?,?,?,?)";
393
query = "INSERT IGNORE INTO aggregateddatavalue " +
394
"(dataelementid,periodid,periodtypeid,organisationunitid,level,value) " +
395
"VALUES(?,?,?,?,?,?)";
397
ps3 = con.prepareStatement(query);
400
Iterator itForOUList = ouList.iterator();
401
while(itForOUList.hasNext())
403
int ouId = ((Integer)itForOUList.next()).intValue();
404
Iterator itForIndList = indicatorIDsList.iterator();
405
while(itForIndList.hasNext())
407
int indId = ((Integer)itForIndList.next()).intValue();
408
Iterator itForPeriodList = periodIDsList.iterator();
409
while(itForPeriodList.hasNext())
411
int periodId = ((Integer)itForPeriodList.next()).intValue();
414
ps1.setInt(2,periodId);
416
rs1 = ps1.executeQuery();
421
ps2.setInt(2,periodId);
423
rs2 = ps2.executeQuery();
426
double aggIndValue = rs2.getDouble(1);
427
int childCount = rs2.getInt(2);
428
if(childCount != 0 && ide_type.equals("indicatorsRadio")) aggIndValue /= childCount;
431
System.out.println(indId+" "+periodId+" "+periodTypeID+" "+ouId+" "+selOULevel+" "+aggIndValue);
434
ps3.setInt(2,periodId);
435
ps3.setInt(3,periodTypeID);
437
ps3.setInt(5,selOULevel);
438
ps3.setDouble(6,aggIndValue);
447
}// Perios List While loop end
448
}// Indcator Names List while loop end
449
}// ouList while loop end
451
catch(Exception e) { System.out.println(e.getMessage()); return -1;}
456
if(ps1 != null) ps1.close();
457
if(ps2 != null) ps2.close();
458
if(ps3 != null) ps3.close();
460
if(rs1 != null) rs1.close();
461
if(rs2 != null) rs2.close();
463
catch(Exception e){ System.out.println(e.getMessage()); return -1;}
466
return totRecordCount;
467
}// aggregateIndicatorValues end
471
* setters and getters