Skip to content

Commit

Permalink
Add transform expression condition (MID-4862)
Browse files Browse the repository at this point in the history
This is an EXPERIMENTAL implementation of condition that would
cause specified combinations of input values for an expression to
be skipped from evaluation.
  • Loading branch information
mederly committed Sep 4, 2018
1 parent af4a3fc commit 616570a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 20 deletions.
Expand Up @@ -9223,6 +9223,17 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="condition" type="tns:ExpressionType" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
Condition driving whether this expression is evaluated at all (for given inputs).
</xsd:documentation>
<xsd:appinfo>
<a:experimental>true</a:experimental>
<a:since>3.9</a:since>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>

Expand Down
Expand Up @@ -15,35 +15,20 @@
*/
package com.evolveum.midpoint.model.common.expression.evaluator;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;

import javax.xml.namespace.QName;

import com.evolveum.midpoint.common.LocalizationService;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.DeltaSetTriple;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.PlusMinusZero;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator;
import com.evolveum.midpoint.repo.common.expression.ExpressionSyntaxException;
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.repo.common.expression.ItemDeltaItem;
import com.evolveum.midpoint.repo.common.expression.ObjectDeltaObject;
import com.evolveum.midpoint.repo.common.expression.Source;
import com.evolveum.midpoint.repo.common.expression.SourceTriple;
import com.evolveum.midpoint.repo.common.expression.*;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ExceptionUtil;
Expand Down Expand Up @@ -350,6 +335,14 @@ private PrismValueDeltaSetTriple<V> evaluateRelativeExpression(final List<Source

final PrismValueDeltaSetTriple<V> outputTriple = new PrismValueDeltaSetTriple<>();

Expression<PrismPropertyValue<Boolean>, PrismPropertyDefinition<Boolean>> conditionExpression;
if (expressionEvaluatorType.getCondition() != null) {
conditionExpression = ExpressionUtil.createCondition(expressionEvaluatorType.getCondition(),
evaluationContext.getExpressionFactory(), "condition in " + contextDescription, task, result);
} else {
conditionExpression = null;
}

Processor<Collection<? extends PrismValue>> processor = pvalues -> {
if (includeNulls != null && !includeNulls && MiscUtil.isAllNull(pvalues)) {
// The case that all the sources are null. There is no point executing the expression.
Expand Down Expand Up @@ -426,8 +419,22 @@ private PrismValueDeltaSetTriple<V> evaluateRelativeExpression(final List<Source

List<V> scriptResults;
try {
scriptResults = transformSingleValue(scriptVariables, valueDestination, useNew, evaluationContext,
contextDescription, task, result);
boolean conditionResult;
if (conditionExpression != null) {
ExpressionEvaluationContext ctx = new ExpressionEvaluationContext(null, scriptVariables,
"condition in " + contextDescription, task, result);
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> triple = conditionExpression.evaluate(ctx);
conditionResult = ExpressionUtil.computeConditionResult(triple.getNonNegativeValues());
} else {
conditionResult = true;
}
if (conditionResult) {
scriptResults = transformSingleValue(scriptVariables, valueDestination, useNew, evaluationContext,
contextDescription, task, result);
} else {
LOGGER.trace("Skipping value transformation because condition evaluated to false in {}", contextDescription);
scriptResults = Collections.emptyList();
}
} catch (ExpressionEvaluationException e) {
throw new TunnelException(
localizationService.translate(
Expand Down

0 comments on commit 616570a

Please sign in to comment.