
kr.jm.metric.config.mutator.field.FormulaFieldConfig Maven / Gradle / Ivy
package kr.jm.metric.config.mutator.field;
import kr.jm.utils.JavascriptEvaluator;
import kr.jm.utils.exception.JMExceptionManager;
import kr.jm.utils.helper.JMLambda;
import kr.jm.utils.helper.JMOptional;
import kr.jm.utils.helper.JMString;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;
@Getter
@ToString(callSuper = true)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Slf4j
public class FormulaFieldConfig extends CombinedFieldConfig {
private String formula;
private Number defaultResult;
private String[] sortedTargetFields;
public FormulaFieldConfig(String[] targetFields,
String combinedFieldName, String delimiter, String formula,
Number defaultResult) {
super(targetFields, combinedFieldName, delimiter);
this.formula = formula;
this.defaultResult = defaultResult;
}
@Override
public Object buildValue(Map fieldObjectMap) {
try {
return JavascriptEvaluator.eval(buildFormula(fieldObjectMap));
} catch (Exception e) {
return JMExceptionManager.handleExceptionAndReturn(log, e,
"buildValue", () -> defaultResult, fieldObjectMap, formula);
}
}
private String buildFormula(Map fieldObjectMap) {
String formula = this.formula;
for (String field : getSortedTargetFields())
formula = buildFormula(fieldObjectMap, formula, field);
return formula;
}
private String buildFormula(Map fieldObjectMap,
String formula, String field) {
return JMOptional.getOptional(fieldObjectMap, field)
.map(Object::toString).filter(JMString::isNumber)
.map(number -> formula.replaceAll(field, number))
.orElseThrow(() -> new RuntimeException(
"Fail To Build Formula !!!"));
}
public String[] getSortedTargetFields() {
return JMLambda.supplierIfNull(this.sortedTargetFields, () -> this
.sortedTargetFields = buildSortedTargetFields());
}
private String[] buildSortedTargetFields() {
return JMOptional.getOptional(getTargetFields()).stream()
.flatMap(Arrays::stream).sorted(Comparator.reverseOrder())
.toArray(String[]::new);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy