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

Reply via email to