use of org.apache.jena.shex.expressions.ShapeExpression in project jena by apache.
the class ShapeEvalTripleConstraint method matchesCardinalityTC.
/**
* Triple Constraint, with cardinality
*/
static boolean matchesCardinalityTC(ValidationContext vCxt, Set<Triple> matchables, Node node, TripleConstraint tripleConstraint, Set<Node> extras) {
Node predicate = tripleConstraint.getPredicate();
if (tripleConstraint.reverse()) {
// [shex] A bit of a fudge.
matchables = G.find(vCxt.getData(), null, predicate, node).toSet();
} else {
if (!matchables.stream().allMatch(t -> predicate.equals(t.getPredicate()))) {
// Other predicates present.
return false;
}
}
// Find same predicate.
Set<Triple> triples = StreamOps.toSet(matchables.stream().filter(t -> predicate.equals(t.getPredicate())));
int min = tripleConstraint.min();
int max = tripleConstraint.max();
ShapeExpression shExpr = tripleConstraint.getShapeExpression();
Set<Triple> positive = triples.stream().filter(t -> {
Node v = tripleConstraint.reverse() ? t.getSubject() : t.getObject();
return shExpr.satisfies(vCxt, v);
}).collect(Collectors.toSet());
int N = positive.size();
if (min >= 0 && N < min) {
vCxt.reportEntry(new ReportItem("Cardinality violation (min=" + min + "): " + N, null));
return false;
}
// Remove extras.
if (extras == null || !extras.contains(predicate)) {
if (positive.size() != triples.size())
// Something did not match.
return false;
}
if (max >= 0 && N > max) {
vCxt.reportEntry(new ReportItem("Cardinality violation (max=" + max + "): " + N, null));
return false;
}
return true;
}
Aggregations