package nl.ipo.cds.etl.generalization; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import nl.ipo.cds.etl.generalization.beans.Column; import nl.ipo.cds.etl.generalization.beans.Filter; import nl.ipo.cds.etl.generalization.beans.Generalization; import nl.ipo.cds.etl.generalization.beans.Generalize; import nl.ipo.cds.etl.generalization.beans.Grid; import nl.ipo.cds.etl.generalization.beans.Join; import nl.ipo.cds.etl.generalization.beans.Source; import org.springframework.core.io.Resource; public class GeneralizerConfig { private Generalization config; public void setConfigResource(Resource configResource) throws JAXBException, IOException { JAXBContext jaxbContext = JAXBContext.newInstance(Generalization.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); config = (Generalization)unmarshaller.unmarshal(configResource.getInputStream()); } private String createQuery(Generalize generalize) { Grid grid = config.getGrid(); Source source = generalize.getSource(); StringBuilder queryBuilder = new StringBuilder("select st_asbinary("); queryBuilder.append(source.getColumn()); queryBuilder.append(") geometry, "); queryBuilder.append("cast(st_x(st_centroid("); queryBuilder.append(source.getColumn()); queryBuilder.append(")) / "); queryBuilder.append(grid.getWidth()); queryBuilder.append(" as integer) x, "); queryBuilder.append("cast(st_y(st_centroid("); queryBuilder.append(source.getColumn()); queryBuilder.append(")) / "); queryBuilder.append(grid.getHeight()); queryBuilder.append(" as integer) y"); Join join = source.getJoin(); if(join != null) { queryBuilder.append(", jt."); queryBuilder.append(join.getColumn()); } queryBuilder.append(" from "); queryBuilder.append(source.getTable()); queryBuilder.append(" bt "); if(join != null) { queryBuilder.append(" join "); queryBuilder.append(join.getTable()); queryBuilder.append(" jt on jt."); queryBuilder.append(join.getKey()); queryBuilder.append(" = bt."); queryBuilder.append(source.getKey()); } queryBuilder.append(" where "); queryBuilder.append(source.getColumn()); queryBuilder.append(" is not null "); Filter filter = source.getFilter(); if(filter != null) { queryBuilder.append(" and "); queryBuilder.append(source.getKey()); queryBuilder.append(" in ("); queryBuilder.append("select "); queryBuilder.append(filter.getKey()); queryBuilder.append(" from "); queryBuilder.append(filter.getTable()); Column[] columns = filter.getColumns(); if(columns != null && columns.length > 0) { String separator = " where "; for(Column column : columns) { queryBuilder.append(separator); queryBuilder.append(column.getName()); queryBuilder.append(" = '"); queryBuilder.append(column.getValue()); queryBuilder.append("'"); separator = " and "; } } queryBuilder.append(")"); } queryBuilder.append(" order by "); if(join != null) { queryBuilder.append("jt."); queryBuilder.append(join.getColumn()); queryBuilder.append(", "); } queryBuilder.append("cast(st_x(st_centroid("); queryBuilder.append(source.getColumn()); queryBuilder.append(")) / "); queryBuilder.append(grid.getWidth()); queryBuilder.append(" as integer), "); queryBuilder.append("cast(st_y(st_centroid("); queryBuilder.append(source.getColumn()); queryBuilder.append(")) / "); queryBuilder.append(grid.getHeight()); queryBuilder.append(" as integer)"); return queryBuilder.toString(); } public Iterable<GeneralizeJob> getGeneralizeJobs() { final List<Generalize> generalizeList = Arrays.asList(config.getGeneralize()); return new Iterable<GeneralizeJob>() { @Override public Iterator<GeneralizeJob> iterator() { return new Iterator<GeneralizeJob>() { private Iterator<Generalize> generalizeIterator = generalizeList.iterator(); @Override public boolean hasNext() { return generalizeIterator.hasNext(); } @Override public GeneralizeJob next() { final Generalize generalize = generalizeIterator.next(); return new GeneralizeJob() { @Override public String getQuery() { return createQuery(generalize); } @Override public String getDestination() { return generalize.getDestination(); } }; } @Override public void remove() { generalizeIterator.remove(); } }; } }; } }