Skip to content
Snippets Groups Projects
Commit 94afea74 authored by Jonas Blatt's avatar Jonas Blatt :ant:
Browse files

Merge branch 'feature/verifieractions' into documentation/verifier

parents 8ab39e6c f2b9877c
No related branches found
No related tags found
No related merge requests found
Showing
with 208 additions and 30 deletions
......@@ -48,7 +48,7 @@ public class CheckStringSubsumes extends AbstractBoundaryCheck<StringBoundary> {
if (b1.matchesAny() && !b2.matchesAny()) {
return true;
}
if (b2.matchesAny()) {
if (b2.matchesAny() || !b1.matchesNoneOfValues() && b2.matchesNoneOfValues()) {
return false;
}
int[] b1h = b1.getValuesHashes();
......
......@@ -95,6 +95,10 @@ public class VerificationFix {
return this;
}
public Builder withFixName(String fixName) {
return withFixName(new Name(Validate.notNull(fixName)));
}
public Builder addAction(Action action) {
value.actions.add(Validate.notNull(action));
return this;
......
......@@ -14,6 +14,10 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnValue;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.IdenticalRuleVerification;
......@@ -48,13 +52,39 @@ public class IdenticalRuleVerifier extends AbstractVerifier {
int i,
List<VDmnRule> currentRules) {
if (i == inputs.size()) {
boolean sameConclusions = VDmnFunctions.sameConclusions(currentRules);
currentRules.forEach(
rule -> vreFactory.addElement(VerificationResultEntryElement.create(rule)));
vreFactory.addVerificationFix(SHOW_RULES);
vreFactory.addToEntry(
VerificationClassification.WARNING,
templateDecision(dmnDecisionTable.getVDmnDecision()) + "Rules %s have identical inputs.",
getRulesRowsStrings(currentRules));
// Delete action, if output is the same
if (sameConclusions) {
VerificationFix.Builder verificationFixBuilder =
VerificationFix.getBuilder().withFixName("Delete Duplicates");
Action.Builder actionBuilder =
Action.getBuilder().withActionScope(ActionScope.RULE).withActionType(ActionType.DELETE);
boolean first = true;
for (VDmnRule rule : currentRules) {
if (!first) {
verificationFixBuilder.addAction(
Action.getBuilder()
.withActionScope(ActionScope.RULE)
.withActionType(ActionType.DELETE)
.addIdValue(rule.getVDmnDecision().getDecisionId())
.addIdValue(rule.getRuleId())
.build());
}
first = false;
}
vreFactory.addVerificationFix(verificationFixBuilder.build());
}
// Show action
vreFactory
.addVerificationFix(SHOW_RULES)
.addToEntry(
VerificationClassification.WARNING,
templateDecision(dmnDecisionTable.getVDmnDecision())
+ "Rules %s have identical inputs. The output is "
+ (sameConclusions ? "the same." : "the same."),
getRulesRowsStrings(currentRules));
} else {
List<VDmnInputValue> curInVals = new ArrayList<>();
List<VDmnInputValue> sortInVals =
......
package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.templateDecisionColumn;
import static de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification.WARNING;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.OUTPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.RULE;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_INPUT_ENTRIES;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_OUTPUT_ENTRIES;
......@@ -12,8 +16,10 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnOutputValue;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnValue;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.PredefinedExistingValueVerification;
......@@ -76,13 +82,36 @@ public class PredefinedExistingValueVerifier extends AbstractVerifier {
}
private void addToResult(VDmnValue stringValue, String missingStringValue) {
vreFactory.addElement(VerificationResultEntryElement.create(stringValue));
vreFactory.addVerificationFix(
stringValue.isInputValue() ? SHOW_INPUT_ENTRIES : SHOW_OUTPUT_ENTRIES);
vreFactory.addToEntry(
VerificationClassification.WARNING,
templateDecisionColumn(stringValue.getVDmnColumn())
+ "String value \"%s\" was not found in the list of predefined values.",
missingStringValue);
vreFactory
.addElement(VerificationResultEntryElement.create(stringValue))
.addVerificationFix(stringValue.isInputValue() ? SHOW_INPUT_ENTRIES : SHOW_OUTPUT_ENTRIES)
.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Add predefined value \"" + missingStringValue + "\"")
.addAction(
Action.getBuilder()
.withActionType(ActionType.UPDATE)
.withActionScope(stringValue.isInputValue() ? INPUT_COLUMN : OUTPUT_COLUMN)
.addIdValue(stringValue.getDecisionId())
.addIdValue(stringValue.getVDmnColumn().getId())
.addValue("addPredVal", missingStringValue)
.build())
.build())
.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Delete rule " + stringValue.getVDmnRule().getRowNumber())
.addAction(
Action.getBuilder()
.withActionType(ActionType.DELETE)
.withActionScope(RULE)
.addIdValue(stringValue.getDecisionId())
.addIdValue(stringValue.getRuleId())
.build())
.build())
.addToEntry(
WARNING,
templateDecisionColumn(stringValue.getVDmnColumn())
+ "String value \"%s\" was not found in the list of predefined values.",
missingStringValue);
}
}
package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.INPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.OUTPUT_COLUMN;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope.RULE;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType.CREATE;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType.UPDATE;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_INPUT_COLUMNS;
import static de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix.SHOW_OUTPUT_COLUMNS;
......@@ -13,6 +18,8 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VTypeRef;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.PredefinedMissingValueVerification;
......@@ -82,9 +89,42 @@ public class PredefinedMissingValueVerifier extends AbstractVerifier {
}
private void addToResult(VDmnColumn stringColumn, Set<String> missingStringValues) {
vreFactory.addElement(VerificationResultEntryElement.create(stringColumn));
vreFactory.addVerificationFix(
stringColumn.isInputColumn() ? SHOW_INPUT_COLUMNS : SHOW_OUTPUT_COLUMNS);
// Add fixes for missing values: add rules
for (String value : missingStringValues) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("New rule with \"" + value + "\"")
.addAction(
Action.getBuilder()
.withActionScope(RULE)
.withActionType(CREATE)
.addIdValue(stringColumn.getVDmnDecision().getDecisionId())
.addValue(stringColumn.getColumnId().getValue(), "\"" + value + "\"")
.build())
.build());
}
// Add fixes for missing values: delete predefined value
for (String value : missingStringValues) {
vreFactory.addVerificationFix(
VerificationFix.getBuilder()
.withFixName("Delete predefined value \"" + value + "\"")
.addAction(
Action.getBuilder()
.withActionScope(stringColumn.isInputColumn() ? INPUT_COLUMN : OUTPUT_COLUMN)
.withActionType(UPDATE)
.addIdValue(stringColumn.getVDmnDecision().getDecisionId())
.addIdValue(stringColumn.getColumnId())
.addValue("delPredVal", value)
.build())
.build());
}
vreFactory
.addElement(VerificationResultEntryElement.create(stringColumn))
.addVerificationFix(
stringColumn.isInputColumn() ? SHOW_INPUT_COLUMNS : SHOW_OUTPUT_COLUMNS);
StringBuilder sb = new StringBuilder();
sb.append(VDmnFunctions.templateDecisionColumn(stringColumn));
sb.append(missingStringValues.size() > 1 ? "These string values are" : "This string value is");
......
......@@ -15,6 +15,10 @@ import de.unikoblenz.fgbks.core.dmn.domain.vdmn.VDmnValue;
import de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.VerificationClassification;
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.Action;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionScope;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.ActionType;
import de.unikoblenz.fgbks.core.dmn.verification.result.actions.VerificationFix;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.SubsumptionVerification;
......@@ -53,14 +57,34 @@ public class SubsumptionVerifier extends AbstractVerifier {
// add to rules to result
boolean differentConclusions = VDmnFunctions.differentConclusions(currentRules);
currentRules.forEach(
rule ->
vreFactory.addElement(
VerificationResultEntryElement.create(inColumns.get(0).getVDmnDecisionTable())
.withIdentifier(rule.getRuleId())));
vreFactory.addVerificationFix(SHOW_RULES);
vreFactory.addToEntry(
VerificationClassification.WARNING,
getMessageText(currentRules, currentRootSubsumptionElements, differentConclusions));
rule -> vreFactory.addElement(VerificationResultEntryElement.create(rule)));
if (!differentConclusions) {
VerificationFix.Builder verificationFixBuilder =
VerificationFix.getBuilder().withFixName("Delete subsumed Rules");
Action.Builder actionBuilder =
Action.getBuilder()
.withActionScope(ActionScope.RULE)
.withActionType(ActionType.DELETE);
for (VDmnRule rule : currentRules) {
if (!currentRootSubsumptionElements.contains(rule)) {
verificationFixBuilder.addAction(
Action.getBuilder()
.withActionScope(ActionScope.RULE)
.withActionType(ActionType.DELETE)
.addIdValue(rule.getVDmnDecision().getDecisionId())
.addIdValue(rule.getRuleId())
.build());
}
}
vreFactory.addVerificationFix(verificationFixBuilder.build());
}
// Action Show
vreFactory
.addVerificationFix(SHOW_RULES)
// Add to result
.addToEntry(
VerificationClassification.WARNING,
getMessageText(currentRules, currentRootSubsumptionElements, differentConclusions));
}
} else {
// get all input values from the current column, and filter with the prev. iteration
......
......@@ -17,7 +17,7 @@ public class PredefinedExistingValueVerification extends AbstractVerificationTyp
new Name("Predefined Existing Values"),
new Description(
"Detecting string values, "
+ "which are not defined in list of predefined values of the column."));
+ "which are not defined in the list of predefined values of the column."));
}
public static PredefinedExistingValueVerification getInstance() {
......
......@@ -72,7 +72,7 @@ TODO
- Verifier: [PredefinedExistingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java)
#### Description
Detecting string values, which are not defined in list of predefined values of the column.
Detecting string values, which are not defined in the list of predefined values of the column.
#### Algorithm
```
......
......@@ -197,7 +197,6 @@ function performVerificationFixCREATE(verificationEntry, fixAction) {
case 'INPUT_ENTRY':
case 'OUTPUT_ENTRY':
case 'OUTPUT_COLUMN':
case 'DECISION_TABLE':
case 'DECISION':
default:
alert("ACTION undefined: " + fixAction.actionType + ' -> '
......@@ -343,9 +342,13 @@ function performVerificationFixUPDATE(verificationEntry, fixAction) {
case 'DECISION':
updateDecision(verificationEntry, fixAction);
break;
case 'RULE':
case 'INPUT_COLUMN':
updateColumn(verificationEntry, fixAction, 'inputId');
break;
case 'OUTPUT_COLUMN':
updateColumn(verificationEntry, fixAction, 'outputId');
break;
case 'RULE':
case 'INPUT_ENTRY':
case 'OUTPUT_ENTRY':
default:
......@@ -396,6 +399,54 @@ function updateDecision(verificationEntry, fixAction) {
openViewWithId(verificationEntry.elements[0].identifier['definitionId']);
}
/**
*
* @param {VerificationEntry} verificationEntry
* @param {Action} fixAction
* @param {String} idName (inputId or outputId)
*/
function updateColumn(verificationEntry, fixAction, idName) {
openViewWithId(fixAction.actionValues['decisionId']);
let column = getSheetElementWithId(fixAction.actionValues[idName]);
if (column) {
if (fixAction.actionValues['name']) {
if (idName === 'outputId') {
column.businessObject.name = fixAction.actionValues['name'];
} else {
column.businessObject.inputExpression.text = fixAction.actionValues['name'];
}
}
if (fixAction.actionValues['addPredVal']
|| fixAction.actionValues['delPredVal']) {
let inputVals = [];
if (column.businessObject.inputValues) {
inputVals = column.businessObject.inputValues.text.split(",");
}
let value;
if (fixAction.actionValues['addPredVal']) {
value = fixAction.actionValues['addPredVal'];
} else if (fixAction.actionValues['delPredVal']) {
value = fixAction.actionValues['delPredVal'];
}
if (!value.startsWith('"')) {
value = '"' + value;
}
if (!value.endsWith('"')) {
value = value + '"';
}
if (fixAction.actionValues['addPredVal']) {
inputVals.push(value);
} else if (fixAction.actionValues['delPredVal']) {
var index = inputVals.indexOf(value);
if (index > -1) {
inputVals.splice(index, 1);
}
}
getCurrentModeler().editAllowedValues(column.businessObject, inputVals);
}
}
}
// get a rule:
/**
* Get a col by ID
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment