perform-service_broken/src/main/java/org/gcube/application/perform/service/engine/impl/ExportCSVQuery.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());
}
}