193 lines
8.1 KiB
Java
193 lines
8.1 KiB
Java
package org.gcube.dataanalysis.precipitations;
|
|
|
|
import java.text.ParseException;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.Calendar;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
|
|
import org.gcube.contentmanagement.lexicalmatcher.utils.AnalysisLogger;
|
|
import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.ColumnTypesList;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.DatabaseType;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.InputTable;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.OutputTable;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.ServiceType;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.StatisticalType;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.ServiceParameters;
|
|
import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.TableTemplates;
|
|
import org.gcube.dataanalysis.ecoengine.interfaces.StandardLocalExternalAlgorithm;
|
|
import org.gcube.dataanalysis.ecoengine.utils.DatabaseFactory;
|
|
import org.gcube.dataanalysis.ecoengine.utils.DatabaseUtils;
|
|
import org.hibernate.SessionFactory;
|
|
|
|
public class AnnualPrecipitation extends StandardLocalExternalAlgorithm {
|
|
// Class Attributes
|
|
String outputtablename;
|
|
String outputtable;
|
|
|
|
@Override
|
|
public String getDescription() {
|
|
return "This is a simple algorithm that returns the annual precipitation. The input is a general tabular resource with two columns (date and precipitation).";
|
|
}
|
|
|
|
@Override
|
|
public void init() throws Exception {
|
|
AnalysisLogger.getLogger().debug("Initialization");
|
|
}
|
|
|
|
@Override
|
|
protected void process() throws Exception {
|
|
// Recovering data
|
|
config.setParam("DatabaseDriver", "org.postgresql.Driver");
|
|
SessionFactory dbconnection = DatabaseUtils.initDBSession(config);
|
|
try {
|
|
String tablename = getInputParameter("PrecTable");
|
|
String columnnames = getInputParameter("PrecColumns");
|
|
outputtablename = getInputParameter("OutputTableName");
|
|
outputtable = getInputParameter("OutputTable");
|
|
String[] columnlist = columnnames.split(AlgorithmConfiguration.getListSeparator());
|
|
List<Object> dataList = DatabaseFactory.executeSQLQuery("select " + columnlist[0] + " from " + tablename + " order by " + columnlist[0] + " asc", dbconnection);
|
|
List<Object> precList = DatabaseFactory.executeSQLQuery("select " + columnlist[1] + " from " + tablename + " order by " + columnlist[0] + " asc", dbconnection);
|
|
// Business Logic
|
|
AnalysisLogger.getLogger().info("Creating output table [" + "create table " + outputtable + " (year integer, value real)]");
|
|
DatabaseFactory.executeSQLUpdate("create table " + outputtable + " (year integer, value real)", dbconnection);
|
|
Double averageValue = new Double(0);
|
|
for (int i = 0; i < dataList.size(); i++) { // for each line
|
|
if (i == 0) { // first iteration
|
|
averageValue = averageValue + Double.parseDouble(String.valueOf(precList.get(i)));
|
|
if (dataList.size() == 1) { // if first iteration is also
|
|
// the last
|
|
Date currentDate = anyStringToDate(String.valueOf(dataList.get(i)));
|
|
AnalysisLogger.getLogger().info("i=0 Current Date: "+currentDate);
|
|
Calendar currentDateCal = Calendar.getInstance();
|
|
currentDateCal.setTime(currentDate);
|
|
int yearCurrentDate = currentDateCal.get(Calendar.YEAR);
|
|
AnalysisLogger.getLogger().info("Inserting into table " + "insert into " + outputtable + " (year,value) values (" + yearCurrentDate + "," + averageValue + ")");
|
|
DatabaseFactory.executeSQLUpdate("insert into " + outputtable + " (year,value) values (" + yearCurrentDate + "," + averageValue + ")", dbconnection);
|
|
averageValue = new Double(0);
|
|
}
|
|
}
|
|
if (i > 0) { // other iterations
|
|
Date currentDate = anyStringToDate(String.valueOf(dataList.get(i)));
|
|
Date lastDate = anyStringToDate(String.valueOf(dataList.get(i - 1)));
|
|
AnalysisLogger.getLogger().info("Current Date: "+currentDate);
|
|
AnalysisLogger.getLogger().info("Last Date: "+lastDate);
|
|
Calendar currentDateCal = Calendar.getInstance();
|
|
currentDateCal.setTime(currentDate);
|
|
int yearCurrentDate = currentDateCal.get(Calendar.YEAR);
|
|
Calendar lastDateCal = Calendar.getInstance();
|
|
lastDateCal.setTime(lastDate);
|
|
int yearLastDate = lastDateCal.get(Calendar.YEAR);
|
|
if (yearCurrentDate > yearLastDate) {
|
|
// inserting average annual
|
|
AnalysisLogger.getLogger().info("Inserting into table " + "insert into " + outputtable + " (year,value) values (" + yearLastDate + "," + averageValue + ")");
|
|
DatabaseFactory.executeSQLUpdate("insert into " + outputtable + " (year,value) values (" + yearLastDate + "," + averageValue + ")", dbconnection);
|
|
averageValue = new Double(0);
|
|
averageValue = new Double(String.valueOf(precList.get(i)));
|
|
} else {
|
|
averageValue = averageValue + Double.parseDouble(String.valueOf(precList.get(i)));
|
|
}
|
|
}
|
|
if (i != 0 && i == dataList.size() - 1) { // last iteration
|
|
Date currentDate = anyStringToDate(String.valueOf(dataList.get(i)));
|
|
Calendar currentDateCal = Calendar.getInstance();
|
|
currentDateCal.setTime(currentDate);
|
|
int yearCurrentDate = currentDateCal.get(Calendar.YEAR);
|
|
AnalysisLogger.getLogger().info("Inserting into table " + "insert into " + outputtable + " (year,value) values (" + yearCurrentDate + "," + averageValue + ")");
|
|
DatabaseFactory.executeSQLUpdate("insert into " + outputtable + " (year,value) values (" + yearCurrentDate + "," + averageValue + ")", dbconnection);
|
|
averageValue = new Double(0);
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
AnalysisLogger.getLogger().error(e.getMessage());
|
|
throw e;
|
|
} finally {
|
|
DatabaseUtils.closeDBConnection(dbconnection);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void setInputParameters() {
|
|
// First parameter: Internal tabular resource
|
|
List<TableTemplates> templates = new ArrayList<TableTemplates>();
|
|
templates.add(TableTemplates.GENERIC);
|
|
InputTable tinput = new InputTable(templates, "PrecTable", "Precipitation tabular resource");
|
|
ColumnTypesList columns = new ColumnTypesList("PrecTable", "PrecColumns", "Selected columns for date and precipitation", false);
|
|
inputs.add(tinput);
|
|
inputs.add(columns);
|
|
// Second parameter: Output table
|
|
ServiceType randomstring = new ServiceType(ServiceParameters.RANDOMSTRING, "OutputTable", "", "prec");
|
|
inputs.add(randomstring);
|
|
DatabaseType.addDefaultDBPars(inputs);
|
|
// Third parameter: Output table name
|
|
addStringInput("OutputTableName", "The name of the output table", "prec_");
|
|
}
|
|
|
|
@Override
|
|
public StatisticalType getOutput() {
|
|
List<TableTemplates> outtemplate = new ArrayList<TableTemplates>();
|
|
outtemplate.add(TableTemplates.GENERIC);
|
|
OutputTable out = new OutputTable(outtemplate, outputtablename, outputtable, "The output table containing all the matches");
|
|
return out;
|
|
}
|
|
|
|
@Override
|
|
public void shutdown() {
|
|
AnalysisLogger.getLogger().debug("Shutdown");
|
|
}
|
|
|
|
/**
|
|
* An auxiliary method that converts string to date
|
|
*
|
|
* @param value
|
|
* @return
|
|
*/
|
|
public static Date anyStringToDate(String value) {
|
|
Date date = null;
|
|
try {
|
|
if (isValidFormat("yyyy-mm-dd", value)) {
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
|
|
date = sdf.parse(value);
|
|
}
|
|
if (isValidFormat("yyyymmdd", value)) {
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd");
|
|
date = sdf.parse(value);
|
|
}
|
|
if (isValidFormat("dd/mm/yyyy", value)) {
|
|
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
|
|
date = sdf.parse(value);
|
|
}
|
|
if (isValidFormat("dd-mm-yyyy", value)) {
|
|
SimpleDateFormat sdf = new SimpleDateFormat("dd-mm-yyyy");
|
|
date = sdf.parse(value);
|
|
}
|
|
} catch (Exception e) {
|
|
date = null;
|
|
}
|
|
return date;
|
|
}
|
|
|
|
/**
|
|
* An auxiliary method that validates if a string respect a specified date format
|
|
*
|
|
* @param format
|
|
* @param value
|
|
* @return
|
|
*/
|
|
public static boolean isValidFormat(String format, String value) {
|
|
Date date = null;
|
|
try {
|
|
SimpleDateFormat sdf = new SimpleDateFormat(format);
|
|
date = sdf.parse(value);
|
|
if (!value.equals(sdf.format(date))) {
|
|
date = null;
|
|
}
|
|
} catch (ParseException ex) {
|
|
date = null;
|
|
}
|
|
return date != null;
|
|
}
|
|
}
|