package org.epics.archiverappliance.retrieval.postprocessors; import java.io.IOException; import java.sql.Timestamp; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.epics.archiverappliance.EventStream; import org.epics.archiverappliance.common.TimeSpan; import org.epics.archiverappliance.common.TimeUtils; import org.epics.archiverappliance.config.PVTypeInfo; /** * Returns raw data for the previous two weeks and uses FirstSamplePP for the rest. * @author mshankar * */ public class TwoWeekRaw implements PostProcessor, TimeSpanDependentProcessing { public static final String TWOWEEK_IDENTITY = "twoweek"; private FirstSamplePP sparsifiedData = new FirstSamplePP(); private DefaultRawPostProcessor rawData = new DefaultRawPostProcessor(); private static Logger logger = Logger.getLogger(TwoWeekRaw.class.getName()); private String pvName; @Override public void initialize(String userarg, String pvName) throws IOException { logger.debug("Initializing TwoWeekRaw for " + pvName); this.pvName = pvName; sparsifiedData.initialize(null, pvName); rawData.initialize(null, pvName); } @Override public List<TimeSpanDependentProcessor> generateTimeSpanDependentProcessors(List<TimeSpan> timeSpans) { long twoWeeksAgo = TimeUtils.convertToEpochSeconds(TimeUtils.now()) - 2*7*24*60*60; LinkedList<TimeSpanDependentProcessor> ret = new LinkedList<TimeSpanDependentProcessor>(); for(TimeSpan timeSpan : timeSpans) { long startSeconds = TimeUtils.convertToEpochSeconds(timeSpan.getStartTime()); long endSeconds = TimeUtils.convertToEpochSeconds(timeSpan.getEndTime()); if(endSeconds <= twoWeeksAgo) { // Everything is sparsified logger.debug("Returning all sparsified data for pv " + pvName); ret.add(new TimeSpanDependentProcessor(timeSpan, sparsifiedData)); } else if(startSeconds < twoWeeksAgo) { Timestamp twoWeeksAgoTs = TimeUtils.convertFromEpochSeconds(twoWeeksAgo, 0); logger.debug("Returning sparsified+raw data for pv " + pvName + " breaking at " + TimeUtils.convertToHumanReadableString(twoWeeksAgoTs)); ret.add(new TimeSpanDependentProcessor(new TimeSpan(timeSpan.getStartTime(), twoWeeksAgoTs), sparsifiedData)); ret.add(new TimeSpanDependentProcessor(new TimeSpan(twoWeeksAgoTs, timeSpan.getEndTime()), rawData)); } else { logger.debug("Returning all raw data for pv " + pvName); ret.add(new TimeSpanDependentProcessor(timeSpan, rawData)); } } return ret; } @Override public long estimateMemoryConsumption(String pvName, PVTypeInfo typeInfo, Timestamp start, Timestamp end, HttpServletRequest req) { long twoWeeksAgo = TimeUtils.convertToEpochSeconds(TimeUtils.now()) - 2*7*24*60*60; long startSeconds = TimeUtils.convertToEpochSeconds(start); long endSeconds = TimeUtils.convertToEpochSeconds(end); if(endSeconds <= twoWeeksAgo) { // Everything is sparsified return sparsifiedData.estimateMemoryConsumption(pvName, typeInfo, start, end, req); } else if(startSeconds < twoWeeksAgo) { Timestamp twoWeeksAgoTs = TimeUtils.convertFromEpochSeconds(twoWeeksAgo, 0); return sparsifiedData.estimateMemoryConsumption(pvName, typeInfo, start, twoWeeksAgoTs, req) + rawData.estimateMemoryConsumption(pvName, typeInfo, twoWeeksAgoTs, end, req); } else { return rawData.estimateMemoryConsumption(pvName, typeInfo, start, end, req); } } @Override public Callable<EventStream> wrap(Callable<EventStream> callable) { return callable; } @Override public String getIdentity() { return TWOWEEK_IDENTITY; } @Override public String getExtension() { return TWOWEEK_IDENTITY; } }