in runtime/common/src/main/java/org/apache/nemo/runtime/common/metric/MetricUtils.java [380:434]
static Serializable indexToValue(final Double split, final Double tweak, final Integer epKeyIndex) {
final Class<? extends Serializable> targetObjectClass = getEpPairFromKeyIndex(epKeyIndex).right();
final boolean splitIsInteger = split.compareTo((double) split.intValue()) == 0;
final Pair<Integer, Integer> splitIntVal = splitIsInteger
? Pair.of(split.intValue() - 1, split.intValue() + 1)
: Pair.of(split.intValue(), split.intValue() + 1);
if (targetObjectClass.isEnum()) {
final int ordinal;
if (split < 0) {
ordinal = 0;
} else {
final int maxOrdinal = targetObjectClass.getFields().length - 1;
final int left = splitIntVal.left() <= 0 ? 0 : splitIntVal.left();
final int right = splitIntVal.right() >= maxOrdinal ? maxOrdinal : splitIntVal.right();
ordinal = tweak < 0 ? left : right;
}
LOG.info("Translated: {} into ENUM with ordinal {}", split, ordinal);
return targetObjectClass.getEnumConstants()[ordinal];
} else if (targetObjectClass.isAssignableFrom(Integer.class)) {
final Double val = split + tweak + 0.5;
final Integer res = val.intValue();
LOG.info("Translated: {} into INTEGER of {}", split, res);
return res;
} else if (targetObjectClass.isAssignableFrom(Boolean.class)) {
final Boolean res;
if (split < 0) {
res = false;
} else if (split > 1) {
res = true;
} else {
final Boolean left = splitIntVal.left() >= 1; // false by default, true if >= 1
final Boolean right = splitIntVal.right() > 0; // true by default, false if <= 0
res = tweak < 0 ? left : right;
}
LOG.info("Translated: {} into BOOLEAN of {}", split, res);
return res;
} else {
final Supplier<IntStream> valueCandidates = () -> EP_METADATA.keySet().stream()
.filter(p -> p.left().equals(epKeyIndex))
.mapToInt(Pair::right);
final Integer left = valueCandidates.get()
.filter(n -> n < split)
.map(n -> -n).sorted().map(n -> -n) // maximum among smaller values
.findFirst().orElse(valueCandidates.get().min().getAsInt());
final Integer right = valueCandidates.get()
.filter(n -> n > split)
.sorted() // minimum among larger values
.findFirst().orElse(valueCandidates.get().max().getAsInt());
final Integer targetValue = tweak < 0 ? left : right;
final Serializable res = EP_METADATA.get(Pair.of(epKeyIndex, targetValue)).getValue();
LOG.info("Translated: {} into VALUE of {}", split, res);
return res;
}
}