Skip to content

Commit 21e994b

Browse files
authored
Merge pull request #127 from powerflows/develop
Develop
2 parents ab37b5d + d22b5ee commit 21e994b

55 files changed

Lines changed: 1094 additions & 418 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=org.powerflows%3Admn&metric=alert_status)](https://sonarcloud.io/dashboard?id=org.powerflows%3Admn)
33
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=org.powerflows%3Admn&metric=coverage)](https://sonarcloud.io/component_measures?id=org.powerflows%3Admn&metric=coverage)
44
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.powerflows/dmn/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.powerflows/dmn)
5+
[![Java Doc](http://www.javadoc.io/badge/org.powerflows/dmn.svg?color=brightgreen)](http://www.javadoc.io/doc/org.powerflows/dmn)
56
# About Power Flows DMN
67
Power Flows DMN - a powerful decision engine.
78

@@ -376,7 +377,7 @@ The result of an evaluation process is decision result object.
376377
Decision decision = Decision.builder().build(); //here developer has to build a valid decision object
377378
DecisionEngine decisionEngine = new DefaultDecisionEngineConfiguration().configure();
378379

379-
Map<String, Object> variables = new HashMap<>();
380+
Map<String, Serializable> variables = new HashMap<>();
380381
variables.put("inputOne", 2);
381382
variables.put("inputTwo", "five");
382383
DecisionVariables decisionVariables = new DecisionVariables(variables);

src/main/java/org/powerflows/dmn/engine/configuration/DefaultDecisionEngineConfiguration.java

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@
2020
import org.powerflows.dmn.engine.DecisionEngine;
2121
import org.powerflows.dmn.engine.DefaultDecisionEngine;
2222
import org.powerflows.dmn.engine.evaluator.decision.DecisionEvaluator;
23-
import org.powerflows.dmn.engine.evaluator.entry.EntryEvaluator;
2423
import org.powerflows.dmn.engine.evaluator.entry.InputEntryEvaluator;
2524
import org.powerflows.dmn.engine.evaluator.entry.OutputEntryEvaluator;
26-
import org.powerflows.dmn.engine.evaluator.expression.comparator.DefaultObjectsComparator;
27-
import org.powerflows.dmn.engine.evaluator.expression.comparator.ObjectsComparator;
28-
import org.powerflows.dmn.engine.evaluator.expression.provider.EvaluationProviderFactory;
25+
import org.powerflows.dmn.engine.evaluator.entry.mode.provider.EvaluationModeProviderFactory;
26+
import org.powerflows.dmn.engine.evaluator.expression.provider.ExpressionEvaluationProviderFactory;
2927
import org.powerflows.dmn.engine.evaluator.expression.script.DefaultScriptEngineProvider;
3028
import org.powerflows.dmn.engine.evaluator.expression.script.ScriptEngineProvider;
3129
import org.powerflows.dmn.engine.evaluator.rule.RuleEvaluator;
@@ -37,31 +35,29 @@ public class DefaultDecisionEngineConfiguration implements DecisionEngineConfigu
3735

3836
private DecisionEvaluator decisionEvaluator;
3937
private RuleEvaluator ruleEvaluator;
40-
private EntryEvaluator entryEvaluator;
41-
private ObjectsComparator objectsComparator;
38+
private EvaluationModeProviderFactory evaluationModeProviderFactory;
4239
private InputEntryEvaluator inputEntryEvaluator;
4340
private OutputEntryEvaluator outputEntryEvaluator;
4441
private ScriptEngineProvider scriptEngineProvider;
45-
private EvaluationProviderFactory evaluationProviderFactory;
42+
private ExpressionEvaluationProviderFactory expressionEvaluationProviderFactory;
4643
private TypeConverterFactory typeConverterFactory;
4744

4845
@Override
4946
public DecisionEngine configure() {
5047
initScriptEngineProvider();
5148
initEvaluationProviderFactory();
5249
initTypeConverterFactory();
53-
initObjectsComparator();
50+
initEvaluationModeProviderFactory();
5451
initInputEntryEvaluator();
5552
initOutputEntryEvaluator();
56-
initEntryEvaluator();
5753
initRuleEvaluator();
5854
initDecisionEvaluator();
5955

6056
return new DefaultDecisionEngine(decisionEvaluator);
6157
}
6258

6359
private void initEvaluationProviderFactory() {
64-
evaluationProviderFactory = new EvaluationProviderFactory(scriptEngineProvider);
60+
expressionEvaluationProviderFactory = new ExpressionEvaluationProviderFactory(scriptEngineProvider);
6561
}
6662

6763
private void initTypeConverterFactory() {
@@ -72,24 +68,20 @@ private void initScriptEngineProvider() {
7268
scriptEngineProvider = new DefaultScriptEngineProvider(new ScriptEngineManager());
7369
}
7470

75-
private void initObjectsComparator() {
76-
objectsComparator = new DefaultObjectsComparator();
71+
private void initEvaluationModeProviderFactory() {
72+
evaluationModeProviderFactory = new EvaluationModeProviderFactory();
7773
}
7874

7975
private void initInputEntryEvaluator() {
80-
inputEntryEvaluator = new InputEntryEvaluator(evaluationProviderFactory, typeConverterFactory, objectsComparator);
76+
inputEntryEvaluator = new InputEntryEvaluator(expressionEvaluationProviderFactory, typeConverterFactory, evaluationModeProviderFactory);
8177
}
8278

8379
private void initOutputEntryEvaluator() {
84-
outputEntryEvaluator = new OutputEntryEvaluator(evaluationProviderFactory, typeConverterFactory);
85-
}
86-
87-
private void initEntryEvaluator() {
88-
entryEvaluator = new EntryEvaluator(inputEntryEvaluator, outputEntryEvaluator);
80+
outputEntryEvaluator = new OutputEntryEvaluator(expressionEvaluationProviderFactory, typeConverterFactory);
8981
}
9082

9183
private void initRuleEvaluator() {
92-
ruleEvaluator = new RuleEvaluator(entryEvaluator);
84+
ruleEvaluator = new RuleEvaluator(inputEntryEvaluator, outputEntryEvaluator);
9385
}
9486

9587
private void initDecisionEvaluator() {

src/main/java/org/powerflows/dmn/engine/evaluator/context/EvaluationContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public EvaluationContext(final DecisionVariables decisionVariables) {
3434
this.variables.putAll(decisionVariables.getAll());
3535
}
3636

37-
public synchronized void addVariable(final String key, Object value) {
37+
public synchronized void addVariable(final String key, final Serializable value) {
3838
variables.put(key, value);
3939
}
4040
}

src/main/java/org/powerflows/dmn/engine/evaluator/entry/EntryEvaluator.java

Lines changed: 0 additions & 72 deletions
This file was deleted.

src/main/java/org/powerflows/dmn/engine/evaluator/entry/InputEntryEvaluator.java

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,69 +19,82 @@
1919

2020
import lombok.extern.slf4j.Slf4j;
2121
import org.powerflows.dmn.engine.evaluator.context.EvaluationContext;
22-
import org.powerflows.dmn.engine.evaluator.expression.comparator.ObjectsComparator;
23-
import org.powerflows.dmn.engine.evaluator.expression.provider.EvaluationProviderFactory;
22+
import org.powerflows.dmn.engine.evaluator.entry.mode.provider.EvaluationModeProvider;
23+
import org.powerflows.dmn.engine.evaluator.entry.mode.provider.EvaluationModeProviderFactory;
2424
import org.powerflows.dmn.engine.evaluator.expression.provider.ExpressionEvaluationProvider;
25+
import org.powerflows.dmn.engine.evaluator.expression.provider.ExpressionEvaluationProviderFactory;
2526
import org.powerflows.dmn.engine.evaluator.type.converter.TypeConverter;
2627
import org.powerflows.dmn.engine.evaluator.type.converter.TypeConverterFactory;
2728
import org.powerflows.dmn.engine.evaluator.type.value.SpecifiedTypeValue;
29+
import org.powerflows.dmn.engine.model.decision.EvaluationMode;
2830
import org.powerflows.dmn.engine.model.decision.field.Input;
2931
import org.powerflows.dmn.engine.model.decision.field.ValueType;
3032
import org.powerflows.dmn.engine.model.decision.rule.entry.InputEntry;
3133

34+
import java.io.Serializable;
35+
3236
@Slf4j
3337
public class InputEntryEvaluator {
3438

35-
private final EvaluationProviderFactory evaluationProviderFactory;
39+
private final ExpressionEvaluationProviderFactory expressionEvaluationProviderFactory;
3640
private final TypeConverterFactory typeConverterFactory;
37-
private final ObjectsComparator objectsComparator;
41+
private final EvaluationModeProviderFactory evaluationModeProviderFactory;
3842

3943

40-
public InputEntryEvaluator(final EvaluationProviderFactory evaluationProviderFactory,
44+
public InputEntryEvaluator(final ExpressionEvaluationProviderFactory expressionEvaluationProviderFactory,
4145
final TypeConverterFactory typeConverterFactory,
42-
final ObjectsComparator objectsComparator) {
43-
this.evaluationProviderFactory = evaluationProviderFactory;
46+
final EvaluationModeProviderFactory evaluationModeProviderFactory) {
47+
this.expressionEvaluationProviderFactory = expressionEvaluationProviderFactory;
4448
this.typeConverterFactory = typeConverterFactory;
45-
this.objectsComparator = objectsComparator;
49+
this.evaluationModeProviderFactory = evaluationModeProviderFactory;
4650
}
4751

48-
public boolean evaluate(final InputEntry inputEntry, final Input input, final EvaluationContext evaluationContext) {
49-
final ExpressionEvaluationProvider inputEntryExpressionEvaluator = evaluationProviderFactory.getInstance(inputEntry.getExpression().getType());
52+
public boolean evaluate(final InputEntry inputEntry,
53+
final Input input,
54+
final EvaluationContext evaluationContext) {
55+
log.debug("Starting evaluation of input entry: {} with input: {} and evaluation context: {}", inputEntry, input, evaluationContext);
56+
57+
final ExpressionEvaluationProvider inputEntryExpressionEvaluator = expressionEvaluationProviderFactory.getInstance(inputEntry.getExpression().getType());
5058
final TypeConverter typeConverter = typeConverterFactory.getInstance(input.getType());
5159

5260
if (!isInputEvaluated(input, evaluationContext)) {
53-
final ExpressionEvaluationProvider inputExpressionEvaluator = evaluationProviderFactory.getInstance(input.getExpression().getType());
54-
final Object evaluatedInputValue = inputExpressionEvaluator.evaluateInput(input, evaluationContext);
61+
final ExpressionEvaluationProvider inputExpressionEvaluator = expressionEvaluationProviderFactory.getInstance(input.getExpression().getType());
62+
final Serializable evaluatedInputValue = inputExpressionEvaluator.evaluateInput(input, evaluationContext);
5563

5664
evaluationContext.addVariable(input.getName(), evaluatedInputValue);
5765
}
5866

5967
final Object inputValue = evaluationContext.get(inputEntry.getName());
6068
final SpecifiedTypeValue<?> typedInputValue = typeConverter.convert(inputValue);
61-
6269
final Object inputEntryValue = inputEntryExpressionEvaluator.evaluateEntry(inputEntry.getExpression(), evaluationContext);
6370

64-
final boolean result;
65-
66-
if (!ValueType.BOOLEAN.equals(input.getType())) {
67-
if (inputEntryValue.equals(Boolean.TRUE)) {
68-
result = true;
69-
} else if (inputEntryValue.equals(Boolean.FALSE)) {
70-
result = false;
71+
final SpecifiedTypeValue<?> typedInputEntryValue;
72+
if (isBoolean(inputEntryValue)) {
73+
final TypeConverter booleanTypeConverter;
74+
if (ValueType.BOOLEAN == input.getType()) {
75+
booleanTypeConverter = typeConverter;
7176
} else {
72-
final SpecifiedTypeValue<?> typedInputEntryValue = typeConverter.convert(inputEntryValue);
73-
result = objectsComparator.isInputEntryValueEqualInputValue(typedInputEntryValue, typedInputValue);
77+
booleanTypeConverter = typeConverterFactory.getInstance(ValueType.BOOLEAN);
7478
}
79+
80+
typedInputEntryValue = booleanTypeConverter.convert(inputEntryValue);
7581
} else {
76-
final SpecifiedTypeValue<?> typedInputEntryValue = typeConverter.convert(inputEntryValue);
77-
result = objectsComparator.isInputEntryValueEqualInputValue(typedInputEntryValue, typedInputValue);
82+
typedInputEntryValue = typeConverter.convert(inputEntryValue);
7883
}
7984

85+
final EvaluationMode evaluationMode = inputEntry.getEvaluationMode();
86+
final EvaluationModeProvider evaluationModeProvider = evaluationModeProviderFactory.getInstance(evaluationMode);
87+
final boolean result = evaluationModeProvider.isPositive(input.getType(), typedInputEntryValue, typedInputValue);
88+
8089
log.debug("Evaluated input entry result: {}", result);
8190

8291
return result;
8392
}
8493

94+
private boolean isBoolean(final Object value) {
95+
return Boolean.TRUE.equals(value) || Boolean.FALSE.equals(value);
96+
}
97+
8598
private boolean isInputEvaluated(final Input input, final EvaluationContext evaluationContext) {
8699
return evaluationContext.isPresent(input.getName());
87100
}

src/main/java/org/powerflows/dmn/engine/evaluator/entry/OutputEntryEvaluator.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,33 @@
1919

2020
import lombok.extern.slf4j.Slf4j;
2121
import org.powerflows.dmn.engine.evaluator.context.EvaluationContext;
22-
import org.powerflows.dmn.engine.evaluator.expression.provider.EvaluationProviderFactory;
22+
import org.powerflows.dmn.engine.evaluator.expression.provider.ExpressionEvaluationProviderFactory;
2323
import org.powerflows.dmn.engine.evaluator.expression.provider.ExpressionEvaluationProvider;
2424
import org.powerflows.dmn.engine.evaluator.type.converter.TypeConverter;
2525
import org.powerflows.dmn.engine.evaluator.type.converter.TypeConverterFactory;
2626
import org.powerflows.dmn.engine.model.decision.field.Output;
2727
import org.powerflows.dmn.engine.model.decision.rule.entry.OutputEntry;
2828
import org.powerflows.dmn.engine.model.evaluation.result.EntryResult;
2929

30+
import java.io.Serializable;
31+
3032
@Slf4j
3133
public class OutputEntryEvaluator {
3234

33-
private final EvaluationProviderFactory evaluationProviderFactory;
35+
private final ExpressionEvaluationProviderFactory expressionEvaluationProviderFactory;
3436
private final TypeConverterFactory typeConverterFactory;
3537

36-
public OutputEntryEvaluator(EvaluationProviderFactory evaluationProviderFactory,
38+
public OutputEntryEvaluator(ExpressionEvaluationProviderFactory expressionEvaluationProviderFactory,
3739
final TypeConverterFactory typeConverterFactory) {
38-
this.evaluationProviderFactory = evaluationProviderFactory;
40+
this.expressionEvaluationProviderFactory = expressionEvaluationProviderFactory;
3941
this.typeConverterFactory = typeConverterFactory;
4042
}
4143

4244
public EntryResult evaluate(final OutputEntry outputEntry, final Output output, final EvaluationContext evaluationContext) {
43-
final ExpressionEvaluationProvider expressionEvaluator = evaluationProviderFactory.getInstance(outputEntry.getExpression().getType());
45+
final ExpressionEvaluationProvider expressionEvaluator = expressionEvaluationProviderFactory.getInstance(outputEntry.getExpression().getType());
4446
final TypeConverter typeConverter = typeConverterFactory.getInstance(output.getType());
4547

46-
final Object outputEntryValue = expressionEvaluator.evaluateEntry(outputEntry.getExpression(), evaluationContext);
48+
final Serializable outputEntryValue = expressionEvaluator.evaluateEntry(outputEntry.getExpression(), evaluationContext);
4749

4850
//Needed for the output entry value validation.
4951
//Correct build means the output entry value has a type compatible with the output definition.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (c) 2018-present PowerFlows.org - all rights reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.powerflows.dmn.engine.evaluator.entry.mode.provider;
18+
19+
import org.powerflows.dmn.engine.evaluator.type.value.SpecifiedTypeValue;
20+
import org.powerflows.dmn.engine.model.decision.field.ValueType;
21+
22+
class BooleanEvaluationModeProvider implements EvaluationModeProvider {
23+
24+
@Override
25+
public <T, P> boolean isPositive(final ValueType inputType, final SpecifiedTypeValue<T> inputEntryValue, final SpecifiedTypeValue<P> inputValue) {
26+
if (inputEntryValue == null) {
27+
throw new NullPointerException("Input entry value can not be null");
28+
}
29+
30+
return inputEntryValue.isSingleValue() && Boolean.TRUE.equals(inputEntryValue.getValue());
31+
}
32+
}

src/main/java/org/powerflows/dmn/engine/evaluator/expression/comparator/ObjectsComparator.java renamed to src/main/java/org/powerflows/dmn/engine/evaluator/entry/mode/provider/EvaluationModeProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.powerflows.dmn.engine.evaluator.expression.comparator;
17+
package org.powerflows.dmn.engine.evaluator.entry.mode.provider;
1818

1919
import org.powerflows.dmn.engine.evaluator.type.value.SpecifiedTypeValue;
20+
import org.powerflows.dmn.engine.model.decision.field.ValueType;
2021

21-
public interface ObjectsComparator {
22+
public interface EvaluationModeProvider {
2223

23-
<T, P> boolean isInputEntryValueEqualInputValue(final SpecifiedTypeValue<T> inputEntryValue, final SpecifiedTypeValue<P> inputValue);
24+
<T, P> boolean isPositive(ValueType inputType, SpecifiedTypeValue<T> inputEntryValue, SpecifiedTypeValue<P> inputValue);
2425
}

0 commit comments

Comments
 (0)