MultiBuilder.php 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace Elastica\Multi;
  3. use Elastica\Response;
  4. use Elastica\Search as BaseSearch;
  5. class MultiBuilder implements MultiBuilderInterface
  6. {
  7. /**
  8. * @param Response $response
  9. * @param BaseSearch[] $searches
  10. *
  11. * @return ResultSet
  12. */
  13. public function buildMultiResultSet(Response $response, $searches)
  14. {
  15. $resultSets = $this->buildResultSets($response, $searches);
  16. return new ResultSet($response, $resultSets);
  17. }
  18. /**
  19. * @param Response $childResponse
  20. * @param BaseSearch $search
  21. *
  22. * @return \Elastica\ResultSet
  23. */
  24. private function buildResultSet(Response $childResponse, BaseSearch $search)
  25. {
  26. return $search->getResultSetBuilder()->buildResultSet($childResponse, $search->getQuery());
  27. }
  28. /**
  29. * @param Response $response
  30. * @param BaseSearch[] $searches
  31. *
  32. * @return \Elastica\ResultSet[]
  33. */
  34. private function buildResultSets(Response $response, $searches)
  35. {
  36. $data = $response->getData();
  37. if (!isset($data['responses']) || !is_array($data['responses'])) {
  38. return [];
  39. }
  40. $resultSets = [];
  41. reset($searches);
  42. foreach ($data['responses'] as $responseData) {
  43. $search = current($searches);
  44. $key = key($searches);
  45. next($searches);
  46. $resultSets[$key] = $this->buildResultSet(new Response($responseData), $search);
  47. }
  48. return $resultSets;
  49. }
  50. }