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

Reply via email to