package quba.service; import com.avaje.ebean.Query; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import quba.models.QubaStation; import quba.models.QubaSubjective; import service.PoseidonPropertyService; import service.PoseidonService; import java.util.ArrayList; import java.util.List; public class QubaWindWarningFetcher { private final static Logger logger = LoggerFactory.getLogger(QubaWindWarningFetcher.class); public boolean fetchWarning(String position_name, DateTime date, Integer termin) { logger.info("fetchWarning: posisjon {}, dato {} og termin {}", position_name,date,termin); List<QubaSubjective> windValues = getWindValues(position_name, date, termin); DateTime startOfWindow = date.withTimeAtStartOfDay().plusHours(termin); int windowsize = PoseidonPropertyService.getIntProperty("quba.strongwind.windowsize"); DateTime endOfWindow = startOfWindow.plusHours(windowsize); return hasStrongWinds(windValues,endOfWindow); } public List<QubaSubjective> getWindValues(String position_name,DateTime date, Integer termin){ List<QubaSubjective> result = new ArrayList<>(); QubaStation station = QubaStation.findStationByName(position_name); if ( station == null) { logger.warn("Fant ikke stasjon med navn {}",position_name); return result; } int windowsize = PoseidonPropertyService.getIntProperty("quba.strongwind.windowsize"); int pindexid = PoseidonPropertyService.getIntProperty("quba.strongwind.pindexid"); int levelid = PoseidonPropertyService.getIntProperty("quba.strongwind.levelid"); DateTime run = date.withTimeAtStartOfDay().plusHours(termin); DateTime limit = run.plusHours(windowsize); Query<QubaSubjective> qubaSubjectiveQuery = QubaSubjective.find.where() .eq("pindexid", pindexid) .eq("levelid", levelid) .eq("stationid", station.stationid) .eq("run", run.toDate()) .le("valid", limit.toDate()) .orderBy("value desc"); List<QubaSubjective> subjectives = qubaSubjectiveQuery.findList(); logger.debug("Kjørte sql {}, pindexid={}, stationid={}, levelid={},run={}, valid={}", qubaSubjectiveQuery.getGeneratedSql(), pindexid,station.stationid,levelid,run,limit); logger.debug("Fant {} subjectives",subjectives.size()); return subjectives; } boolean hasStrongWinds(List<QubaSubjective> subjectives, DateTime endOfWindow){ boolean hasStrongWinds = false; double windLimit = PoseidonPropertyService.getFloatProperty("quba.strongwind.limit"); for (QubaSubjective subjective : subjectives) { DateTime runDate = new DateTime(subjective.pk.runDate, PoseidonService.getTimeZone()); logger.debug("runDate = {}, endOfWindow={},value={}",runDate,endOfWindow,subjective.value); if ( runDate.isBefore(endOfWindow) && subjective.value > windLimit) { hasStrongWinds = true; break; } } logger.debug("hasStrongWinds={}",hasStrongWinds); return hasStrongWinds; } }