@Override public boolean equals(Object other) { if (!(other instanceof TimestampedValue)) { return false; } TimestampedValue<?> o = (TimestampedValue<?>) other; return o.getTimestamp() == timestamp && Objects.equal(o.getValue(), value); }
public synchronized List<TimestampedValue<T>> getValuesInWindow(long now, Duration subTimePeriod) { long startTime = now - subTimePeriod.toMilliseconds(); List<TimestampedValue<T>> result = new LinkedList<TimestampedValue<T>>(); TimestampedValue<T> mostRecentExpired = null; for (TimestampedValue<T> val : values) { if (val.getTimestamp() < startTime) { // discard; but remember most recent too-old value so we include that as the "initial" mostRecentExpired = val; } else { result.add(val); } } if (minExpiredVals > 0 && mostRecentExpired != null) { result.add(0, mostRecentExpired); } if (result.size() < minVals) { int minIndex = Math.max(0, values.size()-minVals); return ImmutableList.copyOf(values.subList(minIndex, values.size())); } else { return result; } }
public synchronized void pruneValues(long now) { long startTime = now - timePeriod.toMilliseconds(); int expiredValsCount = 0; if (timePeriod.equals(Duration.ZERO)) { expiredValsCount = values.size(); } else { for (TimestampedValue<T> val : values) { if (val.getTimestamp() < startTime) { expiredValsCount++; } else { break; } } } int numToPrune = Math.min(expiredValsCount - minExpiredVals, values.size()-minVals); for (int i = 0; i < numToPrune; i++) { values.removeFirst(); } }
/** * If the entire time-window is not covered by the given values, then returns Integer.MAX_VALUE. */ private <T extends Number> T maxInWindow(List<TimestampedValue<T>> vals, Duration timeWindow) { // TODO bad casting from Integer default result to T long now = System.currentTimeMillis(); long epoch = now - timeWindow.toMilliseconds(); T result = null; double resultAsDouble = Integer.MAX_VALUE; for (TimestampedValue<T> val : vals) { T valAsNum = val.getValue(); double valAsDouble = (valAsNum != null) ? valAsNum.doubleValue() : 0; if (result == null && val.getTimestamp() > epoch) { result = withDefault(null, Integer.MAX_VALUE); resultAsDouble = result.doubleValue(); } if (result == null || (valAsNum != null && valAsDouble > resultAsDouble)) { result = valAsNum; resultAsDouble = valAsDouble; } } return withDefault(result, Integer.MAX_VALUE); }
/** * If the entire time-window is not covered by the given values, then returns Integer.MIN_VALUE */ private <T extends Number> T minInWindow(List<TimestampedValue<T>> vals, Duration timeWindow) { long now = System.currentTimeMillis(); long epoch = now - timeWindow.toMilliseconds(); T result = null; double resultAsDouble = Integer.MIN_VALUE; for (TimestampedValue<T> val : vals) { T valAsNum = val.getValue(); double valAsDouble = (valAsNum != null) ? valAsNum.doubleValue() : 0; if (result == null && val.getTimestamp() > epoch) { result = withDefault(null, Integer.MIN_VALUE); resultAsDouble = result.doubleValue(); } if (result == null || (val.getValue() != null && valAsDouble < resultAsDouble)) { result = valAsNum; resultAsDouble = valAsDouble; } } return withDefault(result, Integer.MIN_VALUE); }