Skip to content

Commit 79496bb

Browse files
committed
GH-5027 improve logging in the ShaclSail
1 parent b2ddfa0 commit 79496bb

7 files changed

Lines changed: 110 additions & 19 deletions

File tree

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/AbstractPairwisePlanNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,16 @@
3636
import org.eclipse.rdf4j.sail.shacl.ast.paths.Path;
3737
import org.eclipse.rdf4j.sail.shacl.ast.paths.SimplePath;
3838
import org.eclipse.rdf4j.sail.shacl.results.ValidationResult;
39+
import org.slf4j.Logger;
40+
import org.slf4j.LoggerFactory;
3941

4042
/**
4143
* @author Håvard Ottestad
4244
*/
4345
abstract class AbstractPairwisePlanNode implements PlanNode {
4446

47+
private static final Logger logger = LoggerFactory.getLogger(AbstractPairwisePlanNode.class);
48+
4549
private final SailConnection connection;
4650
private final Resource[] dataGraph;
4751
private final IRI predicate;

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/DatatypeFilter.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@
1717
import org.eclipse.rdf4j.model.Literal;
1818
import org.eclipse.rdf4j.model.base.CoreDatatype;
1919
import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil;
20+
import org.slf4j.Logger;
21+
import org.slf4j.LoggerFactory;
2022

2123
/**
2224
* @author Håvard Ottestad
2325
*/
2426
public class DatatypeFilter extends FilterPlanNode {
2527

28+
private static final Logger logger = LoggerFactory.getLogger(DatatypeFilter.class);
29+
2630
private final IRI datatype;
2731
private final CoreDatatype.XSD xsdDatatype;
2832
private StackTraceElement[] stackTrace;
@@ -37,17 +41,41 @@ public DatatypeFilter(PlanNode parent, IRI datatype) {
3741
@Override
3842
boolean checkTuple(Reference t) {
3943
if (!(t.get().getValue().isLiteral())) {
44+
logger.debug("Tuple rejected because it's not a literal. Tuple: {}", t);
4045
return false;
4146
}
4247

4348
Literal literal = (Literal) t.get().getValue();
4449
if (xsdDatatype != null) {
4550
if (literal.getCoreDatatype() == xsdDatatype) {
46-
return XMLDatatypeUtil.isValidValue(literal.stringValue(), xsdDatatype);
51+
boolean isValid = XMLDatatypeUtil.isValidValue(literal.stringValue(), xsdDatatype);
52+
if (isValid) {
53+
logger.trace(
54+
"Tuple accepted because its literal value is valid according to the rules for the datatype in the XSD spec. Actual datatype: {}, Expected datatype: {}, Tuple: {}",
55+
literal.getDatatype(), xsdDatatype, t);
56+
} else {
57+
logger.debug(
58+
"Tuple rejected because its literal value is invalid according to the rules for the datatype in the XSD spec. Actual datatype: {}, Expected datatype: {}, Tuple: {}",
59+
literal.getDatatype(), xsdDatatype, t);
60+
}
61+
return isValid;
4762
}
63+
logger.debug(
64+
"Tuple rejected because literal's core datatype is not the expected datatype. Actual datatype: {}, Expected datatype: {}, Tuple: {}",
65+
literal.getDatatype(), xsdDatatype, t);
4866
return false;
4967
} else {
50-
return literal.getDatatype() == datatype || literal.getDatatype().equals(datatype);
68+
boolean isEqual = literal.getDatatype() == datatype || literal.getDatatype().equals(datatype);
69+
if (isEqual) {
70+
logger.trace(
71+
"Tuple accepted because literal's datatype is equal to the expected datatype. Actual datatype: {}, Expected datatype: {}, Tuple: {}",
72+
literal.getDatatype(), datatype, t);
73+
} else {
74+
logger.debug(
75+
"Tuple rejected because literal's datatype is not equal to the expected datatype. Actual datatype: {}, Expected datatype: {}, Tuple: {}",
76+
literal.getDatatype(), datatype, t);
77+
}
78+
return isEqual;
5179
}
5280
}
5381

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/ExternalFilterByQuery.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,13 @@ boolean checkTuple(Reference t) {
9191
t.set(map.apply(t.get(), bindingSet.next()));
9292
} while (bindingSet.hasNext());
9393
}
94+
logger.trace("Tuple accepted because it matches the external query. Value: {}, Query: {}, Tuple: {}",
95+
value, queryString, t);
9496
return true;
9597
}
9698
}
97-
99+
logger.debug("Tuple rejected because it does not match the external query. Value: {}, Query: {}, Tuple: {}",
100+
value, queryString, t);
98101
return false;
99102

