package pl.llp.aircasting.view.presenter;
import pl.llp.aircasting.model.Measurement;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Date;
import static com.google.common.collect.Lists.newArrayList;
public class MeasurementAggregator
{
private double cumulativeLongitude;
private double cumulativeLatitude;
private double cumulativeValue;
private long cumulativeTime;
private int count;
public void add(Measurement measurement)
{
cumulativeLongitude += measurement.getLongitude();
cumulativeLatitude += measurement.getLatitude();
cumulativeValue += measurement.getValue();
cumulativeTime += measurement.getTime().getTime();
count += 1;
}
public void reset()
{
cumulativeLongitude = cumulativeLatitude = cumulativeValue = cumulativeTime = count = 0;
}
public Measurement getAverage()
{
double latitude = cumulativeLatitude / count;
double longitude = cumulativeLongitude / count;
double value = cumulativeValue / count;
Date time = new Date(cumulativeTime / count);
return new Measurement(latitude, longitude, value, time);
}
public boolean isComposite()
{
return count > 1;
}
public boolean isEmpty()
{
return count == 0;
}
public ArrayList<Measurement> smoothenSamplesToReduceCount(ArrayList<Measurement> samples, int limit)
{
reset();
ArrayList<Measurement> result = newArrayList();
double fillFactor = 1.0 * limit / samples.size();
double fill = 0.0;
for (Measurement measurement : samples)
{
add(measurement);
fill += fillFactor;
if(fill > 1)
{
fill -= 1;
result.add(getAverage());
reset();
}
}
if(count > 0)
{
result.add(getAverage());
}
return result;
}
public static Measurement getAverage(ImmutableList<Measurement> measurements)
{
MeasurementAggregator aggregator = new MeasurementAggregator();
for (Measurement measurement : measurements)
{
aggregator.add(measurement);
}
return aggregator.getAverage();
}
}