Add constraint checks for one-of and none-of constraints
This commit is contained in:
parent
3c181c9070
commit
48c2b90a93
@ -37,6 +37,7 @@ import org.openrefine.wikidata.qa.scrutinizers.NoEditsMadeScrutinizer;
|
|||||||
import org.openrefine.wikidata.qa.scrutinizers.QualifierCompatibilityScrutinizer;
|
import org.openrefine.wikidata.qa.scrutinizers.QualifierCompatibilityScrutinizer;
|
||||||
import org.openrefine.wikidata.qa.scrutinizers.QuantityScrutinizer;
|
import org.openrefine.wikidata.qa.scrutinizers.QuantityScrutinizer;
|
||||||
import org.openrefine.wikidata.qa.scrutinizers.RestrictedPositionScrutinizer;
|
import org.openrefine.wikidata.qa.scrutinizers.RestrictedPositionScrutinizer;
|
||||||
|
import org.openrefine.wikidata.qa.scrutinizers.RestrictedValuesScrutinizer;
|
||||||
import org.openrefine.wikidata.qa.scrutinizers.SelfReferentialScrutinizer;
|
import org.openrefine.wikidata.qa.scrutinizers.SelfReferentialScrutinizer;
|
||||||
import org.openrefine.wikidata.qa.scrutinizers.SingleValueScrutinizer;
|
import org.openrefine.wikidata.qa.scrutinizers.SingleValueScrutinizer;
|
||||||
import org.openrefine.wikidata.qa.scrutinizers.UnsourcedScrutinizer;
|
import org.openrefine.wikidata.qa.scrutinizers.UnsourcedScrutinizer;
|
||||||
@ -75,6 +76,7 @@ public class EditInspector {
|
|||||||
register(new NoEditsMadeScrutinizer());
|
register(new NoEditsMadeScrutinizer());
|
||||||
register(new WhitespaceScrutinizer());
|
register(new WhitespaceScrutinizer());
|
||||||
register(new QuantityScrutinizer());
|
register(new QuantityScrutinizer());
|
||||||
|
register(new RestrictedValuesScrutinizer());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
package org.openrefine.wikidata.qa.scrutinizers;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.openrefine.wikidata.qa.QAWarning;
|
||||||
|
import org.wikidata.wdtk.datamodel.interfaces.EntityIdValue;
|
||||||
|
import org.wikidata.wdtk.datamodel.interfaces.PropertyIdValue;
|
||||||
|
import org.wikidata.wdtk.datamodel.interfaces.Snak;
|
||||||
|
import org.wikidata.wdtk.datamodel.interfaces.Value;
|
||||||
|
|
||||||
|
|
||||||
|
public class RestrictedValuesScrutinizer extends SnakScrutinizer {
|
||||||
|
|
||||||
|
public static String type = "forbidden-value";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void scrutinize(Snak snak, EntityIdValue entityId, boolean added) {
|
||||||
|
PropertyIdValue pid = snak.getPropertyId();
|
||||||
|
Value value = snak.getValue();
|
||||||
|
|
||||||
|
Set<Value> allowedValues = _fetcher.allowedValues(pid);
|
||||||
|
Set<Value> disallowedValues = _fetcher.disallowedValues(pid);
|
||||||
|
if((allowedValues != null && !allowedValues.contains(value)) ||
|
||||||
|
(disallowedValues != null && disallowedValues.contains(value))) {
|
||||||
|
QAWarning issue = new QAWarning(type, pid.getId(), QAWarning.Severity.IMPORTANT, 1);
|
||||||
|
issue.setProperty("property_entity", pid);
|
||||||
|
issue.setProperty("example_value_entity", value);
|
||||||
|
issue.setProperty("example_subject_entity", entityId);
|
||||||
|
addIssue(issue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -45,9 +45,10 @@ public class MockConstraintFetcher implements ConstraintFetcher {
|
|||||||
public static PropertyIdValue qualifierPid = Datamodel.makeWikidataPropertyIdValue("P987");
|
public static PropertyIdValue qualifierPid = Datamodel.makeWikidataPropertyIdValue("P987");
|
||||||
public static PropertyIdValue referencePid = Datamodel.makeWikidataPropertyIdValue("P384");
|
public static PropertyIdValue referencePid = Datamodel.makeWikidataPropertyIdValue("P384");
|
||||||
|
|
||||||
public static PropertyIdValue restrictedValuesPid = Datamodel.makeWikidataPropertyIdValue("P8121");
|
public static PropertyIdValue allowedValuesPid = Datamodel.makeWikidataPropertyIdValue("P8121");
|
||||||
public static ItemIdValue particularValue1 = Datamodel.makeWikidataItemIdValue("Q389");
|
public static ItemIdValue allowedValueQid = Datamodel.makeWikidataItemIdValue("Q389");
|
||||||
public static ItemIdValue particularValue2 = Datamodel.makeWikidataItemIdValue("Q378");
|
public static PropertyIdValue forbiddenValuesPid = Datamodel.makeWikidataPropertyIdValue("P8141");
|
||||||
|
public static ItemIdValue forbiddenValueQid = Datamodel.makeWikidataItemIdValue("Q378");
|
||||||
|
|
||||||
public static PropertyIdValue allowedUnitsPid = Datamodel.makeWikidataPropertyIdValue("P34787");
|
public static PropertyIdValue allowedUnitsPid = Datamodel.makeWikidataPropertyIdValue("P34787");
|
||||||
public static ItemIdValue allowedUnit = Datamodel.makeWikidataItemIdValue("Q7887");
|
public static ItemIdValue allowedUnit = Datamodel.makeWikidataItemIdValue("Q7887");
|
||||||
@ -115,16 +116,16 @@ public class MockConstraintFetcher implements ConstraintFetcher {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Value> allowedValues(PropertyIdValue pid) {
|
public Set<Value> allowedValues(PropertyIdValue pid) {
|
||||||
if (restrictedValuesPid.equals(pid)) {
|
if (allowedValuesPid.equals(pid)) {
|
||||||
return Collections.singleton(particularValue1);
|
return Arrays.asList(allowedValueQid, null).stream().collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<Value> disallowedValues(PropertyIdValue pid) {
|
public Set<Value> disallowedValues(PropertyIdValue pid) {
|
||||||
if (restrictedValuesPid.equals(pid)) {
|
if (forbiddenValuesPid.equals(pid)) {
|
||||||
return Collections.singleton(particularValue2);
|
return Collections.singleton(forbiddenValueQid);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
package org.openrefine.wikidata.qa.scrutinizers;
|
||||||
|
|
||||||
|
import org.openrefine.wikidata.qa.MockConstraintFetcher;
|
||||||
|
import org.openrefine.wikidata.testing.TestingData;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
import org.wikidata.wdtk.datamodel.helpers.Datamodel;
|
||||||
|
import org.wikidata.wdtk.datamodel.interfaces.ItemIdValue;
|
||||||
|
|
||||||
|
public class RestrictedValuesScrutinizerTest extends SnakScrutinizerTest {
|
||||||
|
|
||||||
|
private ItemIdValue qid = Datamodel.makeWikidataItemIdValue("Q3487");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EditScrutinizer getScrutinizer() {
|
||||||
|
return new RestrictedValuesScrutinizer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoConstraint() {
|
||||||
|
scrutinize(TestingData.generateStatement(qid,
|
||||||
|
Datamodel.makeWikidataPropertyIdValue("P28732"),
|
||||||
|
qid));
|
||||||
|
assertNoWarningRaised();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllowedValue() {
|
||||||
|
scrutinize(TestingData.generateStatement(qid,
|
||||||
|
MockConstraintFetcher.allowedValuesPid,
|
||||||
|
MockConstraintFetcher.allowedValueQid));
|
||||||
|
assertNoWarningRaised();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllowedValueFailing() {
|
||||||
|
scrutinize(TestingData.generateStatement(qid,
|
||||||
|
MockConstraintFetcher.allowedValuesPid,
|
||||||
|
qid));
|
||||||
|
assertWarningsRaised(RestrictedValuesScrutinizer.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDisallowedValue() {
|
||||||
|
scrutinize(TestingData.generateStatement(qid,
|
||||||
|
MockConstraintFetcher.forbiddenValuesPid,
|
||||||
|
qid));
|
||||||
|
assertNoWarningRaised();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDisallowedValueFailing() {
|
||||||
|
scrutinize(TestingData.generateStatement(qid,
|
||||||
|
MockConstraintFetcher.forbiddenValuesPid,
|
||||||
|
MockConstraintFetcher.forbiddenValueQid));
|
||||||
|
assertWarningsRaised(RestrictedValuesScrutinizer.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoValueAllowed() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoValueDisallowed() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user