Search in sources :

Example 1 with MissingValueStrategy

use of org.hisp.dhis.expression.MissingValueStrategy in project dhis2-core by dhis2.

the class DefaultExpressionService method generateExpression.

/**
     * Generates an expression based on the given data maps.
     * 
     * @param expression the expression.
     * @param valueMap the value map.
     * @param constantMap the constant map.
     * @param orgUnitCountMap the organisation unit count map.
     * @param days the number of days.
     * @param missingValueStrategy the missing value strategy.
     * @param aggregateMap the aggregate map.
     * @return an expression.
     */
private String generateExpression(String expression, Map<? extends DimensionalItemObject, Double> valueMap, Map<String, Double> constantMap, Map<String, Integer> orgUnitCountMap, Integer days, MissingValueStrategy missingValueStrategy, Map<String, List<Double>> aggregateMap) {
    if (expression == null || expression.isEmpty()) {
        return null;
    }
    expression = ExpressionUtils.normalizeExpression(expression);
    Map<String, Double> dimensionItemValueMap = valueMap.entrySet().stream().filter(e -> e.getValue() != null).collect(Collectors.toMap(e -> e.getKey().getDimensionItem(), e -> e.getValue()));
    missingValueStrategy = ObjectUtils.firstNonNull(missingValueStrategy, NEVER_SKIP);
    // ---------------------------------------------------------------------
    // Aggregates
    // ---------------------------------------------------------------------
    StringBuffer sb = new StringBuffer();
    Pattern prefix = CustomFunctions.AGGREGATE_PATTERN_PREFIX;
    Matcher matcher = prefix.matcher(expression);
    int scan = 0, len = expression.length(), tail = 0;
    while (scan < len && matcher.find(scan)) {
        int start = matcher.end();
        int end = Expression.matchExpression(expression, start);
        if (end < 0) {
            sb.append(expression.substring(scan, start));
            scan = start + 1;
            tail = start;
        } else if (aggregateMap == null || expression.charAt(start) == '<') {
            sb.append(expression.substring(scan, end));
            scan = end + 1;
            tail = end;
        } else {
            String subExpression = expression.substring(start, end);
            List<Double> samples = aggregateMap.get(subExpression);
            if (samples == null) {
                if (SKIP_IF_ANY_VALUE_MISSING.equals(missingValueStrategy)) {
                    return null;
                }
            } else {
                String literal = (samples == null) ? ("[]") : (samples.toString());
                sb.append(expression.substring(scan, start));
                sb.append(literal);
            }
            scan = end;
            tail = end;
        }
    }
    sb.append(expression.substring(tail));
    expression = sb.toString();
    // ---------------------------------------------------------------------
    // DimensionalItemObjects
    // ---------------------------------------------------------------------
    sb = new StringBuffer();
    matcher = VARIABLE_PATTERN.matcher(expression);
    int matchCount = 0;
    int valueCount = 0;
    while (matcher.find()) {
        matchCount++;
        String dimItem = matcher.group(GROUP_ID);
        final Double value = dimensionItemValueMap.get(dimItem);
        boolean missingValue = value == null;
        if (missingValue && SKIP_IF_ANY_VALUE_MISSING.equals(missingValueStrategy)) {
            return null;
        }
        if (!missingValue) {
            valueCount++;
        }
        String replacement = value != null ? String.valueOf(value) : NULL_REPLACEMENT;
        matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
    }
    if (SKIP_IF_ALL_VALUES_MISSING.equals(missingValueStrategy) && matchCount > 0 && valueCount == 0) {
        return null;
    }
    expression = TextUtils.appendTail(matcher, sb);
    // ---------------------------------------------------------------------
    // Constants
    // ---------------------------------------------------------------------
    sb = new StringBuffer();
    matcher = CONSTANT_PATTERN.matcher(expression);
    while (matcher.find()) {
        final Double constant = constantMap != null ? constantMap.get(matcher.group(GROUP_ID)) : null;
        String replacement = constant != null ? String.valueOf(constant) : NULL_REPLACEMENT;
        matcher.appendReplacement(sb, replacement);
    }
    expression = TextUtils.appendTail(matcher, sb);
    // ---------------------------------------------------------------------
    // Org unit groups
    // ---------------------------------------------------------------------
    sb = new StringBuffer();
    matcher = OU_GROUP_PATTERN.matcher(expression);
    while (matcher.find()) {
        final Integer count = orgUnitCountMap != null ? orgUnitCountMap.get(matcher.group(GROUP_ID)) : null;
        String replacement = count != null ? String.valueOf(count) : NULL_REPLACEMENT;
        matcher.appendReplacement(sb, replacement);
    }
    expression = TextUtils.appendTail(matcher, sb);
    // ---------------------------------------------------------------------
    // Days
    // ---------------------------------------------------------------------
    sb = new StringBuffer();
    matcher = DAYS_PATTERN.matcher(expression);
    while (matcher.find()) {
        String replacement = days != null ? String.valueOf(days) : NULL_REPLACEMENT;
        matcher.appendReplacement(sb, replacement);
    }
    return TextUtils.appendTail(matcher, sb);
}
Also used : ListMap(org.hisp.dhis.common.ListMap) DimensionalItemObject(org.hisp.dhis.common.DimensionalItemObject) DataElementService(org.hisp.dhis.dataelement.DataElementService) DimensionService(org.hisp.dhis.common.DimensionService) CustomFunctions(org.hisp.dhis.system.jep.CustomFunctions) StringUtils(org.apache.commons.lang3.StringUtils) Function(java.util.function.Function) DataElement(org.hisp.dhis.dataelement.DataElement) HashSet(java.util.HashSet) GenericStore(org.hisp.dhis.common.GenericStore) Matcher(java.util.regex.Matcher) ExpressionUtils(org.hisp.dhis.system.util.ExpressionUtils) MissingValueStrategy(org.hisp.dhis.expression.MissingValueStrategy) IdentifiableObjectManager(org.hisp.dhis.common.IdentifiableObjectManager) ObjectUtils(org.apache.commons.lang3.ObjectUtils) Map(java.util.Map) IndicatorValue(org.hisp.dhis.indicator.IndicatorValue) Indicator(org.hisp.dhis.indicator.Indicator) Constant(org.hisp.dhis.constant.Constant) DataElementCategoryService(org.hisp.dhis.dataelement.DataElementCategoryService) Period(org.hisp.dhis.period.Period) IdentifiableObject(org.hisp.dhis.common.IdentifiableObject) DataElementOperand(org.hisp.dhis.dataelement.DataElementOperand) OrganisationUnitGroupService(org.hisp.dhis.organisationunit.OrganisationUnitGroupService) OrganisationUnitGroup(org.hisp.dhis.organisationunit.OrganisationUnitGroup) Collection(java.util.Collection) Set(java.util.Set) ConstantService(org.hisp.dhis.constant.ConstantService) DateUtils(org.hisp.dhis.system.util.DateUtils) InvalidIdentifierReferenceException(org.hisp.dhis.common.exception.InvalidIdentifierReferenceException) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) SetMap(org.hisp.dhis.common.SetMap) DataElementCategoryOptionCombo(org.hisp.dhis.dataelement.DataElementCategoryOptionCombo) List(java.util.List) CachingMap(org.hisp.dhis.commons.collection.CachingMap) Log(org.apache.commons.logging.Log) LogFactory(org.apache.commons.logging.LogFactory) Pattern(java.util.regex.Pattern) MathUtils(org.hisp.dhis.system.util.MathUtils) TextUtils(org.hisp.dhis.commons.util.TextUtils) Transactional(org.springframework.transaction.annotation.Transactional) Pattern(java.util.regex.Pattern) Matcher(java.util.regex.Matcher) List(java.util.List)

Aggregations

Sets (com.google.common.collect.Sets)1 Collection (java.util.Collection)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 Function (java.util.function.Function)1 Matcher (java.util.regex.Matcher)1 Pattern (java.util.regex.Pattern)1 Collectors (java.util.stream.Collectors)1 ObjectUtils (org.apache.commons.lang3.ObjectUtils)1 StringUtils (org.apache.commons.lang3.StringUtils)1 Log (org.apache.commons.logging.Log)1 LogFactory (org.apache.commons.logging.LogFactory)1 DimensionService (org.hisp.dhis.common.DimensionService)1 DimensionalItemObject (org.hisp.dhis.common.DimensionalItemObject)1 GenericStore (org.hisp.dhis.common.GenericStore)1 IdentifiableObject (org.hisp.dhis.common.IdentifiableObject)1 IdentifiableObjectManager (org.hisp.dhis.common.IdentifiableObjectManager)1 ListMap (org.hisp.dhis.common.ListMap)1