Skip to content

Commit

Permalink
EZP-27420: Use language code's over id's for SPI VersionInfo (ezsyste…
Browse files Browse the repository at this point in the history
…ms#1997)

* EZP-27420: Use language code's over id's for SPI VersionInfo

* EZP-27420: Adapt unit tests for new VersionInfo property

* CS

[skip ci]
  • Loading branch information
andrerom committed May 30, 2017
1 parent 13b710d commit b22f087
Show file tree
Hide file tree
Showing 10 changed files with 49 additions and 76 deletions.
14 changes: 14 additions & 0 deletions doc/bc/changes-6.10.md
@@ -0,0 +1,14 @@
# Backwards compatibility changes

Changes affecting version compatibility with former or future versions.

## Changes

- EZP-27420: `SPI\Persistence\VersionInfo->languageIds` has been removed and replaced by property `languageCodes`

Change is done to reduce complexity, make it consistent with other language properties on Content aggregate,
and slightly optimize mapping of API VersionInfo objects.

## Deprecations

## Removed features
19 changes: 1 addition & 18 deletions eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php
Expand Up @@ -321,7 +321,7 @@ public function updateFields(Content $content, UpdateStruct $updateStruct, Type
$fieldsToCopy = array();
$nonTranslatableCopiesUpdateSet = array();
$mainLanguageCode = $content->versionInfo->contentInfo->mainLanguageCode;
$languageCodes = $existingLanguageCodes = $this->getLanguageCodes($content->versionInfo->languageIds);
$languageCodes = $existingLanguageCodes = array_fill_keys($content->versionInfo->languageCodes, true);
$contentFieldMap = $this->getFieldMap($content->fields);
$updateFieldMap = $this->getFieldMap($updateStruct->fields, $languageCodes);
$initialLanguageCode = $this->languageHandler->load($updateStruct->initialLanguageId)->languageCode;
Expand Down Expand Up @@ -411,23 +411,6 @@ protected function updateCopiedField(Field $field, Field $updateField, Field $or
}
}

/**
* For given $languageIds returns array with language codes as keys.
*
* @param array $languageIds
*
* @return array
*/
protected function getLanguageCodes(array $languageIds)
{
$languageCodes = array();
foreach ($languageIds as $languageId) {
$languageCodes[$this->languageHandler->load($languageId)->languageCode] = true;
}

return $languageCodes;
}

/**
* Returns given $fields structured in hash array with field definition ids and language codes as keys.
*
Expand Down
Expand Up @@ -325,17 +325,17 @@ public function updateContent($contentId, MetadataUpdateStruct $struct, VersionI
);
}
if ($prePublishVersionInfo !== null) {
$mask = 0;

if (isset($struct->alwaysAvailable)) {
$mask |= $struct->alwaysAvailable ? 1 : 0;
} else {
$mask |= $prePublishVersionInfo->contentInfo->alwaysAvailable ? 1 : 0;
$languages = [];
foreach ($prePublishVersionInfo->languageCodes as $languageCodes) {
if (!isset($languages[$languageCodes])) {
$languages[$languageCodes] = true;
}
}

foreach ($prePublishVersionInfo->languageIds as $languageId) {
$mask |= $languageId;
}
$languages['always-available'] = isset($struct->alwaysAvailable) ? $struct->alwaysAvailable :
$prePublishVersionInfo->contentInfo->alwaysAvailable;

$mask = $this->languageMaskGenerator->generateLanguageMask($languages);

$q->set(
$this->dbHandler->quoteColumn('language_mask'),
Expand Down
25 changes: 11 additions & 14 deletions eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php
Expand Up @@ -105,14 +105,13 @@ public function createVersionInfoFromCreateStruct(CreateStruct $struct, $version
$versionInfo->modificationDate = $struct->modified;
$versionInfo->names = $struct->name;

$languageIds = array();
$languages = [];
foreach ($struct->fields as $field) {
if (!isset($languageIds[$field->languageCode])) {
$languageIds[$field->languageCode] =
$this->languageHandler->loadByLanguageCode($field->languageCode)->id;
if (!isset($languages[$field->languageCode])) {
$languages[$field->languageCode] = true;
}
}
$versionInfo->languageIds = array_values($languageIds);
$versionInfo->languageCodes = array_keys($languages);

return $versionInfo;
}
Expand All @@ -138,7 +137,7 @@ public function createVersionInfoForContent(Content $content, $versionNo, $userI
$versionInfo->creationDate = time();
$versionInfo->modificationDate = $versionInfo->creationDate;
$versionInfo->names = is_object($content->versionInfo) ? $content->versionInfo->names : array();
$versionInfo->languageIds = $content->versionInfo->languageIds;
$versionInfo->languageCodes = $content->versionInfo->languageCodes;

return $versionInfo;
}
Expand Down Expand Up @@ -300,7 +299,7 @@ private function extractVersionInfoFromRow(array $row, array $names = array())
$versionInfo->creationDate = (int)$row['ezcontentobject_version_created'];
$versionInfo->modificationDate = (int)$row['ezcontentobject_version_modified'];
$versionInfo->initialLanguageCode = $this->languageHandler->load($row['ezcontentobject_version_initial_language_id'])->languageCode;
$versionInfo->languageIds = $this->extractLanguageIdsFromMask($row['ezcontentobject_version_language_mask']);
$versionInfo->languageCodes = $this->extractLanguageCodesFromMask($row['ezcontentobject_version_language_mask']);
$versionInfo->status = (int)$row['ezcontentobject_version_status'];
$versionInfo->names = $names;

Expand Down Expand Up @@ -335,7 +334,7 @@ public function extractVersionInfoListFromRows(array $rows, array $nameRows)
$versionInfo->creationDate = (int)$row['ezcontentobject_version_created'];
$versionInfo->modificationDate = (int)$row['ezcontentobject_version_modified'];
$versionInfo->initialLanguageCode = $this->languageHandler->load($row['ezcontentobject_version_initial_language_id'])->languageCode;
$versionInfo->languageIds = $this->extractLanguageIdsFromMask((int)$row['ezcontentobject_version_language_mask']);
$versionInfo->languageCodes = $this->extractLanguageCodesFromMask((int)$row['ezcontentobject_version_language_mask']);
$versionInfo->status = (int)$row['ezcontentobject_version_status'];
$versionInfo->names = $nameData[$versionId];
$versionInfoList[$versionId] = $versionInfo;
Expand All @@ -346,21 +345,19 @@ public function extractVersionInfoListFromRows(array $rows, array $nameRows)
}

/**
* @todo use langmask handler for this
*
* @param int $languageMask
*
* @return array
* @return string[]
*/
public function extractLanguageIdsFromMask($languageMask)
public function extractLanguageCodesFromMask($languageMask)
{
$exp = 2;
$result = array();
$result = [];

// Decomposition of $languageMask into its binary components.
while ($exp <= $languageMask) {
if ($languageMask & $exp) {
$result[] = $exp;
$result[] = $this->languageHandler->load($exp)->languageCode;
}

$exp *= 2;
Expand Down
Expand Up @@ -773,7 +773,7 @@ protected function getContentPartialFieldsFixture()
$content = new Content();
$content->versionInfo = new VersionInfo();
$content->versionInfo->versionNo = 1;
$content->versionInfo->languageIds = array(2, 4);
$content->versionInfo->languageCodes = ['eng-US', 'eng-GB'];
$content->versionInfo->contentInfo = new ContentInfo();
$content->versionInfo->contentInfo->id = 42;
$content->versionInfo->contentInfo->contentTypeId = 1;
Expand Down Expand Up @@ -811,7 +811,7 @@ protected function getContentNoFieldsFixture()
$content = new Content();
$content->versionInfo = new VersionInfo();
$content->versionInfo->versionNo = 1;
$content->versionInfo->languageIds = array(2, 4);
$content->versionInfo->languageCodes = ['eng-US', 'eng-GB'];
$content->versionInfo->contentInfo = new ContentInfo();
$content->versionInfo->contentInfo->id = 42;
$content->versionInfo->contentInfo->contentTypeId = 1;
Expand All @@ -831,7 +831,7 @@ protected function getContentSingleLanguageFixture()
$content = new Content();
$content->versionInfo = new VersionInfo();
$content->versionInfo->versionNo = 1;
$content->versionInfo->languageIds = array(4);
$content->versionInfo->languageCodes = ['eng-GB'];
$content->versionInfo->contentInfo = new ContentInfo();
$content->versionInfo->contentInfo->id = 42;
$content->versionInfo->contentInfo->contentTypeId = 1;
Expand Down
Expand Up @@ -103,7 +103,7 @@ public function testCreateVersionInfoForContent()
'creatorId' => 14,
'status' => 0,
'initialLanguageCode' => 'eng-GB',
'languageIds' => array(4),
'languageCodes' => ['eng-GB'],
),
$versionInfo
);
Expand All @@ -127,7 +127,7 @@ protected function getFullContentFixture()
array(
'versionNo' => 1,
'initialLanguageCode' => 'eng-GB',
'languageIds' => array(4),
'languageCodes' => ['eng-GB'],
)
);

