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

Merge branch 'develop' into 'master'

Develop

See merge request jonasblatt/ma-jonasblatt-dmn-verifier!36
parents fd973af3 8bd2f77d
No related branches found
No related tags found
No related merge requests found
Showing
with 214 additions and 61 deletions
package de.unikoblenz.fgbks.base.utils.boundary.bicreater; package de.unikoblenz.fgbks.base.utils.boundary.bicreater;
import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_EQUAL; import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_EQUAL;
import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_NOT_IN_CONTACT; import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.SUBSUMES;
import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary; import de.unikoblenz.fgbks.base.utils.boundary.impl.StringBoundary;
import java.util.Arrays; import java.util.Arrays;
...@@ -11,8 +11,11 @@ import java.util.Set; ...@@ -11,8 +11,11 @@ import java.util.Set;
/** /**
* The lower bound creator implementation of {@link BoundaryBiCreaterType#LOWER_BOUNDS} for {@link * The lower bound creator implementation of {@link BoundaryBiCreaterType#LOWER_BOUNDS} for {@link
* StringBoundary}. <br> The result is a new boundary with the lower bounds, or an empty optional, * StringBoundary}. <br>
* if the creation is not possible. <br> In: {@code b1: "a","b"; b2: "a"}<br> Out: {@code "b"} <br> * The result is a new boundary with the lower bounds, or an empty optional, if the creation is not
* possible. <br>
* In: {@code b1: "a"; b2: "a", "b"}<br>
* Out: {@code "b"} <br>
*/ */
public class BiCreaterStringLowerBounds extends AbstractBoundaryBiCreater<StringBoundary> { public class BiCreaterStringLowerBounds extends AbstractBoundaryBiCreater<StringBoundary> {
...@@ -38,17 +41,47 @@ public class BiCreaterStringLowerBounds extends AbstractBoundaryBiCreater<String ...@@ -38,17 +41,47 @@ public class BiCreaterStringLowerBounds extends AbstractBoundaryBiCreater<String
@Override @Override
public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) { public Optional<StringBoundary> create(StringBoundary b1, StringBoundary b2) {
if (b1.checkWith(IS_NOT_IN_CONTACT, b2) || b1.checkWith(IS_EQUAL, b2)) { if (b2.matchesAny()) {
return Optional.empty(); return Optional.empty();
} }
if (b1.matchesAny() || b1.matchesNoneOfValues()) { if (b1.matchesAny()) {
return Optional.of(
StringBoundary.getBuilder()
.matchesNoneOfValues(!b2.matchesNoneOfValues())
.addValues(b2.getValues())
.build());
}
if (b2.checkWith(IS_EQUAL, b1) || b2.checkWith(SUBSUMES, b1)) {
return Optional.empty();
}
if (b1.matchesNoneOfValues()) {
if (b2.matchesNoneOfValues()) {
Set<String> values = new HashSet<>(Arrays.asList(b2.getValues()));
values.removeAll(Arrays.asList(b1.getValues()));
if (values.size() == 0) {
return Optional.empty();
}
return Optional.of(StringBoundary.getBuilder().addValues(values).build());
} else {
return Optional.of(
StringBoundary.getBuilder()
.matchesNoneOfValues(true)
.addValues(b1.getValues())
.addValues(b2.getValues())
.build());
}
}
if (b2.matchesNoneOfValues()) {
return Optional.of( return Optional.of(
StringBoundary.getBuilder() StringBoundary.getBuilder()
.addValues(b1.getValues()) .addValues(b1.getValues())
.addValues(b2.getValues()) .addValues(b2.getValues())
.matchesNoneOfValues(!b2.matchesNoneOfValues())
.build()); .build());
} }
Set<String> values = new HashSet<>(Arrays.asList(b1.getValues())); Set<String> values = new HashSet<>(Arrays.asList(b1.getValues()));
values.removeAll(Arrays.asList(b2.getValues())); values.removeAll(Arrays.asList(b2.getValues()));
return Optional.of(StringBoundary.getBuilder().addValues(values).build()); return Optional.of(StringBoundary.getBuilder().addValues(values).build());
......
...@@ -57,8 +57,13 @@ import org.apache.commons.lang3.Validate; ...@@ -57,8 +57,13 @@ import org.apache.commons.lang3.Validate;
* StringBoundary#matchesNoneOfValues} returns true, which are not in the boundary. <br> * StringBoundary#matchesNoneOfValues} returns true, which are not in the boundary. <br>
* *
* <p>Only value "a": <br> * <p>Only value "a": <br>
* {@code "a"} <br> Value "a" or value "b": <br> {@code "a","b"} <br> Not value "a" and not value * {@code "a"} <br>
* "b": <br> {@code not("a","b")} <br> All values: <br> {@code (empty String)} * Value "a" or value "b": <br>
* {@code "a","b"} <br>
* Not value "a" and not value "b": <br>
* {@code not("a","b")} <br>
* All values: <br>
* {@code (empty String)}
*/ */
public class StringBoundary extends AbstractBoundary<String> { public class StringBoundary extends AbstractBoundary<String> {
...@@ -105,7 +110,21 @@ public class StringBoundary extends AbstractBoundary<String> { ...@@ -105,7 +110,21 @@ public class StringBoundary extends AbstractBoundary<String> {
@Override @Override
public int compareTo(Boundary o) { public int compareTo(Boundary o) {
return o.getText().compareTo(o.getText()); if (!(o instanceof StringBoundary)) {
return 0;
}
StringBoundary otherStringB = (StringBoundary) o;
if (matchesAny() || matchesNoneOfValues()) {
if (otherStringB.matchesAny() || otherStringB.matchesNoneOfValues()) {
return 0;
} else {
return -1;
}
}
if (otherStringB.matchesAny() || otherStringB.matchesNoneOfValues()) {
return 1;
}
return this.getValues()[0].compareTo(otherStringB.getValues()[0]);
} }
/** /**
...@@ -178,6 +197,7 @@ public class StringBoundary extends AbstractBoundary<String> { ...@@ -178,6 +197,7 @@ public class StringBoundary extends AbstractBoundary<String> {
} }
private void calcHashes() { private void calcHashes() {
Arrays.sort(values);
valuesHashes = new int[values.length]; valuesHashes = new int[values.length];
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
values[i] = values[i].replace('"', '\0').trim(); values[i] = values[i].replace('"', '\0').trim();
......
...@@ -16,14 +16,14 @@ import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry. ...@@ -16,14 +16,14 @@ import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntry.
import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement; import de.unikoblenz.fgbks.core.dmn.verification.result.VerificationResultEntryElement;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.AbstractVerifier; 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.DmnVerifier;
import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.IdenticalBusinessRuleVerification; import de.unikoblenz.fgbks.core.dmn.verification.verifier.types.IdenticalRuleVerification;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@DmnVerifier(verifierType = IdenticalBusinessRuleVerification.class) @DmnVerifier(verifierType = IdenticalRuleVerification.class)
public class IdenticalVerifier extends AbstractVerifier { public class IdenticalRuleVerifier extends AbstractVerifier {
@Override @Override
protected void doVerification() { protected void doVerification() {
...@@ -51,7 +51,7 @@ public class IdenticalVerifier extends AbstractVerifier { ...@@ -51,7 +51,7 @@ public class IdenticalVerifier extends AbstractVerifier {
vreFactory.addToEntry( vreFactory.addToEntry(
VerificationClassification.WARNING, VerificationClassification.WARNING,
templateDecision(dmnDecisionTable.getDmnDecision()) templateDecision(dmnDecisionTable.getDmnDecision())
+ "Rules %s have identical input.", + "Rules %s have identical inputs.",
getRulesRowsStrings(currentRules)); getRulesRowsStrings(currentRules));
} else { } else {
List<VDmnInputValue> curInVals = new ArrayList<>(); List<VDmnInputValue> curInVals = new ArrayList<>();
......
...@@ -2,6 +2,7 @@ package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl; ...@@ -2,6 +2,7 @@ package de.unikoblenz.fgbks.core.dmn.verification.verifier.impl;
import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.templateDecision; import static de.unikoblenz.fgbks.core.dmn.domain.vdmn.utils.VDmnFunctions.templateDecision;
import de.unikoblenz.fgbks.base.utils.UniqueIdGenerator;
import de.unikoblenz.fgbks.base.utils.boundary.Boundary; import de.unikoblenz.fgbks.base.utils.boundary.Boundary;
import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType;
import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType;
...@@ -155,7 +156,8 @@ public class MissingRuleVerifier extends AbstractVerifier { ...@@ -155,7 +156,8 @@ public class MissingRuleVerifier extends AbstractVerifier {
missingRule.setInputValue( missingRule.setInputValue(
i - 1, i - 1,
VDmnInputValueImpl.getBuilder() VDmnInputValueImpl.getBuilder()
.withInputEntryId(new InputEntryId("TODO")) // TODO .withInputEntryId(
new InputEntryId("Entry_" + Long.toString(UniqueIdGenerator.getNextId(), 16)))
.withText("") .withText("")
.withDmnInputColumn((VDmnInputColumn) missingRuleValue.getDmnColumn()) .withDmnInputColumn((VDmnInputColumn) missingRuleValue.getDmnColumn())
.withDmnRule(missingRule) .withDmnRule(missingRule)
...@@ -201,7 +203,7 @@ public class MissingRuleVerifier extends AbstractVerifier { ...@@ -201,7 +203,7 @@ public class MissingRuleVerifier extends AbstractVerifier {
Builder b = Builder b =
VDmnRuleImpl.getBuilder() VDmnRuleImpl.getBuilder()
.withRuleId(new RuleId("TODO")) // TODO .withRuleId(new RuleId("Rule_" + Long.toString(UniqueIdGenerator.getNextId(), 16)))
.withDmnDecisionTable(inputs.get(0).getDmnDecisionTable()) .withDmnDecisionTable(inputs.get(0).getDmnDecisionTable())
.withRowNumber(new RowNumber(INITIAL_ROW_NUMER)); .withRowNumber(new RowNumber(INITIAL_ROW_NUMER));
for (VDmnInputValue inputValue : missingRuleValues) { for (VDmnInputValue inputValue : missingRuleValues) {
...@@ -214,7 +216,8 @@ public class MissingRuleVerifier extends AbstractVerifier { ...@@ -214,7 +216,8 @@ public class MissingRuleVerifier extends AbstractVerifier {
copy.setInputValue( copy.setInputValue(
x, x,
VDmnInputValueImpl.getBuilder() VDmnInputValueImpl.getBuilder()
.withInputEntryId(new InputEntryId("TODO")) // TODO .withInputEntryId(
new InputEntryId("Entry_" + Long.toString(UniqueIdGenerator.getNextId(), 16)))
.withText("") .withText("")
.withDmnRule(copy) .withDmnRule(copy)
.withBoundary(x == i ? bi.get() : missingRuleValues.get(x).getBoundary()) .withBoundary(x == i ? bi.get() : missingRuleValues.get(x).getBoundary())
......
...@@ -15,7 +15,9 @@ public class DateVerification extends AbstractVerificationType { ...@@ -15,7 +15,9 @@ public class DateVerification extends AbstractVerificationType {
super( super(
new Name("DateFormatVerification"), new Name("DateFormatVerification"),
new Name("Date Format Check"), new Name("Date Format Check"),
new Description("test")); // TODO new Description(
"This verification checks the correctness of the date format for all date entries. "
+ "Each date should be in the format \"data and time(yyyy-MM-ddThH:mm:ss)\"."));
} }
public static DateVerification getInstance() { public static DateVerification getInstance() {
......
...@@ -15,7 +15,7 @@ public class EmptyOutputVerification extends AbstractVerificationType { ...@@ -15,7 +15,7 @@ public class EmptyOutputVerification extends AbstractVerificationType {
super( super(
new Name("EmptyOutputVerification"), new Name("EmptyOutputVerification"),
new Name("Empty Output"), new Name("Empty Output"),
new Description("test")); // TODO new Description("Detection rules with an empty output values."));
} }
public static EmptyOutputVerification getInstance() { public static EmptyOutputVerification getInstance() {
......
...@@ -15,7 +15,12 @@ public class EquivalentStringVerification extends AbstractVerificationType { ...@@ -15,7 +15,12 @@ public class EquivalentStringVerification extends AbstractVerificationType {
super( super(
new Name("EquivalentStringVerification"), new Name("EquivalentStringVerification"),
new Name("Equivalent Strings"), new Name("Equivalent Strings"),
new Description("test")); // TODO new Description(
"Detecting rules which are not identical, "
+ "but still semantically equivalent. "
+ "Here, the verifier checks if there exist multiple rules "
+ "which use synonyms as inputs and are therefore equivalent, "
+ "based on synonym relations via Wordnet."));
} }
public static EquivalentStringVerification getInstance() { public static EquivalentStringVerification getInstance() {
......
...@@ -7,16 +7,19 @@ import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.Decisio ...@@ -7,16 +7,19 @@ import de.unikoblenz.fgbks.core.dmn.verification.verifier.classification.Decisio
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@Type @Type
public class IdenticalBusinessRuleVerification extends AbstractVerificationType { public class IdenticalRuleVerification extends AbstractVerificationType {
private static final IdenticalBusinessRuleVerification instance = private static final IdenticalRuleVerification instance = new IdenticalRuleVerification();
new IdenticalBusinessRuleVerification();
private IdenticalBusinessRuleVerification() { private IdenticalRuleVerification() {
super(new Name("Identical Rules"), new Description("test")); // TODO super(
new Name("Identical Rules"),
new Description(
"Detecting rules which have an identical input, "
+ "i.e. are redundant."));
} }
public static IdenticalBusinessRuleVerification getInstance() { public static IdenticalRuleVerification getInstance() {
return instance; return instance;
} }
......
...@@ -15,7 +15,9 @@ public class InputValueSyntaxVerification extends AbstractVerificationType { ...@@ -15,7 +15,9 @@ public class InputValueSyntaxVerification extends AbstractVerificationType {
super( super(
new Name("InputValueSyntaxVerification"), new Name("InputValueSyntaxVerification"),
new Name("Input Value Syntax Check"), new Name("Input Value Syntax Check"),
new Description("Check values for syntactical correctness.")); new Description(
"This verification checks the correctness of the input formats for all input entries. "
+ "They should have no syntax errors. "));
} }
public static InputValueSyntaxVerification getInstance() { public static InputValueSyntaxVerification getInstance() {
......
...@@ -16,7 +16,8 @@ public class LonelyDataInputVerification extends AbstractVerificationType { ...@@ -16,7 +16,8 @@ public class LonelyDataInputVerification extends AbstractVerificationType {
new Name("LonelyDataInputVerification"), new Name("LonelyDataInputVerification"),
new Name("Lonely Data Input"), new Name("Lonely Data Input"),
new Description( new Description(
"Checks for any input data node, if it has no connection to at least one decision table.")); "Detection input data nodes,"
+ " which has no connection to at least one decision table."));
} }
public static LonelyDataInputVerification getInstance() { public static LonelyDataInputVerification getInstance() {
......
...@@ -16,7 +16,10 @@ public class MissingInputColumnVerification extends AbstractVerificationType { ...@@ -16,7 +16,10 @@ public class MissingInputColumnVerification extends AbstractVerificationType {
super( super(
new Name("MissingInputColumnVerification"), new Name("MissingInputColumnVerification"),
new Name("Missing Input Column"), new Name("Missing Input Column"),
new Description("todo")); // TODO new Description(
"Detecting for all decisions and input data nodes "
+ "if their output names are found in the corresponding input columns "
+ "of the connected decision."));
} }
public static MissingInputColumnVerification getInstance() { public static MissingInputColumnVerification getInstance() {
......
...@@ -9,15 +9,15 @@ import javax.validation.constraints.NotNull; ...@@ -9,15 +9,15 @@ import javax.validation.constraints.NotNull;
@Type @Type
public class MissingInputDataVerification extends AbstractVerificationType { public class MissingInputDataVerification extends AbstractVerificationType {
private static final MissingInputDataVerification instance = private static final MissingInputDataVerification instance = new MissingInputDataVerification();
new MissingInputDataVerification();
private MissingInputDataVerification() { private MissingInputDataVerification() {
super( super(
new Name("MissingInputDataVerification"), new Name("MissingInputDataVerification"),
new Name("Missing Input Data"), new Name("Missing Input Data"),
new Description( new Description(
"todo")); // TODO "Detecting columns which has no reference to either a input node "
+ "or a decision node with a corresponding output column."));
} }
public static MissingInputDataVerification getInstance() { public static MissingInputDataVerification getInstance() {
......
...@@ -15,7 +15,8 @@ public class MissingRuleVerification extends AbstractVerificationType { ...@@ -15,7 +15,8 @@ public class MissingRuleVerification extends AbstractVerificationType {
super( super(
new Name("MissingRuleVerification"), new Name("MissingRuleVerification"),
new Name("Missing Rule"), new Name("Missing Rule"),
new Description("test")); // TODO new Description("Detecting whether there are any missing business rules, "
+ "i.e. if there are rules missing for expected inputs."));
} }
public static MissingRuleVerification getInstance() { public static MissingRuleVerification getInstance() {
......
...@@ -15,7 +15,8 @@ public class OverlappingVerification extends AbstractVerificationType { ...@@ -15,7 +15,8 @@ public class OverlappingVerification extends AbstractVerificationType {
super( super(
new Name("OverlappingVerification"), new Name("OverlappingVerification"),
new Name("Overlapping Rules"), new Name("Overlapping Rules"),
new Description("test")); // TODO new Description("Detecting whether there are any overlaps in rule conditions. "
+ "This verifier does not show identical, overlaps or subsumptions."));
} }
public static OverlappingVerification getInstance() { public static OverlappingVerification getInstance() {
......
...@@ -15,7 +15,7 @@ public class PartialReductionVerification extends AbstractVerificationType { ...@@ -15,7 +15,7 @@ public class PartialReductionVerification extends AbstractVerificationType {
super( super(
new Name("PartialReductionVerification"), new Name("PartialReductionVerification"),
new Name("Partial Reductions"), new Name("Partial Reductions"),
new Description("test")); // TODO new Description("Checking whether ranges can be combined to simplify decision tables."));
} }
public static PartialReductionVerification getInstance() { public static PartialReductionVerification getInstance() {
......
...@@ -16,8 +16,8 @@ public class PredefinedExistingValueVerification extends AbstractVerificationTyp ...@@ -16,8 +16,8 @@ public class PredefinedExistingValueVerification extends AbstractVerificationTyp
new Name("PredefinedExistingValueVerification"), new Name("PredefinedExistingValueVerification"),
new Name("Predefined Existing Values"), new Name("Predefined Existing Values"),
new Description( new Description(
"Es gibt in einer Tabellen-Zelle einen String Value, der aber nicht in der Liste der " "Detecting string values, "
+ "Predefines Values vorgesehen ist.")); // TODO englisch + "which are not defined in list of predefined values of the column."));
} }
public static PredefinedExistingValueVerification getInstance() { public static PredefinedExistingValueVerification getInstance() {
......
...@@ -17,7 +17,8 @@ public class PredefinedMissingValueVerification extends AbstractVerificationType ...@@ -17,7 +17,8 @@ public class PredefinedMissingValueVerification extends AbstractVerificationType
new Name("PredefinedMissingValueVerification"), new Name("PredefinedMissingValueVerification"),
new Name("Predefined Missing Values"), new Name("Predefined Missing Values"),
new Description( new Description(
"Es gibt in einer Tabellen-Zelle predefines values, die jedoch nicht in der spalte vorhanden sind.")); // TODO englisch "Detecting predefined string values of a column, "
+ "which itself are not used in the column."));
} }
public static PredefinedMissingValueVerification getInstance() { public static PredefinedMissingValueVerification getInstance() {
......
...@@ -15,7 +15,11 @@ public class SubsumptionVerification extends AbstractVerificationType { ...@@ -15,7 +15,11 @@ public class SubsumptionVerification extends AbstractVerificationType {
super( super(
new Name("SubsumptionVerification"), new Name("SubsumptionVerification"),
new Name("Rule Subsumptions"), new Name("Rule Subsumptions"),
new Description("test")); // TODO new Description(
"Detecting individual rules which are subsumed by other rules,"
+ " i.e. they are not necessary."
+ " For example, rules containing wildcards often render more specific"
+ " rules unnecessary due to subsumption."));
} }
public static SubsumptionVerification getInstance() { public static SubsumptionVerification getInstance() {
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
- Verifier: [LonelyDataInputVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/LonelyDataInputVerifier.java) - Verifier: [LonelyDataInputVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/LonelyDataInputVerifier.java)
#### Description #### Description
Checks for any input data node, if it has **no** connection to at least one decision table. Detection input data nodes, which has no connection to at least one decision table.
#### Algorithm #### Algorithm
``` ```
...@@ -33,6 +33,7 @@ doVerification (Definition d) { ...@@ -33,6 +33,7 @@ doVerification (Definition d) {
- Verifier: [MissingInputDataVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java) - Verifier: [MissingInputDataVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputDataVerifier.java)
#### Description #### Description
Detecting columns which has no reference to either a input node or a decision node with a corresponding output column.
#### Algorithm #### Algorithm
``` ```
...@@ -44,6 +45,7 @@ TODO ...@@ -44,6 +45,7 @@ TODO
- Verifier: [MissingInputColumnVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputColumnVerifier.java) - Verifier: [MissingInputColumnVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingInputColumnVerifier.java)
#### Description #### Description
Detecting for all decisions and input data nodes if their output names are found in the corresponding input columns of the connected decision.
#### Algorithm #### Algorithm
``` ```
...@@ -58,7 +60,7 @@ TODO ...@@ -58,7 +60,7 @@ TODO
- Verifier: [PredefinedExistingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java) - Verifier: [PredefinedExistingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedExistingValueVerifier.java)
#### Description #### Description
TODO Detecting string values, which are not defined in list of predefined values of the column.
#### Algorithm #### Algorithm
``` ```
...@@ -70,7 +72,7 @@ TODO ...@@ -70,7 +72,7 @@ TODO
- Verifier: [PredefinedMissingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedMissingValueVerifier.java) - Verifier: [PredefinedMissingValueVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PredefinedMissingValueVerifier.java)
#### Description #### Description
TODO Detecting predefined string values of a column, which itself are not used in the column.
#### Algorithm #### Algorithm
``` ```
...@@ -82,7 +84,7 @@ TODO ...@@ -82,7 +84,7 @@ TODO
- Verifier: [EmptyOutputVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/EmptyOutputVerifier.java) - Verifier: [EmptyOutputVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/EmptyOutputVerifier.java)
#### Description #### Description
This verification checks if a output entry is empty. Detection rules with an empty output values."
#### Algorithm #### Algorithm
``` ```
...@@ -97,7 +99,7 @@ TODO ...@@ -97,7 +99,7 @@ TODO
- Verifier: [SubsumptionVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/SubsumptionVerifier.java) - Verifier: [SubsumptionVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/SubsumptionVerifier.java)
#### Description #### Description
TODO Detecting individual rules which are subsumed by other rules, i.e. they are not necessary. For example, rules containing wildcards often render more specific rules unnecessary due to subsumption.
#### Algorithm #### Algorithm
``` ```
...@@ -109,7 +111,7 @@ TODO ...@@ -109,7 +111,7 @@ TODO
- Verifier: [PartialReductionVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java) - Verifier: [PartialReductionVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java)
#### Description #### Description
TODO Checking whether ranges can be combined to simplify decision tables.
#### Algorithm #### Algorithm
``` ```
...@@ -121,7 +123,7 @@ TODO ...@@ -121,7 +123,7 @@ TODO
- Verifier: [OverlappingVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/OverlappingVerifier.java) - Verifier: [OverlappingVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/OverlappingVerifier.java)
#### Description #### Description
TODO Detecting whether there are any overlaps in rule conditions. This verifier does not show identical, overlaps or subsumptions.
#### Algorithm #### Algorithm
``` ```
...@@ -133,19 +135,19 @@ TODO ...@@ -133,19 +135,19 @@ TODO
- Verifier: [MissingRuleVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingRuleVerifier.java) - Verifier: [MissingRuleVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/MissingRuleVerifier.java)
#### Description #### Description
TODO Detecting whether there are any missing business rules, i.e. if there are rules missing for expected inputs.
#### Algorithm #### Algorithm
``` ```
TODO TODO
``` ```
### Identical Business Rule Verification ### Identical Rule Verification
- Type: [IdenticalBusinessRuleVerification](/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalBusinessRuleVerification.java) - Type: [IdenticalRuleVerification](/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/types/IdenticalRuleVerification.java)
- Verifier: [IdenticalVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/IdenticalVerifier.java) - Verifier: [IdenticalRuleVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/IdenticalRuleVerifier.java)
#### Description #### Description
TODO Detecting rules which have an identical input, i.e. are redundant.
#### Algorithm #### Algorithm
``` ```
...@@ -157,7 +159,7 @@ TODO ...@@ -157,7 +159,7 @@ TODO
- Verifier: [EquivalentVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/EquivalentVerifier.java) - Verifier: [EquivalentVerifier](src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/EquivalentVerifier.java)
#### Description #### Description
TODO Detecting rules which are not identical, but still semantically equivalent. Here, the verifier checks if there exist multiple rules which use synonyms as inputs and are therefore equivalent, based on synonym relations via Wordnet.
#### Algorithm #### Algorithm
``` ```
......
...@@ -18,6 +18,10 @@ h2 { ...@@ -18,6 +18,10 @@ h2 {
margin: 10px; margin: 10px;
} }
p {
margin: 5px;
}
.status-dot { .status-dot {
height: 15px; height: 15px;
width: 15px; width: 15px;
...@@ -52,6 +56,7 @@ select { ...@@ -52,6 +56,7 @@ select {
height: 35px; height: 35px;
outline: none; outline: none;
padding-left: 5px; padding-left: 5px;
min-width: 200px;
} }
select option { select option {
...@@ -70,6 +75,13 @@ select:focus::-ms-value { ...@@ -70,6 +75,13 @@ select:focus::-ms-value {
background-color: transparent; background-color: transparent;
} }
span.select2 {
display: table;
table-layout: fixed;
width: 25% !important;
min-width: 200px;
}
.clickable { .clickable {
box-shadow: 2px 2px 3px 2px rgba(0, 0, 0, .3); box-shadow: 2px 2px 3px 2px rgba(0, 0, 0, .3);
} }
...@@ -149,12 +161,19 @@ select:focus::-ms-value { ...@@ -149,12 +161,19 @@ select:focus::-ms-value {
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
align-items: flex-start; align-items: flex-start;
flex-wrap: wrap;
} }
#dmn-button-verify { #dmn-button-verify {
flex-grow: 1; flex-grow: 1;
max-width: 90px; max-width: 90px;
height: 35px; background: white;
border-radius: 2px;
}
#dmn-button-reload-verifier {
flex-grow: 1;
max-width: 120px;
background: white; background: white;
border-radius: 2px; border-radius: 2px;
} }
...@@ -162,6 +181,7 @@ select:focus::-ms-value { ...@@ -162,6 +181,7 @@ select:focus::-ms-value {
.dmn-verifier-header-item { .dmn-verifier-header-item {
margin: 8px 12px; margin: 8px 12px;
color: #0b3004; color: #0b3004;
min-height: 35px;
cursor: pointer; cursor: pointer;
font-family: 'Open Sans', sans-serif; font-family: 'Open Sans', sans-serif;
font-size: 13px; font-size: 13px;
...@@ -174,27 +194,79 @@ select:focus::-ms-value { ...@@ -174,27 +194,79 @@ select:focus::-ms-value {
#dmn-verifier-types { #dmn-verifier-types {
flex-grow: 1; flex-grow: 1;
max-width: 200px; max-width: 250px;
}
.verifier-type-name {
border-top: #0d82b7 2px;
border-top-style: dashed;
}
.verifier-type-description {
border-left: #0d82b7 5px;
border-left-style: solid;
}
.verifier-type-description > p {
max-width: 800px;
text-align: justify;
}
.verification-container {
display: flex;
flex-direction: row;
justify-content: stretch;
margin: 10px;
border-top: #0d82b7 2px;
border-top-style: ridge;
}
.dmn-verification-icon {
width: 32px;
height: 30px;
display: inline-block;
background-repeat: no-repeat;
background-size: contain;
background-position: center center;
} }
.dmn-ERROR { .dmn-ERROR {
list-style-image: url("img/ERROR.png"); background-image: url("img/ERROR.png");
} }
.dmn-WARNING { .dmn-WARNING {
list-style-image: url("img/WARNING.png"); background-image: url("img/WARNING.png");
} }
.dmn-FATAL_ERROR { .dmn-FATAL_ERROR {
list-style-image: url("img/FATAL_ERROR.png"); background-image: url("img/FATAL_ERROR.png");
} }
.dmn-INFO { .dmn-INFO {
list-style-image: url("img/INFO.png"); background-image: url("img/INFO.png");
} }
span.select2 { .verification-message {
display: table; padding-top: 8px;
table-layout: fixed; padding-left: 8px;
width: 25% !important; width: 100%;
flex-shrink: 1;
flex-basis: 65%;
}
.verification-container-fix-buttons {
float: right;
padding-top: 8px;
display: flex;
flex-direction: row;
flex-grow: 1;
justify-content: space-between;
flex-wrap: wrap;
}
.verification-fix-button {
height: 25px;
min-width: 100px;
margin: 2px 2px 2px 10px;
background: white;
} }
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