Dynamic.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Elasticsearch\SearchAdapter\Aggregation\Builder;
  7. use Magento\Framework\Search\Dynamic\DataProviderInterface;
  8. use Magento\Framework\Search\Dynamic\Algorithm\Repository;
  9. use Magento\Framework\Search\Dynamic\EntityStorage;
  10. use Magento\Framework\Search\Dynamic\EntityStorageFactory;
  11. use Magento\Framework\Search\Request\Aggregation\DynamicBucket;
  12. use Magento\Framework\Search\Request\BucketInterface as RequestBucketInterface;
  13. class Dynamic implements BucketBuilderInterface
  14. {
  15. /**
  16. * @var Repository
  17. */
  18. private $algorithmRepository;
  19. /**
  20. * @var EntityStorageFactory
  21. */
  22. private $entityStorageFactory;
  23. /**
  24. * @param Repository $algorithmRepository
  25. * @param EntityStorageFactory $entityStorageFactory
  26. */
  27. public function __construct(Repository $algorithmRepository, EntityStorageFactory $entityStorageFactory)
  28. {
  29. $this->algorithmRepository = $algorithmRepository;
  30. $this->entityStorageFactory = $entityStorageFactory;
  31. }
  32. /**
  33. * {@inheritdoc}
  34. */
  35. public function build(
  36. RequestBucketInterface $bucket,
  37. array $dimensions,
  38. array $queryResult,
  39. DataProviderInterface $dataProvider
  40. ) {
  41. /** @var DynamicBucket $bucket */
  42. $algorithm = $this->algorithmRepository->get($bucket->getMethod(), ['dataProvider' => $dataProvider]);
  43. $data = $algorithm->getItems($bucket, $dimensions, $this->getEntityStorage($queryResult));
  44. $resultData = $this->prepareData($data);
  45. return $resultData;
  46. }
  47. /**
  48. * Extract Document ids
  49. *
  50. * @param array $queryResult
  51. * @return EntityStorage
  52. */
  53. private function getEntityStorage(array $queryResult)
  54. {
  55. $ids = [];
  56. foreach ($queryResult['hits']['hits'] as $document) {
  57. $ids[] = $document['_id'];
  58. }
  59. return $this->entityStorageFactory->create($ids);
  60. }
  61. /**
  62. * Prepare result data
  63. *
  64. * @param array $data
  65. * @return array
  66. */
  67. private function prepareData($data)
  68. {
  69. $resultData = [];
  70. foreach ($data as $value) {
  71. $from = is_numeric($value['from']) ? $value['from'] : '*';
  72. $to = is_numeric($value['to']) ? $value['to'] : '*';
  73. unset($value['from'], $value['to']);
  74. $rangeName = "{$from}_{$to}";
  75. $resultData[$rangeName] = array_merge(['value' => $rangeName], $value);
  76. }
  77. return $resultData;
  78. }
  79. }