package com.github.windbender.core; import java.util.HashSet; import java.util.Map.Entry; import java.util.Set; import org.joda.time.DateTime; import org.joda.time.Interval; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import com.github.windbender.domain.Project; import com.google.common.base.Joiner; public class Limiter { ReportParams reportParams; Project currentProject; public Limiter(ReportParams reportParams, Project curProject) { this.reportParams = reportParams; this.currentProject = curProject; } public String makeSQL() { String speciesSQL = makeSpeciesSQL(); String timeSQL = makeTimeSQL(); String todSQL = makeTODSQL(); return speciesSQL + timeSQL + todSQL; } private String makeTODSQL() { Set<String> s = new HashSet<String>(); for(Entry<String, Boolean> e: reportParams.getTod().entrySet()) { if(e.getValue()) { s.add(e.getKey()); } } if(s.size() == 4) return ""; String[] sar = s.toArray(new String[0]); String out = Joiner.on("\",\"").join(sar); String sql = " and time_of_day in (\""+out+"\") "; return sql; } DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd"); private String makeTimeSQL() { DateTime en = reportParams.getDateTimeEnd(); DateTime st = reportParams.getDateTimeStart(); String stStr = dtf.print(st); String enStr = dtf.print(en); String s = " and event_start_time > '"+stStr+"' and event_start_time < '"+enStr+"' "; return s; } private String makeSpeciesSQL() { boolean excludeMode = false; if(reportParams.getSpecies().length ==0) { return " and species_id= -77 "; } for(String species: reportParams.getSpecies()) { if("all".equals(species)) excludeMode = true; if(species.startsWith("-")) excludeMode = true; break; } Set<Long> excludeSet = new HashSet<Long>(); Set<Long> includeSet = new HashSet<Long>(); //the next two lines ensure humans never appear in reports includeSet.remove(new Long(700)); excludeSet.add(new Long(700)); StringBuilder s = new StringBuilder(); if(excludeMode) { for(String species: reportParams.getSpecies()) { if("all".equals(species)) { } else { Long id = Long.parseLong(species); excludeSet.add(id); } } for(Long id: excludeSet) { s.append(" and species_id != "+id+" "); } } else { for(String species: reportParams.getSpecies()) { Long id = Long.parseLong(species); includeSet.add(id); } if(includeSet.size() > 0) s.append(" and ( "); boolean first = true; for(Long id: includeSet) { if(!first) s.append(" or "); s.append(" species_id = "+id+" "); first = false; } if(includeSet.size() > 0) s.append(" ) "); } return s.toString(); } public Interval getTimeInterval() { DateTime en = reportParams.getDateTimeEnd(); DateTime st = reportParams.getDateTimeStart(); Interval i = new Interval(st,en); return i; } public Long getProjectId() { return this.currentProject.getId(); } @Override public String toString() { return "Limiter [reportParams=" + reportParams + ", currentProject=" + currentProject + ", dtf=" + dtf + "]"; } }