Skip to content

Commit 7450445

Browse files
committed
Correctly handle unbound variables in SHACL SPARQLConstraints
1 parent 305d6b0 commit 7450445

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed

core/sds-aspect-model-validator/src/main/java/io/openmanufacturing/sds/aspectmodel/shacl/constraint/SparqlConstraint.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ public List<Violation> apply( final RDFNode rdfNode, final EvaluationContext con
5151
final ResultSet resultSet = queryExecution.execSelect();
5252
while ( resultSet.hasNext() ) {
5353
final QuerySolution solution = resultSet.next();
54-
final Map<String, RDFNode> bindings = resultSet.getResultVars().stream().collect( Collectors.toMap( Function.identity(), solution::get ) );
54+
final Map<String, RDFNode> bindings = resultSet.getResultVars().stream()
55+
.filter( resultVar -> solution.get( resultVar ) != null )
56+
.collect( Collectors.toMap( Function.identity(), solution::get ) );
5557
results.add( new SparqlConstraintViolation( context, message, bindings ) );
5658
}
5759
}

core/sds-aspect-model-validator/src/test/java/io/openmanufacturing/sds/aspectmodel/validation/services/AspectModelValidatorTest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package io.openmanufacturing.sds.aspectmodel.validation.services;
1515

1616
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.assertj.core.api.Assertions.assertThatCode;
1718

1819
import java.util.ArrayList;
1920
import java.util.Arrays;
@@ -98,9 +99,11 @@ public void testValidateProperty( final TestProperty testProperty ) {
9899
@ParameterizedTest
99100
@MethodSource( "invalidTestModels" )
100101
public void testValidateInvalidTestAspectModel( final InvalidTestAspect testModel, final KnownVersion metaModelVersion ) {
101-
final Try<VersionedModel> invalidAspectModel = TestResources.getModel( testModel, metaModelVersion );
102-
final List<Violation> violations = service.get( metaModelVersion ).validateModel( invalidAspectModel );
103-
assertThat( violations ).isNotEmpty();
102+
assertThatCode( () -> {
103+
final Try<VersionedModel> invalidAspectModel = TestResources.getModel( testModel, metaModelVersion );
104+
final List<Violation> violations = service.get( metaModelVersion ).validateModel( invalidAspectModel );
105+
assertThat( violations ).isNotEmpty();
106+
} ).doesNotThrowAnyException();
104107
}
105108

106109
@ParameterizedTest

core/sds-test-aspect-models/src/main/java/io/openmanufacturing/sds/test/InvalidTestAspect.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public enum InvalidTestAspect implements TestModel {
2525
INVALID_SYNTAX,
2626
MISSING_ASPECT_DECLARATION,
2727
INVALID_EXAMPLE_VALUE_DATATYPE,
28-
INVALID_PREFERRED_NAME_DATATYPE;
28+
INVALID_PREFERRED_NAME_DATATYPE,
29+
RANGE_CONSTRAINT_WITH_WRONG_TYPE;
2930

3031
@Override
3132
public String getName() {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
@prefix bamm: <urn:bamm:io.openmanufacturing:meta-model:2.0.0#>.
2+
@prefix bamm-c: <urn:bamm:io.openmanufacturing:characteristic:2.0.0#>.
3+
@prefix bamm-e: <urn:bamm:io.openmanufacturing:entity:2.0.0#>.
4+
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
5+
@prefix : <urn:bamm:io.openmanufacturing.test:1.0.0#>.
6+
7+
:NumberTrait a bamm-c:Trait ;
8+
bamm-c:baseCharacteristic :NumberList;
9+
bamm-c:constraint :RangeConstraintWithWrongType .
10+
11+
:RangeConstraintWithWrongType a bamm-c:RangeConstraint;
12+
bamm-c:minValue "5"^^xsd:nonNegativeInteger ;
13+
bamm-c:maxValue "10"^^xsd:nonNegativeInteger .
14+
15+
:NumberList a bamm-c:List ;
16+
bamm:dataType xsd:float .

0 commit comments

Comments
 (0)