use of com.infiniteautomation.mango.quantize.TemporalAmountBucketCalculator in project ma-core-public by infiniteautomation.
the class StatisticsAggregatorTest method emptyStream.
@Test
public void emptyStream() {
BucketCalculator bucketCalc = new TemporalAmountBucketCalculator(from, to, aggregatePeriod);
List<NumericAggregate> aggregates = StatisticsAggregator.aggregate(Stream.empty(), new AnalogStatisticsQuantizer(bucketCalc)).collect(Collectors.toList());
Assert.assertEquals(expectedAggregateValues, aggregates.size());
for (var aggregate : aggregates) {
assertEquals(0L, aggregate.getCount());
assertEquals(Double.NaN, aggregate.getArithmeticMean(), 0.0D);
assertEquals(Double.NaN, aggregate.getAverage(), 0.0D);
}
}
use of com.infiniteautomation.mango.quantize.TemporalAmountBucketCalculator in project ma-core-public by infiniteautomation.
the class StatisticsAggregatorTest method aggregateWithInitialValue.
@Test
public void aggregateWithInitialValue() {
PointValueTime initialValue = new PointValueTime(1.0D, from.minusHours(1L).toInstant().toEpochMilli());
PointValueGenerator generator = new ConstantPointValueGenerator(from.toInstant(), to.toInstant(), pollPeriod, new NumericValue(0.0D));
var stream = generator.apply(new DataPointVO()).map(BatchPointValue::getValue);
BucketCalculator bucketCalc = new TemporalAmountBucketCalculator(from, to, aggregatePeriod);
List<NumericAggregate> aggregates = StatisticsAggregator.aggregate(Stream.concat(Stream.of(initialValue), stream), new AnalogStatisticsQuantizer(bucketCalc)).collect(Collectors.toList());
Assert.assertEquals(expectedAggregateValues, aggregates.size());
for (var aggregate : aggregates) {
assertEquals(180L, aggregate.getCount());
assertEquals(0.0D, aggregate.getArithmeticMean(), 0.0D);
assertEquals(0.0D, aggregate.getArithmeticMean(), 0.0D);
}
}
use of com.infiniteautomation.mango.quantize.TemporalAmountBucketCalculator in project ma-core-public by infiniteautomation.
the class StatisticsAggregatorTest method initialValueOnly.
@Test
public void initialValueOnly() {
PointValueTime initialValue = new PointValueTime(1.0D, from.minusHours(1L).toInstant().toEpochMilli());
BucketCalculator bucketCalc = new TemporalAmountBucketCalculator(from, to, aggregatePeriod);
List<NumericAggregate> aggregates = StatisticsAggregator.aggregate(Stream.of(initialValue), new AnalogStatisticsQuantizer(bucketCalc)).collect(Collectors.toList());
Assert.assertEquals(expectedAggregateValues, aggregates.size());
for (var aggregate : aggregates) {
assertEquals(0L, aggregate.getCount());
assertEquals(Double.NaN, aggregate.getArithmeticMean(), 0.0D);
assertEquals(1.0D, aggregate.getAverage(), 0.0D);
}
}
use of com.infiniteautomation.mango.quantize.TemporalAmountBucketCalculator in project ma-core-public by infiniteautomation.
the class StatisticsAggregatorTest method aggregate.
@Test
public void aggregate() {
PointValueGenerator generator = new ConstantPointValueGenerator(from.toInstant(), to.toInstant(), pollPeriod, new NumericValue(0.0D));
var stream = generator.apply(new DataPointVO()).map(BatchPointValue::getValue);
BucketCalculator bucketCalc = new TemporalAmountBucketCalculator(from, to, aggregatePeriod);
List<NumericAggregate> aggregates = StatisticsAggregator.aggregate(stream, new AnalogStatisticsQuantizer(bucketCalc)).collect(Collectors.toList());
Assert.assertEquals(expectedAggregateValues, aggregates.size());
for (var aggregate : aggregates) {
assertEquals(180L, aggregate.getCount());
assertEquals(0.0D, aggregate.getArithmeticMean(), 0.0D);
assertEquals(0.0D, aggregate.getArithmeticMean(), 0.0D);
}
}
use of com.infiniteautomation.mango.quantize.TemporalAmountBucketCalculator in project ma-core-public by infiniteautomation.
the class AggregateDao method aggregate.
/**
* Aggregate a stream of raw point values into aggregate statistics. Mango statistics rely on knowing the initial
* value of the point before the "from" time, you must include an initial start value in the stream (if one exists).
* The timestamp of this start value should be less than the "from" time.
*
* @param point data point
* @param from from time (inclusive)
* @param to to time (exclusive)
* @param pointValues stream of point values, must include a start value (at time < from) for accurate statistics
* @param aggregationPeriod aggregation period (bucket/window size)
* @return stream of aggregates
*/
default Stream<SeriesValueTime<AggregateValue>> aggregate(DataPointVO point, ZonedDateTime from, ZonedDateTime to, Stream<? extends PointValueTime> pointValues, TemporalAmount aggregationPeriod) {
BucketCalculator bucketCalc = new TemporalAmountBucketCalculator(from, to, aggregationPeriod);
AbstractPointValueTimeQuantizer<?> quantizer;
switch(point.getPointLocator().getDataType()) {
case BINARY:
case MULTISTATE:
quantizer = new StartsAndRuntimeListQuantizer(bucketCalc);
break;
case NUMERIC:
quantizer = new AnalogStatisticsQuantizer(bucketCalc);
break;
case ALPHANUMERIC:
quantizer = new ValueChangeCounterQuantizer(bucketCalc);
break;
default:
throw new IllegalStateException("Unknown data type: " + point.getPointLocator().getDataType());
}
Stream<AggregateValue> aggregateStream = StatisticsAggregator.aggregate(pointValues, quantizer).filter(v -> v instanceof AggregateValue).map(v -> (AggregateValue) v);
return aggregateStream.map(v -> new DefaultSeriesValueTime<>(point.getSeriesId(), v.getPeriodStartTime(), v));
}
Aggregations