package pl.edu.icm.saos.search.analysis.solr.recalc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import pl.edu.icm.saos.common.chart.Point; import pl.edu.icm.saos.common.chart.Series; import pl.edu.icm.saos.search.analysis.request.JudgmentSeriesCriteria; import pl.edu.icm.saos.search.analysis.request.RateYValue; import pl.edu.icm.saos.search.analysis.request.XSettings; import pl.edu.icm.saos.search.analysis.request.YSettings; import pl.edu.icm.saos.search.analysis.request.YValueType; import com.google.common.base.Preconditions; /** * @author Ɓukasz Dumiszewski */ @Service("seriesYRateRecalculator") public class SeriesYRateRecalculator implements SeriesYRecalculator { private RateBaseSeriesGenerator rateBaseSeriesGenerator; //------------------------ LOGIC -------------------------- @Override public Series<Object, ? extends Number> recalculateSeries(Series<Object, Integer> series, JudgmentSeriesCriteria criteria, XSettings xsettings, YSettings ysettings) { RateYValue rateYValue = (RateYValue)ysettings.getValueType(); Preconditions.checkNotNull(rateYValue); Series<Object, Integer> baseSeries = rateBaseSeriesGenerator.generateRateBaseSeries(criteria, xsettings); return recalculateSeries(series, baseSeries, rateYValue.getRateRatio()); } @Override public boolean handles(YValueType yValueType) { Preconditions.checkNotNull(yValueType); return yValueType.getClass().equals(RateYValue.class); } //------------------------ PRIVATE -------------------------- <X> Series<X, Float> recalculateSeries(Series<X, Integer> series, Series<X, Integer> baseSeries, int rateRatio) { Preconditions.checkArgument(series.getPoints().size() == baseSeries.getPoints().size()); Series<X, Float> rateSeries = new Series<>(); for (int i = 0; i < series.getPoints().size(); i++) { Point<X, Integer> bPoint = baseSeries.getPoints().get(i); Point<X, Integer> sPoint = series.getPoints().get(i); float newY = calcRate(sPoint.getY(), bPoint.getY(), rateRatio); Point<X, Float> recPoint = new Point<>(sPoint.getX(), newY); rateSeries.addPoint(recPoint); } return rateSeries; } private float calcRate(int value, int baseValue, int rateRatio) { if (baseValue == 0) { return 0; } return ((float)((long)value * rateRatio)) / baseValue; } //------------------------ SETTERS -------------------------- @Autowired public void setRateBaseSeriesGenerator(RateBaseSeriesGenerator rateBaseSeriesGenerator) { this.rateBaseSeriesGenerator = rateBaseSeriesGenerator; } }