127 lines
4.2 KiB
Java
127 lines
4.2 KiB
Java
package org.gcube.application.perform.service.engine.impl;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Map.Entry;
|
|
|
|
import org.gcube.application.perform.service.engine.model.CSVExportRequest;
|
|
import org.gcube.application.perform.service.engine.model.DBField;
|
|
|
|
public class ExportCSVQuery extends Query {
|
|
|
|
private Map<String,Map<String,String>> mappings=new HashMap<>();
|
|
|
|
private String fieldList;
|
|
private String tablename;
|
|
|
|
private CSVExportRequest theRequest;
|
|
private SchemaDefinition schema;
|
|
|
|
private Map<String,DBField> actualStructure;
|
|
|
|
public ExportCSVQuery(String query, DBField[] fields, CSVExportRequest theRequest, SchemaDefinition schema, Map<String,DBField> actualStructure) {
|
|
super(query, fields);
|
|
this.theRequest=theRequest;
|
|
this.schema=schema;
|
|
this.actualStructure=actualStructure;
|
|
}
|
|
|
|
|
|
public void setMapping(String field, Map<String,String> mapping) {
|
|
mappings.put(field, mapping);
|
|
}
|
|
|
|
|
|
private String getConditionString() {
|
|
|
|
ArrayList<String> orGroups=new ArrayList<String>();
|
|
|
|
|
|
// AREA
|
|
if(theRequest.getAreas().size()>0 && schema.getAreaField()!=null && actualStructure.containsKey(schema.getAreaField())) {
|
|
String areaField=actualStructure.get(schema.getAreaField()).getFieldName();
|
|
StringBuilder areas=new StringBuilder();
|
|
for(String area:theRequest.getAreas()) {
|
|
areas.append(String.format("%1$s= '%2$s' OR", areaField,area));
|
|
}
|
|
orGroups.add(areas.substring(0,areas.lastIndexOf("OR")));
|
|
}
|
|
|
|
// QUARTER
|
|
if(theRequest.getQuarters().size()>0 && schema.getQuarterField()!=null && actualStructure.containsKey(schema.getQuarterField())) {
|
|
String quarterField=actualStructure.get(schema.getQuarterField()).getFieldName();
|
|
StringBuilder quarterString=new StringBuilder();
|
|
for(String q:theRequest.getQuarters()) {
|
|
quarterString.append(String.format("%1$s= '%2$s' OR", quarterField,q));
|
|
}
|
|
orGroups.add(quarterString.substring(0,quarterString.lastIndexOf("OR")));
|
|
}
|
|
|
|
// SPECIES ID
|
|
if(theRequest.getSpeciesIds().size()>0 && schema.getSpeciesField()!=null && actualStructure.containsKey(schema.getSpeciesField())) {
|
|
String speciesField=actualStructure.get(schema.getSpeciesField()).getFieldName();
|
|
StringBuilder speciesString=new StringBuilder();
|
|
for(String s:theRequest.getSpeciesIds()) {
|
|
speciesString.append(String.format("%1$s= '%2$s' OR", speciesField,s));
|
|
}
|
|
orGroups.add(speciesString.substring(0,speciesString.lastIndexOf("OR")));
|
|
}
|
|
|
|
// PERIOD
|
|
if(theRequest.getPeriods().size()>0 && schema.getPeriodField()!=null && actualStructure.containsKey(schema.getPeriodField())) {
|
|
String periodField=actualStructure.get(schema.getPeriodField()).getFieldName();
|
|
StringBuilder periodString=new StringBuilder();
|
|
for(String p:theRequest.getPeriods()) {
|
|
periodString.append(String.format("%1$s= '%2$s' OR", periodField,p));
|
|
}
|
|
orGroups.add(periodString.substring(0,periodString.lastIndexOf("OR")));
|
|
}
|
|
|
|
StringBuilder toReturn=new StringBuilder("");
|
|
for(String orGroup:orGroups) {
|
|
toReturn.append(orGroup+ " AND ");
|
|
}
|
|
|
|
if(toReturn.length()>0)
|
|
return toReturn.substring(0, toReturn.lastIndexOf("AND"));
|
|
else return toReturn.toString();
|
|
|
|
}
|
|
|
|
public void setTablename(String tablename) {
|
|
this.tablename = tablename;
|
|
}
|
|
|
|
public void setFieldList(Collection<DBField> fields) {
|
|
StringBuilder b=new StringBuilder();
|
|
for(DBField f:fields)
|
|
b.append(f.getFieldName()+",");
|
|
fieldList=b.toString().substring(0,b.lastIndexOf(","));
|
|
}
|
|
|
|
@Override
|
|
public String getQuery() {
|
|
|
|
String selectedFields=fieldList;
|
|
|
|
for(Entry<String,Map<String,String>> mapping:mappings.entrySet()) {
|
|
StringBuilder caseBuilder=new StringBuilder("CASE "+mapping.getKey());
|
|
for(Entry<String,String> condition: mapping.getValue().entrySet())
|
|
caseBuilder.append(String.format("WHEN '%1$s' THEN '%2$s'", condition.getKey(),condition.getValue()));
|
|
caseBuilder.append("END AS "+mapping.getKey()+",");
|
|
|
|
selectedFields.replaceAll(mapping.getKey(), caseBuilder.toString());
|
|
}
|
|
|
|
String conditionString =getConditionString();
|
|
if(conditionString.length()>0) conditionString= "WHERE "+conditionString;
|
|
|
|
|
|
return String.format("SELECT %1$s FROM %2$s %3$s",
|
|
selectedFields, tablename, conditionString);
|
|
|
|
}
|
|
}
|