private boolean filterIntervals(Grib2Record gr, FeatureCollectionConfig.GribIntvFilter intvFilter) { // hack a whack - filter out records with unknown time units int timeUnit = gr.getPDS().getTimeUnit(); if (Grib2Utils.getCalendarPeriod(timeUnit) == null) { logger.info("Skip record with unknown time Unit= {}", timeUnit); return true; } int[] intv = cust.getForecastTimeIntervalOffset(gr); if (intv == null) return false; // not an interval int haveLength = intv[1] - intv[0]; // discard zero length intervals (default) if (haveLength == 0 && (intvFilter == null || intvFilter.isZeroExcluded())) return true; // HACK if (intvFilter != null && intvFilter.hasFilter()) { int discipline = gr.getIs().getDiscipline(); Grib2Pds pds = gr.getPDS(); int category = pds.getParameterCategory(); int number = pds.getParameterNumber(); int id = (discipline << 16) + (category << 8) + number; int prob = Integer.MIN_VALUE; if (pds.isProbability()) { Grib2Pds.PdsProbability pdsProb = (Grib2Pds.PdsProbability) pds; prob = (int) (1000 * pdsProb.getProbabilityUpperLimit()); } // true means discard return intvFilter.filter(id, intv[0], intv[1], prob); } return false; }
private boolean filterIntervals(Grib1Record gr, FeatureCollectionConfig.GribIntvFilter intvFilter) { Grib1SectionProductDefinition pdss = gr.getPDSsection(); Grib1ParamTime ptime = gr.getParamTime(cust); if (!ptime.isInterval()) return false; int[] intv = ptime.getInterval(); if (intv == null) return false; int haveLength = intv[1] - intv[0]; // keep zero length intervals unless configured otherwise if (haveLength == 0 && intvFilter != null && intvFilter.isZeroExcluded()) return true; if (intvFilter != null && intvFilter.hasFilter()) { int center = pdss.getCenter(); int subcenter = pdss.getSubCenter(); int version = pdss.getTableVersion(); int param = pdss.getParameterNumber(); int id = (center << 8) + (subcenter << 16) + (version << 24) + param; return intvFilter.filter(id, intv[0], intv[1], Integer.MIN_VALUE); } return false; }
public boolean filterOk(int id, int hasLength, int prob) { if (filter == null) return true; if (hasLength == 0 && isZeroExcluded()) return false; for (GribIntvFilterParam param : filter) { boolean needProb = (param.prob != Integer.MIN_VALUE); // filter uses prob boolean hasProb = (prob != Integer.MIN_VALUE); // record has prob boolean isMine = !needProb || hasProb && (param.prob == prob); if (param.id == id && isMine) { // first match in the filter list is used if (param.intvLength != hasLength) return false; // remove the ones whose intervals dont match } } return true; }
public boolean filter(int id, int intvStart, int intvEnd, int prob) { int intvLength = intvEnd - intvStart; if (intvLength == 0 && isZeroExcluded()) return true; for (IntvFilter filter : filterList) { if (filter.filter(id, intvStart, intvEnd, prob)) return true; } return false; }