package org.molgenis.data.mapper.algorithmgenerator.categorymapper.convertor; import org.jscience.physics.amount.Amount; import org.molgenis.data.mapper.algorithmgenerator.bean.AmountWrapper; import org.molgenis.data.mapper.algorithmgenerator.categorymapper.CategoryMapperUtil; import javax.measure.unit.Unit; import java.util.Collections; import java.util.List; import java.util.OptionalDouble; import java.util.Set; public class NumberAmountConvertor extends AmountConvertor { private final static int DEFAULT_NUMBER = 0; public boolean matchCriteria(String description) { return true; } AmountWrapper getInternalAmount(String description) { List<Double> extractNumbers = CategoryMapperUtil.extractNumbers(description); Unit<?> unit = CategoryMapperUtil.findDurationUnit(description); Collections.sort(extractNumbers); if (unit != null && unit.isCompatible(STANDARD_PER_WEEK_UNIT)) { if (extractNumbers.size() == 1) { return AmountWrapper.create(Amount.valueOf(extractNumbers.get(0), unit).to(STANDARD_PER_WEEK_UNIT)); } else if (extractNumbers.size() > 1) { return AmountWrapper.create(Amount .rangeOf(extractNumbers.get(0), extractNumbers.get(extractNumbers.size() - 1), unit) .to(STANDARD_PER_WEEK_UNIT)); } else { return AmountWrapper.create(Amount.valueOf(DEFAULT_NUMBER, unit).to(STANDARD_PER_WEEK_UNIT)); } } return null; } Double average(Set<Double> values) { OptionalDouble average = values.stream().mapToDouble(Double::doubleValue).average(); return average.isPresent() ? average.getAsDouble() : null; } }