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

Commit

Permalink
Merge pull request #30 from cultuurnet/feature/III-2095
Browse files Browse the repository at this point in the history
Feature/iii 2095
  • Loading branch information
Luc Wollants committed May 15, 2017
2 parents 1df4d3b + 161cd75 commit a703551
Show file tree
Hide file tree
Showing 10 changed files with 401 additions and 285 deletions.
145 changes: 145 additions & 0 deletions src/JsonLdEmbeddingPagedCollectionFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
<?php

namespace CultuurNet\UDB3\Search\Http;

use CultuurNet\Hydra\PagedCollection;
use CultuurNet\UDB3\Search\PagedResultSet;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;

class JsonLdEmbeddingPagedCollectionFactory implements PagedCollectionFactoryInterface
{
/**
* @var PagedCollectionFactoryInterface
*/
private $pagedCollectionFactory;

/**
* @var ClientInterface
*/
private $httpClient;

/**
* @var LoggerInterface
*/
private $logger;

/**
* @param PagedCollectionFactoryInterface $pagedCollectionFactory
* @param ClientInterface $httpClient
* @param LoggerInterface $logger
*/
public function __construct(
PagedCollectionFactoryInterface $pagedCollectionFactory,
ClientInterface $httpClient,
LoggerInterface $logger
) {
$this->pagedCollectionFactory = $pagedCollectionFactory;
$this->httpClient = $httpClient;
$this->logger = $logger;
}

/**
* @param PagedResultSet $pagedResultSet
* @param int $start
* @param int $limit
* @return PagedCollection
*/
public function fromPagedResultSet(
PagedResultSet $pagedResultSet,
$start,
$limit
) {
$pagedCollection = $this->pagedCollectionFactory->fromPagedResultSet($pagedResultSet, $start, $limit);
$members = $pagedCollection->getMembers();

$promises = $this->getJsonLdRequestPromises($members);

$jsonLdBodies = [];

$results = \GuzzleHttp\Promise\settle($promises)->wait();

foreach ($results as $key => $result) {
switch ($result['state']) {
case Promise::FULFILLED:
/** @var ResponseInterface $response */
$response = $result['value'];
$jsonLdBodies[] = json_decode($response->getBody());
break;

default:
$this->logClientException($result['reason']);
break;
}
}

$merged = $this->mergeResults($members, $jsonLdBodies);

return $pagedCollection->withMembers($merged);
}

/**
* @param \stdClass[] $members
* @return PromiseInterface[]
*/
private function getJsonLdRequestPromises(array $members)
{
$promises = [];

foreach ($members as $body) {
if (isset($body->{'@id'})) {
$promises[$body->{'@id'}] = $this->httpClient->requestAsync(
'GET',
$body->{'@id'}
);
}
}

return $promises;
}

/**
* @param array $originalResults
* @param array $jsonLdResults
* @return array
*/
private function mergeResults(array $originalResults, array $jsonLdResults)
{
$mergedResults = $originalResults;

foreach ($jsonLdResults as $jsonLd) {
if (!isset($jsonLd->{'@id'})) {
continue;
}

$mergedResults = array_map(
function ($result) use ($jsonLd) {
if (isset($result->{'@id'}) && $result->{'@id'} == $jsonLd->{'@id'}) {
return $jsonLd;
} else {
return $result;
}
},
$mergedResults
);
}

return $mergedResults;
}

/**
* @param ClientException $exception
*/
private function logClientException(ClientException $exception)
{
$url = (string) $exception->getRequest()->getUri();
$code = (string) $exception->getResponse()->getStatusCode();
$message = "Could not embed document from url {$url}, received error code {$code}.";

$this->logger->error($message);
}
}
10 changes: 2 additions & 8 deletions src/OfferSearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public function __construct(
PagedCollectionFactoryInterface $pagedCollectionFactory = null
) {
if (is_null($pagedCollectionFactory)) {
$pagedCollectionFactory = new PagedCollectionFactory();
$pagedCollectionFactory = new ResultSetMappingPagedCollectionFactory();
}

$this->searchService = $searchService;
Expand All @@ -116,11 +116,6 @@ public function search(Request $request)
$start = (int) $request->query->get('start', 0);
$limit = (int) $request->query->get('limit', 30);

// The embed option is returned as a string, and casting "false" to a
// boolean returns true, so we have to do some extra conversion.
$embedParameter = $request->query->get('embed', false);
$embed = $this->castMixedToBool($embedParameter);

if ($limit == 0) {
$limit = 30;
}
Expand Down Expand Up @@ -350,8 +345,7 @@ public function search(Request $request)
$pagedCollection = $this->pagedCollectionFactory->fromPagedResultSet(
$resultSet,
$start,
$limit,
$embed
$limit
);

$jsonArray = $pagedCollection->jsonSerialize();
Expand Down
5 changes: 2 additions & 3 deletions src/OrganizerSearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function __construct(
PagedCollectionFactoryInterface $pagedCollectionFactory = null
) {
if (is_null($pagedCollectionFactory)) {
$pagedCollectionFactory = new PagedCollectionFactory();
$pagedCollectionFactory = new ResultSetMappingPagedCollectionFactory();
}

$this->searchService = $searchService;
Expand Down Expand Up @@ -78,8 +78,7 @@ public function search(Request $request)
$pagedCollection = $this->pagedCollectionFactory->fromPagedResultSet(
$resultSet,
$start,
$limit,
$embed
$limit
);

return (new JsonResponse($pagedCollection, 200, ['Content-Type' => 'application/ld+json']))
Expand Down
63 changes: 0 additions & 63 deletions src/PagedCollectionFactory.php

This file was deleted.

8 changes: 3 additions & 5 deletions src/PagedCollectionFactoryInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,13 @@ interface PagedCollectionFactoryInterface
{
/**
* @param PagedResultSet $pagedResultSet
* @param int $pageNumber
* @param int $start
* @param int $limit
* @param bool $embed
* @return PagedCollection
*/
public function fromPagedResultSet(
PagedResultSet $pagedResultSet,
$pageNumber,
$limit,
$embed = false
$start,
$limit
);
}
38 changes: 38 additions & 0 deletions src/ResultSetMappingPagedCollectionFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace CultuurNet\UDB3\Search\Http;

use CultuurNet\Hydra\PagedCollection;
use CultuurNet\UDB3\ReadModel\JsonDocument;
use CultuurNet\UDB3\Search\PagedResultSet;

class ResultSetMappingPagedCollectionFactory implements PagedCollectionFactoryInterface
{
/**
* @param PagedResultSet $pagedResultSet
* @param int $start
* @param int $limit
* @return PagedCollection
*/
public function fromPagedResultSet(
PagedResultSet $pagedResultSet,
$start,
$limit
) {
$results = array_map(
function (JsonDocument $document) {
return $document->getBody();
},
$pagedResultSet->getResults()
);

$pageNumber = (int) floor($start / $limit) + 1;

return new PagedCollection(
$pageNumber,
$limit,
$results,
$pagedResultSet->getTotal()->toNative()
);
}
}

0 comments on commit a703551

Please sign in to comment.