100103
}

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/GroupByCountFilter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616

1717
import org.apache.commons.text.StringEscapeUtils;
1818
import org.eclipse.rdf4j.common.iteration.CloseableIteration;
19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
1921

2022
/**
2123
* @author Håvard Ottestad
2224
*/
2325
public class GroupByCountFilter implements PlanNode {
2426

27+
private static final Logger logger = LoggerFactory.getLogger(GroupByCountFilter.class);
28+
2529
private final Function<Long, Boolean> filter;
2630
PlanNode parent;
2731
private boolean printed = false;
@@ -74,7 +78,13 @@ private void calculateNext() {
7478
}
7579

7680
if (!filter.apply(count)) {
81+
logger.debug(
82+
"Tuple rejected because its count does not pass the filter. Actual count: {}, Tuple: {}",
83+
count, this.next);
7784
this.next = null;
85+
} else {
86+
logger.trace("Tuple accepted because its count passes the filter. Actual count: {}, Tuple: {}",
87+
count, this.next);
7888
}
7989
}
8090

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/LanguageInFilter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@
1919

2020
import org.eclipse.rdf4j.model.Literal;
2121
import org.eclipse.rdf4j.model.util.Literals;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
2224

2325
/**
2426
* @author Håvard Ottestad
2527
*/
2628
public class LanguageInFilter extends FilterPlanNode {
2729

30+
private static final Logger logger = LoggerFactory.getLogger(LanguageInFilter.class);
31+
2832
private final List<String> languageRanges;
2933
private final Set<String> lowerCaseLanguageIn;
3034

@@ -37,17 +41,22 @@ public LanguageInFilter(PlanNode parent, Set<String> lowerCaseLanguageIn, List<S
3741
@Override
3842
boolean checkTuple(Reference t) {
3943
if (!(t.get().getValue().isLiteral())) {
44+
logger.debug("Tuple rejected because it's not a literal. Tuple: {}", t);
4045
return false;
4146
}
4247

4348
Optional<String> language = ((Literal) t.get().getValue()).getLanguage();
44-
if (!language.isPresent()) {
49+
if (language.isEmpty()) {
50+
logger.debug("Tuple rejected because it does not have a language tag. Tuple: {}", t);
4551
return false;
4652
}
4753

4854
// early matching
4955
boolean languageMatches = language.map(String::toLowerCase).filter(lowerCaseLanguageIn::contains).isPresent();
5056
if (languageMatches) {
57+
logger.trace(
58+
"Tuple accepted because its language tag (toLowerCase()) is in the language set. Actual language: {}, Language set: {}, Tuple: {}",
59+
language.get(), lowerCaseLanguageIn, t);
5160
return true;
5261
}
5362

@@ -56,6 +65,9 @@ boolean checkTuple(Reference t) {
5665

5766
for (String languageRange : languageRanges) {
5867
if (Literals.langMatches(langTag, languageRange)) {
68+
logger.trace(
69+
"Tuple accepted because its language tag matches the language range (BCP47). Actual language: {}, Language range: {}, Tuple: {}",
70+
langTag, languageRange, t);
5971
return true;
6072
}
6173
}

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/NodeKindFilter.java

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@
1515

1616
import org.eclipse.rdf4j.model.Value;
1717
import org.eclipse.rdf4j.sail.shacl.ast.constraintcomponents.NodeKindConstraintComponent;
18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
1820

1921
/**
2022
* @author Håvard Ottestad
2123
*/
2224
public class NodeKindFilter extends FilterPlanNode {
2325

26+
private static final Logger logger = LoggerFactory.getLogger(NodeKindFilter.class);
27+
2428
private final NodeKindConstraintComponent.NodeKind nodeKind;
2529

2630
public NodeKindFilter(PlanNode parent, NodeKindConstraintComponent.NodeKind nodeKind) {
@@ -32,28 +36,48 @@ public NodeKindFilter(PlanNode parent, NodeKindConstraintComponent.NodeKind node
3236
boolean checkTuple(Reference t) {
3337

3438
Value value = t.get().getValue();
35-
/*
36-
* BlankNode(SHACL.BLANK_NODE), IRI(SHACL.IRI), Literal(SHACL.LITERAL), BlankNodeOrIRI(SHACL.BLANK_NODE_OR_IRI),
37-
* BlankNodeOrLiteral(SHACL.BLANK_NODE_OR_LITERAL), IRIOrLiteral(SHACL.IRI_OR_LITERAL),
38-
*/
3939

4040
switch (nodeKind) {
4141
case IRI:
42-
return value.isIRI();
42+
if (value.isIRI()) {
43+
logger.trace("Tuple accepted because its value is an IRI. Tuple: {}", t);
44+
return true;
45+
}
46+
break;
4347
case Literal:
44-
return value.isLiteral();
48+
if (value.isLiteral()) {
49+
logger.trace("Tuple accepted because its value is a Literal. Tuple: {}", t);
50+
return true;
51+
}
52+
break;
4553
case BlankNode:
46-
return value.isBNode();
54+
if (value.isBNode()) {
55+
logger.trace("Tuple accepted because its value is a BlankNode. Tuple: {}", t);
56+
return true;
57+
}
58+
break;
4759
case IRIOrLiteral:
48-
return value.isIRI() || value.isLiteral();
60+
if (value.isIRI() || value.isLiteral()) {
61+
logger.trace("Tuple accepted because its value is an IRI or Literal. Tuple: {}", t);
62+
return true;
63+
}
64+
break;
4965
case BlankNodeOrIRI:
50-
return value.isBNode() || value.isIRI();
66+
if (value.isBNode() || value.isIRI()) {
67+
logger.trace("Tuple accepted because its value is a BlankNode or IRI. Tuple: {}", t);
68+
return true;
69+
}
70+
break;
5171
case BlankNodeOrLiteral:
52-
return value.isBNode() || value.isLiteral();
72+
if (value.isBNode() || value.isLiteral()) {
73+
logger.trace("Tuple accepted because its value is a BlankNode or Literal. Tuple: {}", t);
74+
return true;
75+
}
76+
break;
5377
}
5478

55-
throw new IllegalStateException("Unknown nodeKind");
56-
79+
logger.debug("Tuple rejected because its value does not match the expected node kind. Tuple: {}", t);
80+
return false;
5781
}
5882

5983
@Override

core/sail/shacl/src/main/java/org/eclipse/rdf4j/sail/shacl/ast/planNodes/PatternFilter.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,55 +15,65 @@
1515
import java.util.regex.Pattern;
1616

1717
import org.eclipse.rdf4j.model.Value;
18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
1820

1921
/**
2022
* @author Håvard Ottestad
2123
*/
2224
public class PatternFilter extends FilterPlanNode {
2325

26+
private static final Logger logger = LoggerFactory.getLogger(PatternFilter.class);
27+
2428
private final Pattern pattern;
2529

2630
public PatternFilter(PlanNode parent, String pattern, String flags) {
2731
super(parent);
2832
if (flags != null && !flags.isEmpty()) {
29-
3033
int flag = 0b0;
3134

3235
if (flags.contains("i")) {
3336
flag = flag | Pattern.CASE_INSENSITIVE;
37+
logger.trace("PatternFilter constructed with case insensitive flag");
3438
}
3539

3640
if (flags.contains("d")) {
3741
flag = flag | Pattern.UNIX_LINES;
42+
logger.trace("PatternFilter constructed with UNIX lines flag");
3843
}
3944

4045
if (flags.contains("m")) {
4146
flag = flag | Pattern.MULTILINE;
47+
logger.trace("PatternFilter constructed with multiline flag");
4248
}
4349

4450
if (flags.contains("s")) {
4551
flag = flag | Pattern.DOTALL;
52+
logger.trace("PatternFilter constructed with dotall flag");
4653
}
4754

4855
if (flags.contains("u")) {
4956
flag = flag | Pattern.UNICODE_CASE;
57+
logger.trace("PatternFilter constructed with unicode case flag");
5058
}
5159

5260
if (flags.contains("x")) {
5361
flag = flag | Pattern.COMMENTS;
62+
logger.trace("PatternFilter constructed with comments flag");
5463
}
5564

5665
if (flags.contains("U")) {
5766
flag = flag | Pattern.UNICODE_CHARACTER_CLASS;
67+
logger.trace("PatternFilter constructed with unicode character class flag");
5868
}
5969

6070
this.pattern = Pattern.compile(pattern, flag);
71+
logger.trace("PatternFilter constructed with pattern: {} and flags: {}", pattern, flags);
6172

6273
} else {
6374
this.pattern = Pattern.compile(pattern);
64-
75+
logger.trace("PatternFilter constructed with pattern: {} and no flags", pattern);
6576
}
66-
6777
}
6878

6979
@Override

0 commit comments

Comments
 (0)