jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/396408 )
Change subject: Add and use CachedCheckConstraintsResponse
......................................................................
Add and use CachedCheckConstraintsResponse
CachedCheckConstraintsResponse is, like CachedQueryResults and
CachedEntityIds, a functionally identical subclass of CachedArray with
some extra documentation. ResultsBuilder is changed to return that class
instead of a bare array, so that another kind of ResultsBuilder (to be
added in a later commit) can inspect the list of depended entity IDs
when caching the entire response.
Bug: T182105
Change-Id: I1433ea7e32a269bcf322a55d56d85bdce1cb574a
---
M api/CheckConstraints.php
M extension.json
M includes/ConstraintCheck/Api/CheckingResultsBuilder.php
M includes/ConstraintCheck/Api/ResultsBuilder.php
A includes/ConstraintCheck/Cache/CachedCheckConstraintsResponse.php
M tests/phpunit/Api/CheckingResultsBuilderTest.php
A tests/phpunit/Cache/CachedCheckConstraintsResponseTest.php
7 files changed, 114 insertions(+), 6 deletions(-)
Approvals:
Jonas Kress (WMDE): Looks good to me, approved
jenkins-bot: Verified
diff --git a/api/CheckConstraints.php b/api/CheckConstraints.php
index 98cf912..5cabc5c 100644
--- a/api/CheckConstraints.php
+++ b/api/CheckConstraints.php
@@ -170,7 +170,7 @@
$this->resultsBuilder->getResults(
$entityIds,
$claimIds, $constraintIDs
- )
+ )->getArray()
);
// ensure that result contains the given entity IDs even if
they have no statements
foreach ( $entityIds as $entityId ) {
diff --git a/extension.json b/extension.json
index 70051a9..8cf19ad 100644
--- a/extension.json
+++ b/extension.json
@@ -384,6 +384,7 @@
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Api\\ResultsBuilder":
"includes/ConstraintCheck/Api/ResultsBuilder.php",
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Cache\\CachedArray":
"includes/ConstraintCheck/Cache/CachedArray.php",
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Cache\\CachedBool":
"includes/ConstraintCheck/Cache/CachedBool.php",
+
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Cache\\CachedCheckConstraintsResponse":
"includes/ConstraintCheck/Cache/CachedCheckConstraintsResponse.php",
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Cache\\CachedEntityIds":
"includes/ConstraintCheck/Cache/CachedEntityIds.php",
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Cache\\CachedQueryResults":
"includes/ConstraintCheck/Cache/CachedQueryResults.php",
"WikibaseQuality\\ConstraintReport\\ConstraintCheck\\Cache\\CachingMetadata":
"includes/ConstraintCheck/Cache/CachingMetadata.php",
diff --git a/includes/ConstraintCheck/Api/CheckingResultsBuilder.php
b/includes/ConstraintCheck/Api/CheckingResultsBuilder.php
index 652a421..d622fee 100644
--- a/includes/ConstraintCheck/Api/CheckingResultsBuilder.php
+++ b/includes/ConstraintCheck/Api/CheckingResultsBuilder.php
@@ -7,6 +7,8 @@
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Services\EntityId\EntityIdFormatter;
use Wikibase\Lib\Store\EntityTitleLookup;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachingMetadata;
+use
WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachedCheckConstraintsResponse;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Context\Context;
use
WikibaseQuality\ConstraintReport\ConstraintCheck\DelegatingConstraintChecker;
use WikibaseQuality\ConstraintReport\ConstraintCheck\Result\CheckResult;
@@ -62,7 +64,7 @@
* @param EntityId[] $entityIds
* @param string[] $claimIds
* @param string[]|null $constraintIds
- * @return array
+ * @return CachedCheckConstraintsResponse
*/
public function getResults(
array $entityIds,
@@ -70,6 +72,7 @@
array $constraintIds = null
) {
$response = [];
+ $cachingMetadatas = [];
foreach ( $entityIds as $entityId ) {
$results =
$this->delegatingConstraintChecker->checkAgainstConstraintsOnEntityId(
$entityId,
@@ -77,6 +80,7 @@
[ $this, 'defaultResults' ]
);
foreach ( $results as $result ) {
+ $cachingMetadatas[] =
$result->getCachingMetadata();
$resultArray = $this->checkResultToArray(
$result );
$result->getContext()->storeCheckResultInArray(
$resultArray, $response );
}
@@ -88,11 +92,15 @@
[ $this, 'defaultResults' ]
);
foreach ( $results as $result ) {
+ $cachingMetadatas[] =
$result->getCachingMetadata();
$resultArray = $this->checkResultToArray(
$result );
$result->getContext()->storeCheckResultInArray(
$resultArray, $response );
}
}
- return $response;
+ return new CachedCheckConstraintsResponse(
+ $response,
+ CachingMetadata::merge( $cachingMetadatas )
+ );
}
public function defaultResults( Context $context ) {
diff --git a/includes/ConstraintCheck/Api/ResultsBuilder.php
b/includes/ConstraintCheck/Api/ResultsBuilder.php
index 032f1a3..df9e660 100644
--- a/includes/ConstraintCheck/Api/ResultsBuilder.php
+++ b/includes/ConstraintCheck/Api/ResultsBuilder.php
@@ -3,6 +3,7 @@
namespace WikibaseQuality\ConstraintReport\ConstraintCheck\Api;
use Wikibase\DataModel\Entity\EntityId;
+use
WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachedCheckConstraintsResponse;
/**
* @author Lucas Werkmeister
@@ -14,7 +15,7 @@
* @param EntityId[] $entityIds
* @param string[] $claimIds
* @param string[]|null $constraintIds
- * @return array
+ * @return CachedCheckConstraintsResponse
*/
public function getResults(
array $entityIds,
diff --git a/includes/ConstraintCheck/Cache/CachedCheckConstraintsResponse.php
b/includes/ConstraintCheck/Cache/CachedCheckConstraintsResponse.php
new file mode 100644
index 0000000..6a8954b
--- /dev/null
+++ b/includes/ConstraintCheck/Cache/CachedCheckConstraintsResponse.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\ConstraintCheck\Cache;
+
+/**
+ * A response of the CheckConstraints API action,
+ * along with information whether and how it was cached.
+ */
+class CachedCheckConstraintsResponse extends CachedArray {
+
+ /**
+ * @return array The API response.
+ * The format is based on the Wikibase JSON format;
+ * for details, see [[mw:Wikibase/API#wbcheckconstraints]].
+ */
+ public function getArray() {
+ return parent::getArray();
+ }
+
+}
diff --git a/tests/phpunit/Api/CheckingResultsBuilderTest.php
b/tests/phpunit/Api/CheckingResultsBuilderTest.php
index 1775769..2b3f0bf 100644
--- a/tests/phpunit/Api/CheckingResultsBuilderTest.php
+++ b/tests/phpunit/Api/CheckingResultsBuilderTest.php
@@ -119,7 +119,7 @@
[ $q1, $q2 ],
[ $s1, $s2 ],
$constraintIds
- );
+ )->getArray();
$this->assertSame( [ 'Q1', 'Q2', 'Q3', 'Q4' ], array_keys(
$result ) );
foreach ( $result as $resultByQ ) {
@@ -143,11 +143,60 @@
[ new ItemId( self::NONEXISTENT_ITEM ) ],
[ self::NONEXISTENT_CLAIM ],
[]
- );
+ )->getArray();
$this->assertEmpty( $result );
}
+ public function testGetResults_CachingMetadata() {
+ $mock = $this->getMockBuilder(
DelegatingConstraintChecker::class )
+ ->disableOriginalConstructor()
+ ->setMethods( [ 'checkAgainstConstraintsOnEntityId',
'checkAgainstConstraintsOnClaimId' ] );
+ $delegatingConstraintChecker = $mock->getMock();
+ $delegatingConstraintChecker->method(
'checkAgainstConstraintsOnEntityId' )
+ ->willReturn( [
+ ( new CheckResult(
+ new MainSnakContext(
+ new Item( new ItemId( 'Q1' ) ),
+ new Statement( new
PropertyNoValueSnak( new PropertyId( 'P1' ) ) )
+ ),
+ new Constraint(
+
'P1$47681880-d5f5-417d-96c3-570d6e94d234',
+ new PropertyId( 'P1' ),
+ 'Q1',
+ []
+ )
+ ) )->withCachingMetadata(
CachingMetadata::ofEntityId( new ItemId( 'Q100' ) ) )
+ ] );
+ $delegatingConstraintChecker->method(
'checkAgainstConstraintsOnClaimId' )
+ ->willReturn( [
+ ( new CheckResult(
+ new MainSnakContext(
+ new Item( new ItemId( 'Q2' ) ),
+ new Statement( new
PropertyNoValueSnak( new PropertyId( 'P1' ) ) )
+ ),
+ new Constraint(
+
'P1$47681880-d5f5-417d-96c3-570d6e94d234',
+ new PropertyId( 'P1' ),
+ 'Q1',
+ []
+ )
+ ) )->withCachingMetadata(
CachingMetadata::ofEntityId( new PropertyId( 'P100' ) ) )
+ ] );
+
+ $cachingMetadata = $this->getResultsBuilder(
$delegatingConstraintChecker )->getResults(
+ [ new ItemId( 'Q1' ) ],
+ [ 'Q2$73408a9b-b1b0-4035-bf36-1e65ecf8772d' ],
+ null
+ )->getCachingMetadata();
+
+ $expected = [ new ItemId( 'Q100' ), new PropertyId( 'P100' ) ];
+ $actual = $cachingMetadata->getDependedEntityIds();
+ sort( $expected );
+ sort( $actual );
+ $this->assertEquals( $expected, $actual );
+ }
+
public function testCheckResultToArray_NullResult() {
$checkResult = new NullResult(
new FakeSnakContext( new PropertyNoValueSnak( new
PropertyId( 'P1' ) ) )
diff --git a/tests/phpunit/Cache/CachedCheckConstraintsResponseTest.php
b/tests/phpunit/Cache/CachedCheckConstraintsResponseTest.php
new file mode 100644
index 0000000..d89cca6
--- /dev/null
+++ b/tests/phpunit/Cache/CachedCheckConstraintsResponseTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace WikibaseQuality\ConstraintReport\Test\Cache;
+
+use
WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachedCheckConstraintsResponse;
+use WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachingMetadata;
+
+/**
+ * @covers
\WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachedCheckConstraintsResponse
+ * @uses \WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachedArray
+ * @uses
\WikibaseQuality\ConstraintReport\ConstraintCheck\Cache\CachingMetadata
+ *
+ * @group WikibaseQualityConstraints
+ *
+ * @author Lucas Werkmeister
+ * @license GNU GPL v2+
+ */
+class CachedCheckConstraintsResponseTest extends \PHPUnit_Framework_TestCase {
+
+ public function testGetArray() {
+ $array = [ 'boolean' => true ];
+ $cm = CachingMetadata::fresh();
+
+ $cqr = new CachedCheckConstraintsResponse( $array, $cm );
+
+ $this->assertSame( $array, $cqr->getArray() );
+ }
+
+}
--
To view, visit https://gerrit.wikimedia.org/r/396408
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I1433ea7e32a269bcf322a55d56d85bdce1cb574a
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/WikibaseQualityConstraints
Gerrit-Branch: master
Gerrit-Owner: Lucas Werkmeister (WMDE) <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Lucas Werkmeister (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits