Skip to content
This repository has been archived by the owner on Aug 13, 2019. It is now read-only.

Commit

Permalink
III-2167: Refactor json transformers to use JsonDocumentLanguageAnaly…
Browse files Browse the repository at this point in the history
…zerInterface
  • Loading branch information
bertramakers committed Jun 26, 2017
1 parent 32c53a5 commit 2e4c91f
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 62 deletions.
5 changes: 4 additions & 1 deletion src/Event/EventJsonDocumentTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace CultuurNet\UDB3\Search\ElasticSearch\Event;

use CultuurNet\UDB3\Event\ReadModel\JSONLD\EventJsonDocumentLanguageAnalyzer;
use CultuurNet\UDB3\Offer\OfferType;
use CultuurNet\UDB3\ReadModel\JsonDocument;
use CultuurNet\UDB3\Search\ElasticSearch\IdUrlParserInterface;
Expand Down Expand Up @@ -33,7 +34,9 @@ public function __construct(
OfferRegionServiceInterface $offerRegionService,
LoggerInterface $logger
) {
parent::__construct($idUrlParser, $offerRegionService, $logger);
$languageAnalyzer = new EventJsonDocumentLanguageAnalyzer();

parent::__construct($idUrlParser, $offerRegionService, $logger, $languageAnalyzer);

$this->copyJsonEvent = new CopyJsonEvent(
new CopyJsonPsrLogger($this->logger),
Expand Down
32 changes: 11 additions & 21 deletions src/JsonDocument/CopyJson/Components/CopyJsonName.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,34 +26,24 @@ public function __construct(CopyJsonLoggerInterface $logger)
*/
public function copy(\stdClass $from, \stdClass $to)
{
$to->name = new \stdClass();
$mainLanguage = isset($from->mainLanguage) ? $from->mainLanguage : 'nl';

// @replay_i18n
// @see https://jira.uitdatabank.be/browse/III-2201
// @replay_i18n Use $jsonLd->mainLanguage to get the required name field.
if (isset($from->name->nl)) {
$to->name->nl = $from->name->nl;
} elseif (isset($from->name) && is_string($from->name)) {
// @replay_i18n For old projections the name is untranslated and just a string.
// When a full replay is done this code becomes obsolete.
$to->name->nl = $from->name;
// No other languages possible, so already return.
return;
} else {
$this->logger->logMissingExpectedField('name.nl');
if (isset($from->name) && is_string($from->name)) {
$from = clone $from;
$from->name = (object) [$mainLanguage => $from->name];
}

// @todo: The list of known languages gets bigger.
// @see https://jira.uitdatabank.be/browse/III-2161 (es and it)
if (isset($from->name->fr)) {
$to->name->fr = $from->name->fr;
if (!isset($from->name)) {
$this->logger->logMissingExpectedField('name');
return;
}

if (isset($from->name->en)) {
$to->name->en = $from->name->en;
if (!isset($from->name->nl)) {
$this->logger->logMissingExpectedField('name.nl');
}

if (isset($from->name->de)) {
$to->name->de = $from->name->de;
}
$to->name = $from->name;
}
}
71 changes: 40 additions & 31 deletions src/Offer/AbstractOfferJsonDocumentTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
namespace CultuurNet\UDB3\Search\ElasticSearch\Offer;

use Cake\Chronos\Chronos;
use CultuurNet\UDB3\Language;
use CultuurNet\UDB3\Offer\OfferType;
use CultuurNet\UDB3\ReadModel\JsonDocument;
use CultuurNet\UDB3\ReadModel\JsonDocumentLanguageAnalyzerInterface;
use CultuurNet\UDB3\Search\ElasticSearch\IdUrlParserInterface;
use CultuurNet\UDB3\Search\JsonDocument\JsonDocumentTransformerInterface;
use CultuurNet\UDB3\Search\Region\RegionId;
use Psr\Log\LoggerInterface;
use Rhumsaa\Uuid\Uuid;

abstract class AbstractOfferJsonDocumentTransformer implements JsonDocumentTransformerInterface
{
Expand All @@ -27,19 +30,27 @@ abstract class AbstractOfferJsonDocumentTransformer implements JsonDocumentTrans
*/
protected $logger;

/**
* @var JsonDocumentLanguageAnalyzerInterface
*/
protected $languageAnalyzer;

/**
* @param IdUrlParserInterface $idUrlParser
* @param OfferRegionServiceInterface $offerRegionService
* @param LoggerInterface $logger
* @param JsonDocumentLanguageAnalyzerInterface $languageAnalyzer
*/
public function __construct(
IdUrlParserInterface $idUrlParser,
OfferRegionServiceInterface $offerRegionService,
LoggerInterface $logger
LoggerInterface $logger,
JsonDocumentLanguageAnalyzerInterface $languageAnalyzer
) {
$this->idUrlParser = $idUrlParser;
$this->offerRegionService = $offerRegionService;
$this->logger = $logger;
$this->languageAnalyzer = $languageAnalyzer;
}

/**
Expand Down Expand Up @@ -405,44 +416,42 @@ protected function copyMainLanguage(\stdClass $from, \stdClass $to)
*/
protected function copyLanguages(\stdClass $from, \stdClass $to)
{
$translatableFields = ['name', 'description'];
$languages = [];
$completedLanguages = [];

foreach ($translatableFields as $translatableField) {
if (!isset($from->{$translatableField})) {
continue;
}

$languagesOnField = array_keys(
get_object_vars($from->{$translatableField})
);

$languages = array_merge(
$languages,
$languagesOnField
);
if (isset($from->languages)) {
$languages = $from->languages;
} else {
// @todo Change this else condition to log missing field when full
// replay is done.
// @replay_i18n
// @see https://jira.uitdatabank.be/browse/III-2201
// Use NIL uuid as it doesn't really matter here. The JsonDocument is
// just a wrapper to pass the $to JSON to the language analyzer.
$jsonDocument = new JsonDocument(Uuid::NIL, json_encode($to));
$languages = $this->languageAnalyzer->determineAvailableLanguages($jsonDocument);
}

if ($translatableField == $translatableFields[0]) {
$completedLanguages = $languagesOnField;
} else {
$completedLanguages = array_intersect($completedLanguages, $languagesOnField);
}
if (isset($from->completedLanguages)) {
$completedLanguages = $from->completedLanguages;
} else {
// @todo Change this else condition to log missing field when full
// replay is done.
// @replay_i18n
// @see https://jira.uitdatabank.be/browse/III-2201
// Use NIL uuid as it doesn't really matter here. The JsonDocument is
// just a wrapper to pass the $to JSON to the language analyzer.
$jsonDocument = new JsonDocument(Uuid::NIL, json_encode($to));
$completedLanguages = $this->languageAnalyzer->determineCompletedLanguages($jsonDocument);
}

// Make sure to use array_values(), because array_unique() keeps the
// original keys so this can result in gaps. This is bad because those
// gaps result in the array being converted to an object when encoding
// as JSON.
$languages = array_values(array_unique($languages));
$completedLanguages = array_values(array_unique($completedLanguages));
$languageToString = function (Language $language) {
return $language->getCode();
};

if (!empty($languages)) {
$to->languages = $languages;
$to->languages = array_map($languageToString, $languages);
}

if (!empty($completedLanguages)) {
$to->completedLanguages = $completedLanguages;
$to->completedLanguages = array_map($languageToString, $completedLanguages);
}
}

Expand Down
46 changes: 46 additions & 0 deletions src/Organizer/OrganizerJsonDocumentTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

namespace CultuurNet\UDB3\Search\ElasticSearch\Organizer;

use CultuurNet\UDB3\Language;
use CultuurNet\UDB3\Organizer\ReadModel\JSONLD\OrganizerJsonDocumentLanguageAnalyzer;
use CultuurNet\UDB3\ReadModel\JsonDocument;
use CultuurNet\UDB3\Search\ElasticSearch\IdUrlParserInterface;
use CultuurNet\UDB3\Search\ElasticSearch\JsonDocument\CopyJson\CopyJsonInterface;
use CultuurNet\UDB3\Search\ElasticSearch\JsonDocument\CopyJson\Components\FallbackType;
use CultuurNet\UDB3\Search\ElasticSearch\JsonDocument\CopyJson\Logging\CopyJsonPsrLogger;
use CultuurNet\UDB3\Search\JsonDocument\JsonDocumentTransformerInterface;
use Psr\Log\LoggerInterface;
use Rhumsaa\Uuid\Uuid;

class OrganizerJsonDocumentTransformer implements JsonDocumentTransformerInterface
{
Expand All @@ -17,6 +20,11 @@ class OrganizerJsonDocumentTransformer implements JsonDocumentTransformerInterfa
*/
private $jsonCopier;

/**
* @var OrganizerJsonDocumentLanguageAnalyzer
*/
private $languageAnalyzer;

public function __construct(
IdUrlParserInterface $idUrlParser,
LoggerInterface $logger
Expand All @@ -26,6 +34,8 @@ public function __construct(
$idUrlParser,
FallbackType::ORGANIZER()
);

$this->languageAnalyzer = new OrganizerJsonDocumentLanguageAnalyzer();
}

/**
Expand All @@ -42,6 +52,42 @@ public function transform(JsonDocument $jsonDocument)

$newBody->url = $body->url;

if (isset($body->languages)) {
$languages = $body->languages;
} else {
// @todo Change this else condition to log missing field when full
// replay is done.
// @replay_i18n
// @see https://jira.uitdatabank.be/browse/III-2201
// Use NIL uuid as it doesn't really matter here. The JsonDocument is
// just a wrapper to pass the $newBody JSON to the language analyzer.
$languages = $this->languageAnalyzer->determineAvailableLanguages($jsonDocument);
}

if (isset($body->completedLanguages)) {
$completedLanguages = $body->completedLanguages;
} else {
// @todo Change this else condition to log missing field when full
// replay is done.
// @replay_i18n
// @see https://jira.uitdatabank.be/browse/III-2201
// Use NIL uuid as it doesn't really matter here. The JsonDocument is
// just a wrapper to pass the $newBody JSON to the language analyzer.
$completedLanguages = $this->languageAnalyzer->determineCompletedLanguages($jsonDocument);
}

$languageToString = function (Language $language) {
return $language->getCode();
};

if (!empty($languages)) {
$newBody->languages = array_map($languageToString, $languages);
}

if (!empty($completedLanguages)) {
$newBody->completedLanguages = array_map($languageToString, $completedLanguages);
}

return $jsonDocument->withBody($newBody);
}
}
5 changes: 4 additions & 1 deletion src/Place/PlaceJsonDocumentTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace CultuurNet\UDB3\Search\ElasticSearch\Place;

use CultuurNet\UDB3\Offer\OfferType;
use CultuurNet\UDB3\Place\ReadModel\JSONLD\PlaceJsonDocumentLanguageAnalyzer;
use CultuurNet\UDB3\ReadModel\JsonDocument;
use CultuurNet\UDB3\Search\ElasticSearch\IdUrlParserInterface;
use CultuurNet\UDB3\Search\ElasticSearch\JsonDocument\CopyJson\Components\FallbackType;
Expand Down Expand Up @@ -33,7 +34,9 @@ public function __construct(
OfferRegionServiceInterface $offerRegionService,
LoggerInterface $logger
) {
parent::__construct($idUrlParser, $offerRegionService, $logger);
$languageAnalyzer = new PlaceJsonDocumentLanguageAnalyzer();

parent::__construct($idUrlParser, $offerRegionService, $logger, $languageAnalyzer);

$this->copyJsonPlace = new CopyJsonPlace(
new CopyJsonPsrLogger($this->logger),
Expand Down
4 changes: 2 additions & 2 deletions tests/Event/EventJsonDocumentTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@ public function it_logs_missing_required_fields()
$originalDocument = new JsonDocument($id, '{}');
$expectedDocument = new JsonDocument(
$id,
'{"@type":"Event","name":{},"mainLanguage":"nl","audienceType":"everyone","mediaObjectsCount":0}'
'{"@type":"Event","mainLanguage":"nl","audienceType":"everyone","mediaObjectsCount":0}'
);

$expectedLogs = [
['debug', "Transforming event $id for indexation.", []],
['warning', "Missing expected field '@id'.", []],
['warning', "Missing expected field 'name.nl'.", []],
['warning', "Missing expected field 'name'.", []],
['warning', "Missing expected field 'location'.", []],
['warning', "Missing expected field 'calendarType'.", []],
['warning', "Missing expected field 'workflowStatus'.", []],
Expand Down
7 changes: 5 additions & 2 deletions tests/Organizer/data/all_languages_indexed.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
"nl": "PHPLeuven",
"fr": "PHPLouvain",
"en": "PHPLeuven EN",
"de": "PHPLeuven DE"
"de": "PHPLeuven DE",
"zh": "鲁汶"
},
"url": "https://www.meetup.com/PHP-Leuven-Web-Innovation-Group/events/234638670/"
"url": "https://www.meetup.com/PHP-Leuven-Web-Innovation-Group/events/234638670/",
"languages": ["nl", "fr", "en", "de", "zh"],
"completedLanguages": ["nl", "fr", "en", "de", "zh"]
}
4 changes: 3 additions & 1 deletion tests/Organizer/data/indexed.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@
"name": {
"nl": "PHPLeuven"
},
"url": "https://www.meetup.com/PHP-Leuven-Web-Innovation-Group/events/234638670/"
"url": "https://www.meetup.com/PHP-Leuven-Web-Innovation-Group/events/234638670/",
"languages": ["nl"],
"completedLanguages": ["nl"]
}
4 changes: 3 additions & 1 deletion tests/Organizer/data/missing_main_language_indexed.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@
"name": {
"fr": "PHPLouvain"
},
"url": "https://www.meetup.com/PHP-Leuven-Web-Innovation-Group/events/234638670/"
"url": "https://www.meetup.com/PHP-Leuven-Web-Innovation-Group/events/234638670/",
"languages": ["fr"],
"completedLanguages": ["fr"]
}
4 changes: 2 additions & 2 deletions tests/Place/PlaceJsonDocumentTransformerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@ public function it_logs_missing_required_fields()
$originalDocument = new JsonDocument($id, '{}');
$expectedDocument = new JsonDocument(
$id,
'{"@type":"Place","name":{},"mainLanguage":"nl","audienceType":"everyone","mediaObjectsCount":0}'
'{"@type":"Place","mainLanguage":"nl","audienceType":"everyone","mediaObjectsCount":0}'
);

$expectedLogs = [
['debug', "Transforming place $id for indexation.", []],
['warning', "Missing expected field '@id'.", []],
['warning', "Missing expected field 'name.nl'.", []],
['warning', "Missing expected field 'name'.", []],
['warning', "Missing expected field 'calendarType'.", []],
['warning', "Missing expected field 'workflowStatus'.", []],
['warning', "Missing expected field 'availableTo'.", []],
Expand Down

0 comments on commit 2e4c91f

Please sign in to comment.