package net.iponweb.disthene.reader.graph;
import net.iponweb.disthene.reader.beans.TimeSeries;
import net.iponweb.disthene.reader.beans.TimeSeriesOption;
import net.iponweb.disthene.reader.utils.CollectionUtils;
import java.util.*;
/**
* @author Andrei Ivanov
*/
public class DecoratedTimeSeries {
private TimeSeries timeSeries;
private double xStep;
private int valuesPerPoint;
public DecoratedTimeSeries(TimeSeries timeSeries) {
this.timeSeries = timeSeries;
}
public double getxStep() {
return xStep;
}
public void setxStep(double xStep) {
this.xStep = xStep;
}
public int getValuesPerPoint() {
return valuesPerPoint;
}
public void setValuesPerPoint(int valuesPerPoint) {
this.valuesPerPoint = valuesPerPoint;
}
public String getName() {
return timeSeries.getName();
}
public Long getFrom() {
return timeSeries.getFrom();
}
public Long getTo() {
return timeSeries.getTo();
}
public Double[] getValues() {
return timeSeries.getValues();
}
public int getStep() {
return timeSeries.getStep();
}
public Object getOption(TimeSeriesOption option) {
return timeSeries.getOption(option);
}
public boolean hasOption(TimeSeriesOption option) {
return timeSeries.hasOption(option);
}
public void setOption(TimeSeriesOption option, Object value) {
timeSeries.setOption(option, value);
}
public void addOption(TimeSeriesOption option) {
timeSeries.addOption(option);
}
//todo: implement in a more reasonable way
public Double[] getConsolidatedValues() {
if (valuesPerPoint <= 1) return timeSeries.getValues();
List<Double> consolidated = new ArrayList<>();
List<Double> buffer = new ArrayList<>();
for(Double value : timeSeries.getValues()) {
buffer.add(value);
if (buffer.size() == valuesPerPoint) {
buffer.removeAll(Collections.singleton((Double) null));
if (buffer.size() > 0 ) {
consolidated.add(CollectionUtils.average(buffer));
} else {
consolidated.add(null);
}
buffer.clear();
}
}
buffer.removeAll(Collections.singleton((Double) null));
if (buffer.size() > 0 ) {
consolidated.add(CollectionUtils.average(buffer));
} else {
consolidated.add(null);
}
Double[] result = new Double[consolidated.size()];
return consolidated.toArray(result);
}
}