Expand Down
Expand Up @@ -20,7 +20,7 @@
$versionInfo->creationDate = 1313061317;
$versionInfo->status = 1;
$versionInfo->initialLanguageCode = 'eng-US';
$versionInfo->languageIds = array( 2 );
$versionInfo->languageCodes = ['eng-US'];

$versionInfo->contentInfo = new ContentInfo();
$versionInfo->contentInfo->id = 226;
Expand Down
7 changes: 1 addition & 6 deletions eZ/Publish/Core/Repository/Helper/DomainMapper.php
Expand Up @@ -191,11 +191,6 @@ public function buildDomainFields(array $spiFields, $contentType, array $languag
*/
public function buildVersionInfoDomainObject(SPIVersionInfo $spiVersionInfo)
{
$languageCodes = array();
foreach ($spiVersionInfo->languageIds as $languageId) {
$languageCodes[] = $this->contentLanguageHandler->load($languageId)->languageCode;
}

// Map SPI statuses to API
switch ($spiVersionInfo->status) {
case SPIVersionInfo::STATUS_ARCHIVED:
Expand All @@ -220,7 +215,7 @@ public function buildVersionInfoDomainObject(SPIVersionInfo $spiVersionInfo)
'creationDate' => $this->getDateTime($spiVersionInfo->creationDate),
'status' => $status,
'initialLanguageCode' => $spiVersionInfo->initialLanguageCode,
'languageCodes' => $languageCodes,
'languageCodes' => $spiVersionInfo->languageCodes,
'names' => $spiVersionInfo->names,
'contentInfo' => $this->buildContentInfoDomainObject($spiVersionInfo->contentInfo),
)
Expand Down
21 changes: 2 additions & 19 deletions eZ/Publish/Core/Repository/Tests/Service/Mock/DomainMapperTest.php
Expand Up @@ -11,7 +11,6 @@
use eZ\Publish\API\Repository\Values\Content\VersionInfo as APIVersionInfo;
use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest;
use eZ\Publish\Core\Repository\Helper\DomainMapper;
use eZ\Publish\SPI\Persistence\Content\Language as SPILanguage;
use eZ\Publish\SPI\Persistence\Content\VersionInfo as SPIVersionInfo;
use eZ\Publish\SPI\Persistence\Content\ContentInfo as SPIContentInfo;

Expand All @@ -26,24 +25,8 @@ class DomainMapperTest extends BaseServiceMockTest
*/
public function testBuildVersionInfo(SPIVersionInfo $spiVersionInfo, array $languages, array $expected)
{
$i = 0;
$languageHandlerMock = $this->getLanguageHandlerMock();
foreach ($languages as $languageId => $languageCode) {
$languageHandlerMock->expects($this->at($i++))
->method('load')
->with($languageId)
->will(
$this->returnValue(
new SPILanguage(
array('id' => $languageId, 'languageCode' => $languageCode)
)
)
);
}

if (empty($languages)) {
$languageHandlerMock->expects($this->never())->method('load');
}
$languageHandlerMock->expects($this->never())->method('load');

$versionInfo = $this->getDomainMapper()->buildVersionInfoDomainObject($spiVersionInfo);
$this->assertInstanceOf('eZ\\Publish\\Core\\Repository\\Values\\Content\\VersionInfo', $versionInfo);
Expand Down Expand Up @@ -95,7 +78,7 @@ public function providerForBuildVersionInfo()
array(
'status' => SPIVersionInfo::STATUS_ARCHIVED,
'contentInfo' => new SPIContentInfo(),
'languageIds' => array(1, 3, 5),
'languageCodes' => array('eng-GB', 'nor-NB', 'fre-FR'),
)
),
array(1 => 'eng-GB', 3 => 'nor-NB', 5 => 'fre-FR'),
Expand Down
9 changes: 5 additions & 4 deletions eZ/Publish/SPI/Persistence/Content/VersionInfo.php
Expand Up @@ -94,15 +94,16 @@ class VersionInfo extends ValueObject
/**
* In 4.x this is the language code which is used for labeling a translation.
*
* @var int
* @var string
*/
public $initialLanguageCode;

/**
* List of languages in this version
* List of languages in this version.
*
* Reflects which languages fields exists in for this version.
*
* @var int[]
* @var string[]
*/
public $languageIds = array();
public $languageCodes = array();
}

0 comments on commit b22f087

Please sign in to comment.