Builder.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Search\Adapter\Mysql\Aggregation;
  7. use Magento\Framework\App\ResourceConnection;
  8. use Magento\Framework\DB\Adapter\AdapterInterface;
  9. use Magento\Framework\DB\Ddl\Table;
  10. use Magento\Framework\Search\Adapter\Aggregation\AggregationResolverInterface;
  11. use Magento\Framework\Search\Adapter\Mysql\Aggregation\Builder\Container as AggregationContainer;
  12. use Magento\Framework\Search\Adapter\Mysql\TemporaryStorage;
  13. use Magento\Framework\Search\EntityMetadata;
  14. use Magento\Framework\Search\RequestInterface;
  15. /**
  16. * MySQL search aggregation builder.
  17. *
  18. * @deprecated 102.0.0
  19. * @see \Magento\ElasticSearch
  20. * @api
  21. * @since 100.0.2
  22. */
  23. class Builder
  24. {
  25. /**
  26. * @var DataProviderContainer
  27. */
  28. private $dataProviderContainer;
  29. /**
  30. * @var Builder\Container
  31. */
  32. private $aggregationContainer;
  33. /**
  34. * @var EntityMetadata
  35. */
  36. private $entityMetadata;
  37. /**
  38. * @var Resource
  39. */
  40. private $resource;
  41. /**
  42. * @var AggregationResolverInterface
  43. */
  44. private $aggregationResolver;
  45. /**
  46. * @param ResourceConnection $resource
  47. * @param DataProviderContainer $dataProviderContainer
  48. * @param AggregationContainer $aggregationContainer
  49. * @param EntityMetadata $entityMetadata
  50. * @param AggregationResolverInterface $aggregationResolver
  51. */
  52. public function __construct(
  53. ResourceConnection $resource,
  54. DataProviderContainer $dataProviderContainer,
  55. AggregationContainer $aggregationContainer,
  56. EntityMetadata $entityMetadata,
  57. AggregationResolverInterface $aggregationResolver
  58. ) {
  59. $this->dataProviderContainer = $dataProviderContainer;
  60. $this->aggregationContainer = $aggregationContainer;
  61. $this->entityMetadata = $entityMetadata;
  62. $this->resource = $resource;
  63. $this->aggregationResolver = $aggregationResolver;
  64. }
  65. /**
  66. * Build aggregations.
  67. *
  68. * @param RequestInterface $request
  69. * @param Table $documentsTable
  70. * @param array $documents
  71. * @return array
  72. */
  73. public function build(RequestInterface $request, Table $documentsTable, array $documents = [])
  74. {
  75. return $this->processAggregations($request, $documentsTable, $documents);
  76. }
  77. /**
  78. * Process aggregations.
  79. *
  80. * @param RequestInterface $request
  81. * @param Table $documentsTable
  82. * @param array $documents
  83. * @return array
  84. */
  85. private function processAggregations(RequestInterface $request, Table $documentsTable, $documents)
  86. {
  87. $aggregations = [];
  88. $documentIds = $documents ? $this->extractDocumentIds($documents) : $this->getDocumentIds($documentsTable);
  89. $buckets = $this->aggregationResolver->resolve($request, $documentIds);
  90. $dataProvider = $this->dataProviderContainer->get($request->getIndex());
  91. foreach ($buckets as $bucket) {
  92. $aggregationBuilder = $this->aggregationContainer->get($bucket->getType());
  93. $aggregations[$bucket->getName()] = $aggregationBuilder->build(
  94. $dataProvider,
  95. $request->getDimensions(),
  96. $bucket,
  97. $documentsTable
  98. );
  99. }
  100. return $aggregations;
  101. }
  102. /**
  103. * Extract document ids.
  104. *
  105. * @param array $documents
  106. * @return array
  107. */
  108. private function extractDocumentIds(array $documents)
  109. {
  110. return $documents ? array_keys($documents) : [];
  111. }
  112. /**
  113. * Get document ids.
  114. *
  115. * @param Table $documentsTable
  116. * @return array
  117. * @deprecated 100.1.0 Added for backward compatibility
  118. */
  119. private function getDocumentIds(Table $documentsTable)
  120. {
  121. $select = $this->getConnection()
  122. ->select()
  123. ->from($documentsTable->getName(), TemporaryStorage::FIELD_ENTITY_ID);
  124. return $this->getConnection()->fetchCol($select);
  125. }
  126. /**
  127. * Get Connection.
  128. *
  129. * @return AdapterInterface
  130. */
  131. private function getConnection()
  132. {
  133. return $this->resource->getConnection();
  134. }
  135. }