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