Mailing List Archive

[MediaWiki-commits] [Gerrit] mediawiki...WikibaseQualityConstraints[master]: Check “difference within range” on qualifiers and references
Lucas Werkmeister (WMDE) has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/405293 )

Change subject: Check “difference within range” on qualifiers and references
......................................................................

Check “difference within range” on qualifiers and references

To implement this, we can simply use Context::getSiblingSnaks(), since
the semantics of that method are to ignore deprecated statements, just
like DiffWithinRangeChecker also used to do.

Unfortunately, a lot of changes in the tests are necessary:
getSiblingSnaks() does not include the current snak, and in the case of
MainSnakContext, this is achieved by removing statements with the same
GUID – so all the test cases have to be adjusted to assign some GUID to
the statements they create, otherwise too many statements are removed.

Two new tests are also added, one for qualifiers and one for references.

Bug: T175565
Change-Id: I21c4b0ec82baf461b38aca0022db3fbf70ebb651
---
M src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
M tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
2 files changed, 168 insertions(+), 57 deletions(-)


git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseQualityConstraints refs/changes/93/405293/1

diff --git a/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php b/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
index f516bbd..e7cd7d5 100644
--- a/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
+++ b/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
@@ -67,9 +67,8 @@
public function getSupportedContextTypes() {
return [.
Context::TYPE_STATEMENT => CheckResult::STATUS_COMPLIANCE,
- // TODO T175565
- Context::TYPE_QUALIFIER => CheckResult::STATUS_TODO,
- Context::TYPE_REFERENCE => CheckResult::STATUS_TODO,
+ Context::TYPE_QUALIFIER => CheckResult::STATUS_COMPLIANCE,
+ Context::TYPE_REFERENCE => CheckResult::STATUS_COMPLIANCE,
];
}

@@ -79,9 +78,8 @@
public function getDefaultContextTypes() {
return [.
Context::TYPE_STATEMENT,
- // TODO T175565
- // Context::TYPE_QUALIFIER,
- // Context::TYPE_REFERENCE,
+ Context::TYPE_QUALIFIER,
+ Context::TYPE_REFERENCE,
];
}

@@ -162,19 +160,15 @@
list ( $min, $max, $property, $parameters ) = $this->parseConstraintParameters( $constraint );

