Ricordisamoa has uploaded a new change for review.
https://gerrit.wikimedia.org/r/236077
Change subject: [WIP] Split EntitySerializationFilter from ResultBuilder
......................................................................
[WIP] Split EntitySerializationFilter from ResultBuilder
Change-Id: If0b524a5ef3527f09cccef029db0c7c6ec1bfc85
---
A repo/includes/api/EntitySerializationFilter.php
M repo/includes/api/GetEntities.php
M repo/includes/api/ResultBuilder.php
3 files changed, 184 insertions(+), 92 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/77/236077/1
diff --git a/repo/includes/api/EntitySerializationFilter.php
b/repo/includes/api/EntitySerializationFilter.php
new file mode 100644
index 0000000..9b6a20d
--- /dev/null
+++ b/repo/includes/api/EntitySerializationFilter.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Wikibase\Repo\Api;
+
+/**
+ * Filter for entity serializations
+ *
+ * @licence GNU GPL v2+
+ */
+class EntitySerializationFilter {
+
+ /**
+ * @var string[]
+ */
+ private $props;
+
+ /**
+ * @var string[]
+ */
+ private $siteIds;
+
+ /**
+ * @var string[]
+ */
+ private $langCodes;
+
+ /**
+ * Set the props filter.
+ *
+ * @param $props string[]
+ */
+ public function setProps( array $props ) {
+ $this->props = $props;
+ }
+
+ public function getProps() {
+ return $this->props;
+ }
+
+ /**
+ * Set the site filter.
+ *
+ * @param $siteIds string[]
+ */
+ public function setSiteIds( array $siteIds ) {
+ $this->siteIds = $siteIds;
+ }
+
+ /**
+ * Set the lang filter.
+ *
+ * @param $langCodes string[]
+ */
+ public function setLangCodes( array $langCodes ) {
+ $this->langCodes = $langCodes;
+ }
+
+ /**
+ * @param array $serialization
+ *
+ * @return array
+ */
+ public function filterByProps( array $serialization ) {
+ if ( is_array( $this->props ) ) {
+ if ( !in_array( 'labels', $this->props ) ) {
+ unset( $serialization['labels'] );
+ }
+ if ( !in_array( 'descriptions', $this->props ) ) {
+ unset( $serialization['descriptions'] );
+ }
+ if ( !in_array( 'aliases', $this->props ) ) {
+ unset( $serialization['aliases'] );
+ }
+ if ( !in_array( 'claims', $this->props ) ) {
+ unset( $serialization['claims'] );
+ }
+ if ( !in_array( 'sitelinks', $this->props ) ) {
+ unset( $serialization['sitelinks'] );
+ }
+ }
+ return $serialization;
+ }
+
+ public function filterBySiteIds( array $serialization ) {
+ if ( !empty( $this->siteIds ) && array_key_exists( 'sitelinks',
$serialization ) ) {
+ foreach ( $serialization['sitelinks'] as $siteId =>
$siteLink ) {
+ if ( is_array( $siteLink ) && !in_array(
$siteLink['site'], $this->siteIds ) ) {
+ unset(
$serialization['sitelinks'][$siteId] );
+ }
+ }
+ }
+ return $serialization;
+ }
+
+ public function filterByLangCodes( array $serialization ) {
+ if ( !empty( $this->langCodes ) ) {
+ if ( array_key_exists( 'labels', $serialization ) ) {
+ foreach ( $serialization['labels'] as $langCode
=> $languageArray ) {
+ if ( !in_array( $langCode,
$this->langCodes ) ) {
+ unset(
$serialization['labels'][$langCode] );
+ }
+ }
+ }
+ if ( array_key_exists( 'descriptions', $serialization )
) {
+ foreach ( $serialization['descriptions'] as
$langCode => $languageArray ) {
+ if ( !in_array( $langCode,
$this->langCodes ) ) {
+ unset(
$serialization['descriptions'][$langCode] );
+ }
+ }
+ }
+ if ( array_key_exists( 'aliases', $serialization ) ) {
+ foreach ( $serialization['aliases'] as
$langCode => $languageArray ) {
+ if ( !in_array( $langCode,
$this->langCodes ) ) {
+ unset(
$serialization['aliases'][$langCode] );
+ }
+ }
+ }
+ }
+ return $serialization;
+ }
+
+}
diff --git a/repo/includes/api/GetEntities.php
b/repo/includes/api/GetEntities.php
index a767516..a7db348 100644
--- a/repo/includes/api/GetEntities.php
+++ b/repo/includes/api/GetEntities.php
@@ -273,17 +273,28 @@
$this->resultBuilder->addMissingEntity(
$sourceEntityId, array( 'id' => $sourceEntityId ) );
} else {
list( $languageCodeFilter, $fallbackChains ) =
$this->getLanguageCodesAndFallback( $params );
- $this->resultBuilder->addEntityRevision(
+ $filter = $this->getSerializationFilter(
$languageCodeFilter );
+ $filter->setLangCodes( $languageCodeFilter );
+ $this->resultBuilder->addEntityRevisionWithFilter(
$sourceEntityId,
$entityRevision,
- $this->getPropsFromParams( $params ),
- $params['sitefilter'],
- $languageCodeFilter,
+ $filter,
$fallbackChains
);
}
}
+ private function getSerializationFilter() {
+ $params = $this->extractRequestParams();
+
+ $filter = new EntitySerializationFilter();
+ $filter->setProps( $this->getPropsFromParams( $params ) );
+ if ( isset( $params['sitefilter'] ) && $params['sitefilter']
!== 'all' ) {
+ $filter->setSiteIds( $params['sitefilter'] );
+ }
+ return $filter;
+ }
+
/**
* @param array $params
*
diff --git a/repo/includes/api/ResultBuilder.php
b/repo/includes/api/ResultBuilder.php
index 5e38938..37de749 100644
--- a/repo/includes/api/ResultBuilder.php
+++ b/repo/includes/api/ResultBuilder.php
@@ -253,19 +253,15 @@
* info Will default to the entity's serialized ID if null. If
given this must be the
* entity id before any redirects were resolved.
* @param EntityRevision $entityRevision
- * @param string[]|string $props a list of fields to include, or "all"
- * @param string[] $filterSiteIds A list of site IDs to filter by
- * @param string[] $filterLangCodes A list of language codes to filter
by
+ * @param EntitySerializationFilter $filter a filter for the
serialization
* @param LanguageFallbackChain[] $fallbackChains with keys of the
origional language
*
* @since 0.5
*/
- public function addEntityRevision(
+ public function addEntityRevisionWithFilter(
$sourceEntityIdSerialization,
EntityRevision $entityRevision,
- $props = 'all',
- $filterSiteIds = array(),
- $filterLangCodes = array(),
+ EntitySerializationFilter $filter,
$fallbackChains = array()
) {
$entity = $entityRevision->getEntity();
@@ -277,6 +273,7 @@
$record = array();
+ $props = $filter->getProps();
//if there are no props defined only return type and id..
if ( $props === array() ) {
$record['id'] = $entityId->getSerialization();
@@ -297,13 +294,7 @@
);
}
- $entitySerialization = $this->getEntityArray(
- $entity,
- $props,
- $filterSiteIds,
- $filterLangCodes,
- $fallbackChains
- );
+ $entitySerialization = $this->getEntityArray( $entity,
$filter, $fallbackChains );
$record = array_merge( $record, $entitySerialization );
}
@@ -312,6 +303,43 @@
if ( $this->addMetaData ) {
$this->result->addArrayType( array( 'entities' ),
'array' );
}
+ }
+
+ /**
+ * Get serialized entity for the EntityRevision and add it to the result
+ *
+ * @param string|null $sourceEntityIdSerialization EntityId used to
retreive $entityRevision
+ * Used as the key for the entity in the 'entities' structure
and for adding redirect
+ * info Will default to the entity's serialized ID if null. If
given this must be the
+ * entity id before any redirects were resolved.
+ * @param EntityRevision $entityRevision
+ * @param string[]|string $props a list of fields to include, or "all"
+ * @param string[] $filterSiteIds A list of site IDs to filter by
+ * @param string[] $filterLangCodes A list of language codes to filter
by
+ * @param LanguageFallbackChain[] $fallbackChains with keys of the
origional language
+ *
+ * @since 0.5
+ */
+ public function addEntityRevision(
+ $sourceEntityIdSerialization,
+ EntityRevision $entityRevision,
+ $props = 'all',
+ $filterSiteIds = array(),
+ $filterLangCodes = array(),
+ $fallbackChains = array()
+ ) {
+ $filter = new EntitySerializationFilter();
+ if ( $props !== null && $props !== 'all' ) {
+ $filter->setProps( $props );
+ }
+ $filter->setSiteIds( $filterSiteIds );
+ $filter->setLangCodes( $filterLangCodes );
+ $this->addEntityRevisionWithFilter(
+ $sourceEntityIdSerialization,
+ $entityRevision,
+ $filter,
+ $fallbackChains
+ );
}
/**
@@ -327,61 +355,30 @@
*/
private function getEntityArray(
Entity $entity,
- $props,
- $filterSiteIds,
- $filterLangCodes,
+ EntitySerializationFilter $filter,
$fallbackChains
) {
$entitySerializer =
$this->serializerFactory->newEntitySerializer();
$serialization = $entitySerializer->serialize( $entity );
- $serialization = $this->filterEntitySerializationUsingProps(
$serialization, $props );
+ $props = $filter->getProps();
+ $serialization = $filter->filterByProps( $serialization );
if ( $props == 'all' || in_array( 'sitelinks/urls', $props ) ) {
$serialization =
$this->injectEntitySerializationWithSiteLinkUrls( $serialization );
}
$serialization = $this->sortEntitySerializationSiteLinks(
$serialization );
$serialization = $this->injectEntitySerializationWithDataTypes(
$serialization );
- $serialization = $this->filterEntitySerializationUsingSiteIds(
$serialization, $filterSiteIds );
+ $serialization = $filter->filterBySiteIds( $serialization );
if ( !empty( $fallbackChains ) ) {
$serialization =
$this->addEntitySerializationFallbackInfo( $serialization, $fallbackChains );
}
- $serialization = $this->filterEntitySerializationUsingLangCodes(
- $serialization,
- $filterLangCodes
- );
+ $serialization = $filter->filterByLangCodes( $serialization );
if ( $this->addMetaData ) {
$serialization =
$this->getEntitySerializationWithMetaData( $serialization );
}
- return $serialization;
- }
-
- /**
- * @param array $serialization
- * @param string|array $props
- *
- * @return array
- */
- private function filterEntitySerializationUsingProps( array
$serialization, $props ) {
- if ( $props !== 'all' ) {
- if ( !in_array( 'labels', $props ) ) {
- unset( $serialization['labels'] );
- }
- if ( !in_array( 'descriptions', $props ) ) {
- unset( $serialization['descriptions'] );
- }
- if ( !in_array( 'aliases', $props ) ) {
- unset( $serialization['aliases'] );
- }
- if ( !in_array( 'claims', $props ) ) {
- unset( $serialization['claims'] );
- }
- if ( !in_array( 'sitelinks', $props ) ) {
- unset( $serialization['sitelinks'] );
- }
- }
return $serialization;
}
@@ -413,17 +410,6 @@
$serialization,
'claims/*/*/references/*/snaks'
);
- return $serialization;
- }
-
- private function filterEntitySerializationUsingSiteIds( array
$serialization, $siteIds ) {
- if ( !empty( $siteIds ) && array_key_exists( 'sitelinks',
$serialization ) ) {
- foreach ( $serialization['sitelinks'] as $siteId =>
$siteLink ) {
- if ( is_array( $siteLink ) && !in_array(
$siteLink['site'], $siteIds ) ) {
- unset(
$serialization['sitelinks'][$siteId] );
- }
- }
- }
return $serialization;
}
@@ -481,33 +467,6 @@
}
}
return $newSerialization;
- }
-
- private function filterEntitySerializationUsingLangCodes( array
$serialization, $langCodes ) {
- if ( !empty( $langCodes ) ) {
- if ( array_key_exists( 'labels', $serialization ) ) {
- foreach ( $serialization['labels'] as $langCode
=> $languageArray ) {
- if ( !in_array( $langCode, $langCodes )
) {
- unset(
$serialization['labels'][$langCode] );
- }
- }
- }
- if ( array_key_exists( 'descriptions', $serialization )
) {
- foreach ( $serialization['descriptions'] as
$langCode => $languageArray ) {
- if ( !in_array( $langCode, $langCodes )
) {
- unset(
$serialization['descriptions'][$langCode] );
- }
- }
- }
- if ( array_key_exists( 'aliases', $serialization ) ) {
- foreach ( $serialization['aliases'] as
$langCode => $languageArray ) {
- if ( !in_array( $langCode, $langCodes )
) {
- unset(
$serialization['aliases'][$langCode] );
- }
- }
- }
- }
- return $serialization;
}
private function getEntitySerializationWithMetaData( $serialization ) {
--
To view, visit https://gerrit.wikimedia.org/r/236077
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If0b524a5ef3527f09cccef029db0c7c6ec1bfc85
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Ricordisamoa <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits