All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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