/** * Build a DecimatingSampleFilter on which you call processSamples() * * @param startTime The start time we're considering values, or null, meaning all time * @param endTime The end time we're considering values, or null, meaning all time * @param outputCount The number of samples to generate * @param sampleCount The number of samples to be scanned. sampleCount must be >= outputCount * @param pollingInterval The polling interval, used to compute sample counts assuming no gaps * @param decimationMode The decimation mode determines how samples will be combined to crate an output point. * @param sampleProcessor The implementor of the TimeRangeSampleProcessor abstract class */ public DecimatingSampleFilter(final DateTime startTime, final DateTime endTime, final int outputCount, final int sampleCount, final TimeSpan pollingInterval, final DecimationMode decimationMode, final TimeRangeSampleProcessor sampleProcessor) { super(startTime, endTime); if (outputCount <= 0 || sampleCount <= 0 || outputCount > sampleCount) { throw new IllegalArgumentException(String.format("In DecimatingSampleFilter, outputCount is %d but sampleCount is %d", outputCount, sampleCount)); } this.outputCount = outputCount; this.pollingInterval = pollingInterval; this.decimationMode = decimationMode; this.sampleProcessor = sampleProcessor; initializeFilterHistory(sampleCount); }
if (!initialized) { final long adjustedEndMillis = Math.min(getEndTime().getMillis(), System.currentTimeMillis()); final long millisTilEnd = adjustedEndMillis - time.getMillis(); final int sampleCount = Math.max(outputCount, (int) (millisTilEnd / pollingInterval.getMillis())); initializeFilterHistory(sampleCount); final SampleState sampleState = new SampleState(opcode, value, ScalarSample.getDoubleValue(opcode, value), time); final int historyIndex = sampleNumber % filterHistory.length; filterHistory[historyIndex] = sampleState; final SampleState sample = filterHistory[index]; if (sample != null) { final double doubleValue = sample.getDoubleValue(); sum += doubleValue; if (doubleValue > max) { final DateTime centerTime = firstSample != null ? new DateTime((firstSample.getTime().getMillis() + lastSample.getTime().getMillis()) >> 1) : lastSample.getTime(); switch (decimationMode) { case PEAK_PICK: sampleProcessor.processOneSample(centerTime, minSample.getSampleOpcode(), minSample.getValue()); } else { sampleProcessor.processOneSample(centerTime, maxSample.getSampleOpcode(), maxSample.getValue());
private DecimatingSampleFilter createDecimatingSampleFilter(final Integer outputCount, final DecimationMode decimationMode, final DateTime startTime, final DateTime endTime) { final DecimatingSampleFilter rangeSampleProcessor; if (outputCount == null) { rangeSampleProcessor = null; } else { // TODO Fix the polling interval rangeSampleProcessor = new DecimatingSampleFilter(startTime, endTime, outputCount, new TimeSpan("1s"), decimationMode, new CSVSampleProcessor()); } return rangeSampleProcessor; } }
final long millisStart = System.currentTimeMillis() - 2000 * 100; final DecimatingSampleFilter filter = new DecimatingSampleFilter(new DateTime(millisStart), new DateTime(millisStart + 2000 * 100), 25, 100, new TimeSpan("2s"), DecimationMode.PEAK_PICK, new TimeRangeSampleProcessor() { filter.processOneSample(new DateTime(millisStart + 2000 * i), SampleOpcode.DOUBLE, value);
final long millisStart = System.currentTimeMillis() - 2000 * 21; final DecimatingSampleFilter filter = new DecimatingSampleFilter(new DateTime(millisStart), new DateTime(millisStart + 2000 * 21), 6, 21, new TimeSpan("2s"), DecimationMode.PEAK_PICK, new TimeRangeSampleProcessor() { filter.processOneSample(new DateTime(millisStart + 2000 * i), SampleOpcode.DOUBLE, value);