Jeroen De Dauw has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/255374

Change subject: Move statement filtering from GetClaims API to dedicated class
......................................................................

Move statement filtering from GetClaims API to dedicated class

This moves the code out of the API module, imporving decoupling
and allowing for API-independent tests of its logic.

This also removes the manual filtering that was happening before
by instead using StatementList::filter. To see this simplification
on its own, have a look at
https://gerrit.wikimedia.org/r/#/c/255370/1/repo/includes/api/GetClaims.php

Change-Id: I44077aefcc2ec77be7ba489ec9ac5f264054b800
---
M repo/includes/api/GetClaims.php
A repo/includes/api/GetClaimsStatementFilter.php
2 files changed, 89 insertions(+), 51 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/74/255374/1

diff --git a/repo/includes/api/GetClaims.php b/repo/includes/api/GetClaims.php
index 3bcf56a..5353d0a 100644
--- a/repo/includes/api/GetClaims.php
+++ b/repo/includes/api/GetClaims.php
@@ -11,7 +11,6 @@
 use Wikibase\DataModel\Services\Statement\StatementGuidParser;
 use Wikibase\DataModel\Services\Statement\StatementGuidValidator;
 use Wikibase\DataModel\Statement\Statement;
-use Wikibase\DataModel\Statement\StatementList;
 use Wikibase\DataModel\Statement\StatementListProvider;
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Repo\WikibaseRepo;
@@ -127,62 +126,22 @@
                        return array();
                }
 
+               $statements = $entity->getStatements();
+
                if ( $guid === null ) {
-                       return $this->getMatchingStatements( 
$entity->getStatements() );
+                       return $statements->filter( 
$this->newRequestParamsBasedFilter() )->toArray();
                }
 
-               $statement = 
$entity->getStatements()->getFirstStatementWithGuid( $guid );
+               $statement = $statements->getFirstStatementWithGuid( $guid );
                return $statement === null ? array() : array( $statement );
        }
 
-       private function getMatchingStatements( StatementList $statementList ) {
-               $statements = array();
-
-               foreach ( $statementList->toArray() as $statement ) {
-                       if ( $this->statementMatchesFilters( $statement ) ) {
-                               $statements[] = $statement;
-                       }
-               }
-
-               return $statements;
-       }
-
-       private function statementMatchesFilters( Statement $statement ) {
-               return $this->rankMatchesFilter( $statement->getRank() )
-                       && $this->propertyMatchesFilter( 
$statement->getPropertyId() );
-       }
-
-       private function rankMatchesFilter( $rank ) {
-               if ( $rank === null ) {
-                       return true;
-               }
-               $params = $this->extractRequestParams();
-
-               if ( isset( $params['rank'] ) ) {
-                       $statementRankSerializer = new 
StatementRankSerializer();
-                       $unserializedRank = 
$statementRankSerializer->deserialize( $params['rank'] );
-                       $matchFilter = $rank === $unserializedRank;
-                       return $matchFilter;
-               }
-
-               return true;
-       }
-
-       private function propertyMatchesFilter( EntityId $propertyId ) {
-               $params = $this->extractRequestParams();
-
-               if ( isset( $params['property'] ) ) {
-                       try {
-                               $parsedProperty = $this->idParser->parse( 
$params['property'] );
-                       } catch ( EntityIdParsingException $e ) {
-                               $this->errorReporter->dieException( $e, 
'param-invalid' );
-                       }
-
-                       /** @var EntityId $parsedProperty */
-                       return $propertyId->equals( $parsedProperty );
-               }
-
-               return true;
+       private function newRequestParamsBasedFilter() {
+               return new GetClaimsStatementFilter(
+                       $this->idParser,
+                       $this->errorReporter,
+                       $this->extractRequestParams()
+               );
        }
 
        /**
diff --git a/repo/includes/api/GetClaimsStatementFilter.php 
b/repo/includes/api/GetClaimsStatementFilter.php
new file mode 100644
index 0000000..95d128a
--- /dev/null
+++ b/repo/includes/api/GetClaimsStatementFilter.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Wikibase\Repo\Api;
+
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\EntityIdParsingException;
+use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementFilter;
+use Wikibase\StatementRankSerializer;
+
+/**
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroended...@gmail.com >
+ * @author Adam Shorland
+ */
+class GetClaimsStatementFilter implements StatementFilter {
+
+       /**
+        * @var ApiErrorReporter
+        */
+       private $errorReporter;
+
+       /**
+        * @var EntityIdParser
+        */
+       private $idParser;
+
+       /**
+        * @var array
+        */
+       private $requestParams;
+
+       public function __construct( EntityIdParser $idParser, ApiErrorReporter 
$errorReporter, array $requestParams ) {
+               $this->idParser = $idParser;
+               $this->errorReporter = $errorReporter;
+               $this->requestParams = $requestParams;
+       }
+
+       /**
+        * @param Statement $statement
+        *
+        * @return boolean
+        */
+       public function statementMatches( Statement $statement ) {
+               return $this->rankMatchesFilter( $statement->getRank() )
+                       && $this->propertyMatchesFilter( 
$statement->getPropertyId() );
+       }
+
+       private function rankMatchesFilter( $rank ) {
+               if ( $rank === null ) {
+                       return true;
+               }
+
+               if ( isset( $this->requestParams['rank'] ) ) {
+                       $statementRankSerializer = new 
StatementRankSerializer();
+                       $unserializedRank = 
$statementRankSerializer->deserialize( $this->requestParams['rank'] );
+                       return $rank === $unserializedRank;
+               }
+
+               return true;
+       }
+
+       private function propertyMatchesFilter( EntityId $propertyId ) {
+               if ( isset( $this->requestParams['property'] ) ) {
+                       try {
+                               $parsedProperty = $this->idParser->parse( 
$this->requestParams['property'] );
+                       } catch ( EntityIdParsingException $e ) {
+                               $this->errorReporter->dieException( $e, 
'param-invalid' );
+                       }
+
+                       /** @var EntityId $parsedProperty */
+                       return $propertyId->equals( $parsedProperty );
+               }
+
+               return true;
+       }
+
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I44077aefcc2ec77be7ba489ec9ac5f264054b800
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Jeroen De Dauw <jeroended...@gmail.com>

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

Reply via email to