122 lines
3.8 KiB
Java
122 lines
3.8 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) {
|
|
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) {
|
|
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) {
|
|
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) {
|
|
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 ");
|
|
}
|
|
|
|
return toReturn.substring(0, toReturn.lastIndexOf("AND"));
|
|
|
|
}
|
|
|
|
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(",")-1);
|
|
}
|
|
|
|
@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());
|
|
}
|
|
|
|
|
|
return String.format("SELECT %1$s FROM %2$s WHERE %3%s",
|
|
selectedFields, tablename, getConditionString());
|
|
|
|
}
|
|
}
|