// checks only the first occurrence of the referenced property (this constraint implies a single value constraint on that property)
- /** @var Statement $otherStatement */
- foreach ( $context->getEntity()->getStatements() as $otherStatement ) {
- $otherMainSnak = $otherStatement->getMainSnak();
-
+ foreach ( $context->getSiblingSnaks() as $otherSnak ) {
if (
- !$property->equals( $otherStatement->getPropertyId() ) ||
- $otherStatement->getRank() === Statement::RANK_DEPRECATED ||
- !$otherMainSnak instanceof PropertyValueSnak
+ !$property->equals( $otherSnak->getPropertyId() ) ||
+ !$otherSnak instanceof PropertyValueSnak
) {
continue;
}

- $subtrahend = $otherMainSnak->getDataValue();
+ $subtrahend = $otherSnak->getDataValue();
if ( $subtrahend->getType() === $minuend->getType() ) {
$diff = $this->rangeInYears( $min, $max ) ?
$this->rangeCheckerHelper->getDifferenceInYears( $minuend, $subtrahend ) :
@@ -189,7 +183,7 @@
$message->rawParams(
$this->constraintParameterRenderer->formatEntityId( $context->getSnak()->getPropertyId(), Role::PREDICATE ),
$this->constraintParameterRenderer->formatDataValue( $minuend, Role::OBJECT ),
- $this->constraintParameterRenderer->formatEntityId( $otherStatement->getPropertyId(), Role::PREDICATE ),
+ $this->constraintParameterRenderer->formatEntityId( $otherSnak->getPropertyId(), Role::PREDICATE ),
$this->constraintParameterRenderer->formatDataValue( $subtrahend, Role::OBJECT )
);
if ( $min !== null ) {
diff --git a/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php b/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
index afe2459..daa012d 100644
--- a/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
+++ b/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
@@ -5,7 +5,11 @@
use DataValues\TimeValue;
use DataValues\UnboundedQuantityValue;
use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Reference;
+use Wikibase\DataModel\ReferenceList;
+use Wikibase\DataModel\Snak\PropertySomeValueSnak;
use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\SnakList;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\Lib\Units\CSVUnitStorage;
use Wikibase\Lib\Units\UnitConverter;
@@ -14,6 +18,8 @@
use WikibaseQuality\ConstraintReport\Constraint;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\DiffWithinRangeChecker;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\MainSnakContext;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\QualifierContext;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\ReferenceContext;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
use WikibaseQuality\ConstraintReport\Tests\ConstraintParameters;
use WikibaseQuality\ConstraintReport\Tests\ResultAssertions;
@@ -112,7 +118,10 @@
self::$t1900 = new TimeValue( '+00000001900-01-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' );
self::$t1970 = new TimeValue( '+00000001970-01-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' );
self::$t2000 = new TimeValue( '+00000002000-01-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' );
- self::$s1970 = NewStatement::forProperty( 'P570' )->withValue( self::$t1970 )->build();
+ self::$s1970 = NewStatement::forProperty( 'P570' )
+ ->withValue( self::$t1970 )
+ ->withSomeGuid()
+ ->build();
self::$i1970 = NewItem::withId( 'Q1' )->andStatement( self::$s1970 );
}

@@ -158,7 +167,11 @@

public function testDiffWithinRangeConstraintWithinRange() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t1900 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t1900 )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

@@ -169,7 +182,11 @@

public function testDiffWithinRangeConstraintTooSmall() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t2000 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t2000 )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

@@ -180,7 +197,11 @@

public function testDiffWithinRangeConstraintTooBig() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t1800 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t1800 )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

@@ -191,9 +212,13 @@

public function testDiffWithinRangeConstraintWithinDaysRange() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue(
- new TimeValue( '+00000001969-12-24T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue(
+ new TimeValue( '+00000001969-12-24T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob5to10DaysParameters );

@@ -204,9 +229,13 @@

public function testDiffWithinRangeConstraintTooFewDays() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue(
- new TimeValue( '+00000001969-12-31T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue(
+ new TimeValue( '+00000001969-12-31T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob5to10DaysParameters );

@@ -217,9 +246,13 @@

public function testDiffWithinRangeConstraintTooManyDays() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue(
- new TimeValue( '+00000001969-10-31T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue(
+ new TimeValue( '+00000001969-10-31T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob5to10DaysParameters );

@@ -231,9 +264,13 @@
public function testDiffWithinRangeConstraintWithinYearsRange() {
// DoB June 1820 and DoD January 1970 has diff within range [0, 150] years
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue(
- new TimeValue( '+00000001820-06-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue(
+ new TimeValue( '+00000001820-06-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150YearsParameters );
$context = new MainSnakContext( $entity, self::$s1970 );
@@ -247,9 +284,13 @@
// DoB June 1970 and DoD January 1970 violates diff within range [0, 150] years
// because June is after January, even though the year difference is 0 (within range)
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue(
- new TimeValue( '+00000001970-06-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue(
+ new TimeValue( '+00000001970-06-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150YearsParameters );
$context = new MainSnakContext( $entity, self::$s1970 );
@@ -262,14 +303,21 @@
public function testDiffWithinRangeConstraintTooManyYears() {
// DoB March 1820 and DoD September 1970 violates diff within range [0, 150] years
// because March is before September, even though the year difference is 150 (within range)
- $fall1970Statement = NewStatement::forProperty( 'P570' )->withValue(
- new TimeValue( '+00000001970-09-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- )->build();
+ $fall1970Statement = NewStatement::forProperty( 'P570' )
+ ->withValue(
+ new TimeValue( '+00000001970-09-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ ->build();
$entity = NewItem::withId( 'Q1' )
->andStatement( $fall1970Statement )
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue(
- new TimeValue( '+00000001820-03-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
- ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue(
+ new TimeValue( '+00000001820-03-01T00:00:00Z', 0, 0, 0, 11, 'http://www.wikidata.org/entity/Q1985727' )
+ )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150YearsParameters );
$context = new MainSnakContext( $entity, $fall1970Statement );
@@ -282,10 +330,15 @@
public function testDiffWithinRangeConstraintWithinRangeWithDeprecatedStatement() {
$deprecatedStatement = NewStatement::forProperty( 'P569' )
->withValue( self::$t1800 )
- ->withRank( Statement::RANK_DEPRECATED );
+ ->withRank( Statement::RANK_DEPRECATED )
+ ->withSomeGuid();
$entity = self::$i1970
->andStatement( $deprecatedStatement ) // should be ignored
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t1900 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t1900 )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

@@ -299,6 +352,7 @@
->andStatement(
NewStatement::forProperty( 'P2067' )
->withValue( UnboundedQuantityValue::newFromNumber( 5000, 'g' ) )
+ ->withSomeGuid()
)
->build();
$snak = new PropertyValueSnak(
@@ -326,6 +380,7 @@
->andStatement(
NewStatement::forProperty( 'P2067' )
->withValue( UnboundedQuantityValue::newFromNumber( 5000, 'g' ) )
+ ->withSomeGuid()
)
->build();
$snak = new PropertyValueSnak(
@@ -353,6 +408,7 @@
->andStatement(
NewStatement::forProperty( 'P2067' )
->withValue( UnboundedQuantityValue::newFromNumber( 5000, 'g' ) )
+ ->withSomeGuid()
)
->build();
$snak = new PropertyValueSnak(
@@ -376,12 +432,16 @@
}

public function testDiffWithinRangeConstraintWithinRangeWithOtherSnakTypes() {
- $noValueStatement = NewStatement::noValueFor( 'P569' );
- $someValueStatement = NewStatement::someValueFor( 'P569' );
+ $noValueStatement = NewStatement::noValueFor( 'P569' )->withSomeGuid();
+ $someValueStatement = NewStatement::someValueFor( 'P569' )->withSomeGuid();
$entity = self::$i1970
->andStatement( $noValueStatement ) // should be ignored
->andStatement( $someValueStatement ) // should be ignored
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t1900 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t1900 )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

@@ -402,7 +462,8 @@
public function testDiffWithinRangeConstraintWithOnlyDeprecatedStatement() {
$deprecatedStatement = NewStatement::forProperty( 'P569' )
->withValue( self::$t1900 )
- ->withRank( Statement::RANK_DEPRECATED );
+ ->withRank( Statement::RANK_DEPRECATED )
+ ->withSomeGuid();
$entity = self::$i1970
->andStatement( $deprecatedStatement ) // should be ignored
->build();
@@ -414,8 +475,8 @@
}

public function testDiffWithinRangeConstraintWithOnlyOtherSnakTypes() {
- $noValueStatement = NewStatement::noValueFor( 'P569' );
- $someValueStatement = NewStatement::someValueFor( 'P569' );
+ $noValueStatement = NewStatement::noValueFor( 'P569' )->withSomeGuid();
+ $someValueStatement = NewStatement::someValueFor( 'P569' )->withSomeGuid();
$entity = self::$i1970
->andStatement( $noValueStatement ) // should be ignored
->andStatement( $someValueStatement ) // should be ignored
@@ -429,7 +490,11 @@

public function testDiffWithinRangeConstraintWrongTypeOfProperty() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( '1900' ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( '1900' )
+ ->withSomeGuid()
+ )
->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

@@ -440,7 +505,7 @@

public function testDiffWithinRangeConstraintNoValueSnak() {
$entity = self::$i1970->build();
- $statement = NewStatement::noValueFor( 'P1' )->build();
+ $statement = NewStatement::noValueFor( 'P1' )->withSomeGuid()->build();
$constraint = $this->getConstraintMock( $this->dob0to150Parameters );

$checkResult = $this->checker->checkConstraint( new MainSnakContext( $entity, $statement ), $constraint );
@@ -450,7 +515,11 @@

public function testDiffWithinRangeConstraintLeftOpenWithinRange() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t1970 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t1970 )
+ ->withSomeGuid()
+ )
->build();
$constraintParameters = array_merge(
$this->propertyParameter( 'P569' ),
@@ -465,7 +534,11 @@

public function testDiffWithinRangeConstraintLeftOpenTooBig() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t0001 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t0001 )
+ ->withSomeGuid()
+ )
->build();
$constraintParameters = array_merge(
$this->propertyParameter( 'P569' ),
@@ -480,7 +553,11 @@

public function testDiffWithinRangeConstraintRightOpenWithinRange() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t0001 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t0001 )
+ ->withSomeGuid()
+ )
->build();
$constraintParameters = array_merge(
$this->propertyParameter( 'P569' ),
@@ -495,7 +572,11 @@

public function testDiffWithinRangeConstraintRightOpenTooSmall() {
$entity = self::$i1970
- ->andStatement( NewStatement::forProperty( 'P569' )->withValue( self::$t2000 ) )
+ ->andStatement(
+ NewStatement::forProperty( 'P569' )
+ ->withValue( self::$t2000 )
+ ->withSomeGuid()
+ )
->build();
$constraintParameters = array_merge(
$this->propertyParameter( 'P569' ),
@@ -508,13 +589,49 @@
$this->assertViolation( $checkResult, 'wbqc-violation-message-diff-within-range-rightopen' );
}

+ public function testDiffWithinRangeConstraint_Qualifier() {
+ $qualifier1 = new PropertyValueSnak( new PropertyId( 'P569' ), self::$t1900 );
+ $qualifier2 = new PropertyValueSnak( new PropertyId( 'P570' ), self::$t1970 );
+ $statement = new Statement(
+ new PropertySomeValueSnak( new PropertyId( 'P10' ) ),
+ new SnakList( [ $qualifier1, $qualifier2 ] ),
+ null,
+ 'Q1$c5f1968c-c8f9-4edd-9f2d-f12c93cd8b2b'
+ );
+ $entity = NewItem::withStatement( $statement )->build();
+ $constraint = $this->getConstraintMock( $this->dob0to150Parameters );
+
+ $checkResult = $this->checker->checkConstraint( new QualifierContext( $entity, $statement, $qualifier2 ), $constraint );
+
+ $this->assertCompliance( $checkResult );
+ }
+
+ public function testDiffWithinRangeConstraint_Reference() {
+ $snak1 = new PropertyValueSnak( new PropertyId( 'P569' ), self::$t2000 );
+ $snak2 = new PropertyValueSnak( new PropertyId( 'P570' ), self::$t1970 );
+ $reference = new Reference( [ $snak1, $snak2 ] );
+ $statement = new Statement(
+ new PropertySomeValueSnak( new PropertyId( 'P10' ) ),
+ null,
+ new ReferenceList( [ $reference ] ),
+ 'Q1$80a5fb6c-8b14-4f18-a60e-2c853d5dfbd1'
+ );
+ $entity = NewItem::withStatement( $statement )->build();
+ $constraint = $this->getConstraintMock( $this->dob0to150Parameters );
+
+ $checkResult = $this->checker->checkConstraint( new ReferenceContext( $entity, $statement, $reference, $snak2 ), $constraint );
+
+ $this->assertViolation( $checkResult, 'wbqc-violation-message-diff-within-range' );
+ }
+
public function testDiffWithinRangeConstraintDeprecatedStatement() {
$statement = NewStatement::noValueFor( 'P1' )
- ->withDeprecatedRank()
- ->build();
+ ->withDeprecatedRank()
+ ->withSomeGuid()
+ ->build();
$constraint = $this->getConstraintMock( [] );
$entity = NewItem::withId( 'Q1' )
- ->build();
+ ->build();

$checkResult = $this->checker->checkConstraint( new MainSnakContext( $entity, $statement ), $constraint );


--
To view, visit https://gerrit.wikimedia.org/r/405293
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I21c4b0ec82baf461b38aca0022db3fbf70ebb651
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseQualityConstraints
Gerrit-Branch: master
Gerrit-Owner: Lucas Werkmeister (WMDE) <lucas.werkmeister@wikimedia.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
[MediaWiki-commits] [Gerrit] mediawiki...WikibaseQualityConstraints[master]: Check “difference within range” on qualifiers and references [ In reply to ]
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/405293 )

Change subject: Check “difference within range” on qualifiers and references
......................................................................


Check “difference within range” on qualifiers and references

To implement this, we can simply use Context::getSnakGroup(), since
the semantics of that method are to ignore deprecated statements, just
like DiffWithinRangeChecker also used to do.

Bug: T175565
Change-Id: I21c4b0ec82baf461b38aca0022db3fbf70ebb651
---
M src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
M tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
2 files changed, 50 insertions(+), 15 deletions(-)

Approvals:
jenkins-bot: Verified
Thiemo Kreuz (WMDE): Looks good to me, approved



diff --git a/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php b/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
index 1b25f17..de4e80d 100644
--- a/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
+++ b/src/ConstraintCheck/Checker/DiffWithinRangeChecker.php
@@ -61,9 +61,8 @@
public function getSupportedContextTypes() {
return [.
Context::TYPE_STATEMENT => CheckResult::STATUS_COMPLIANCE,
- // TODO T175565
- Context::TYPE_QUALIFIER => CheckResult::STATUS_TODO,
- Context::TYPE_REFERENCE => CheckResult::STATUS_TODO,
+ Context::TYPE_QUALIFIER => CheckResult::STATUS_COMPLIANCE,
+ Context::TYPE_REFERENCE => CheckResult::STATUS_COMPLIANCE,
];
}

@@ -73,9 +72,8 @@
public function getDefaultContextTypes() {
return [.
Context::TYPE_STATEMENT,
- // TODO T175565
- // Context::TYPE_QUALIFIER,
- // Context::TYPE_REFERENCE,
+ Context::TYPE_QUALIFIER,
+ Context::TYPE_REFERENCE,
];
}

@@ -156,19 +154,15 @@
list( $min, $max, $property, $parameters ) = $this->parseConstraintParameters( $constraint );

// checks only the first occurrence of the referenced property (this constraint implies a single value constraint on that property)
- /** @var Statement $otherStatement */
- foreach ( $context->getEntity()->getStatements() as $otherStatement ) {
- $otherMainSnak = $otherStatement->getMainSnak();
-
+ foreach ( $context->getSnakGroup() as $otherSnak ) {
if (
- !$property->equals( $otherStatement->getPropertyId() ) ||
- $otherStatement->getRank() === Statement::RANK_DEPRECATED ||
- !$otherMainSnak instanceof PropertyValueSnak
+ !$property->equals( $otherSnak->getPropertyId() ) ||
+ !$otherSnak instanceof PropertyValueSnak
) {
continue;
}

- $subtrahend = $otherMainSnak->getDataValue();
+ $subtrahend = $otherSnak->getDataValue();
if ( $subtrahend->getType() === $minuend->getType() ) {
$diff = $this->rangeInYears( $min, $max ) ?
$this->rangeCheckerHelper->getDifferenceInYears( $minuend, $subtrahend ) :
@@ -183,7 +177,7 @@
$message->rawParams(
$this->constraintParameterRenderer->formatEntityId( $context->getSnak()->getPropertyId(), Role::PREDICATE ),
$this->constraintParameterRenderer->formatDataValue( $minuend, Role::OBJECT ),
- $this->constraintParameterRenderer->formatEntityId( $otherStatement->getPropertyId(), Role::PREDICATE ),
+ $this->constraintParameterRenderer->formatEntityId( $otherSnak->getPropertyId(), Role::PREDICATE ),
$this->constraintParameterRenderer->formatDataValue( $subtrahend, Role::OBJECT )
);
if ( $min !== null ) {
diff --git a/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php b/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
index afe2459..acb6c6a 100644
--- a/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
+++ b/tests/phpunit/Checker/RangeChecker/DiffWithinRangeCheckerTest.php
@@ -5,7 +5,11 @@
use DataValues\TimeValue;
use DataValues\UnboundedQuantityValue;
use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Reference;
+use Wikibase\DataModel\ReferenceList;
+use Wikibase\DataModel\Snak\PropertySomeValueSnak;
use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\SnakList;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\Lib\Units\CSVUnitStorage;
use Wikibase\Lib\Units\UnitConverter;
@@ -14,6 +18,8 @@
use WikibaseQuality\ConstraintReport\Constraint;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Checker\DiffWithinRangeChecker;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\MainSnakContext;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\QualifierContext;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\ReferenceContext;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Helper\RangeCheckerHelper;
use WikibaseQuality\ConstraintReport\Tests\ConstraintParameters;
use WikibaseQuality\ConstraintReport\Tests\ResultAssertions;
@@ -508,6 +514,41 @@
$this->assertViolation( $checkResult, 'wbqc-violation-message-diff-within-range-rightopen' );
}

+ public function testDiffWithinRangeConstraint_Qualifier() {
+ $qualifier1 = new PropertyValueSnak( new PropertyId( 'P569' ), self::$t1900 );
+ $qualifier2 = new PropertyValueSnak( new PropertyId( 'P570' ), self::$t1970 );
+ $statement = new Statement(
+ new PropertySomeValueSnak( new PropertyId( 'P10' ) ),
+ new SnakList( [ $qualifier1, $qualifier2 ] ),
+ null,
+ 'Q1$c5f1968c-c8f9-4edd-9f2d-f12c93cd8b2b'
+ );
+ $entity = NewItem::withStatement( $statement )->build();
+ $constraint = $this->getConstraintMock( $this->dob0to150Parameters );
+
+ $checkResult = $this->checker->checkConstraint( new QualifierContext( $entity, $statement, $qualifier2 ), $constraint );
+
+ $this->assertCompliance( $checkResult );
+ }
+
+ public function testDiffWithinRangeConstraint_Reference() {
+ $snak1 = new PropertyValueSnak( new PropertyId( 'P569' ), self::$t2000 );
+ $snak2 = new PropertyValueSnak( new PropertyId( 'P570' ), self::$t1970 );
+ $reference = new Reference( [ $snak1, $snak2 ] );
+ $statement = new Statement(
+ new PropertySomeValueSnak( new PropertyId( 'P10' ) ),
+ null,
+ new ReferenceList( [ $reference ] ),
+ 'Q1$80a5fb6c-8b14-4f18-a60e-2c853d5dfbd1'
+ );
+ $entity = NewItem::withStatement( $statement )->build();
+ $constraint = $this->getConstraintMock( $this->dob0to150Parameters );
+
+ $checkResult = $this->checker->checkConstraint( new ReferenceContext( $entity, $statement, $reference, $snak2 ), $constraint );
+
+ $this->assertViolation( $checkResult, 'wbqc-violation-message-diff-within-range' );
+ }
+
public function testDiffWithinRangeConstraintDeprecatedStatement() {
$statement = NewStatement::noValueFor( 'P1' )
->withDeprecatedRank()

--
To view, visit https://gerrit.wikimedia.org/r/405293
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I21c4b0ec82baf461b38aca0022db3fbf70ebb651
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/WikibaseQualityConstraints
Gerrit-Branch: master
Gerrit-Owner: Lucas Werkmeister (WMDE) <lucas.werkmeister@wikimedia.de>
Gerrit-Reviewer: Thiemo Kreuz (WMDE) <thiemo.kreuz@wikimedia.de>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits