Auto.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Search\Dynamic\Algorithm;
  7. use Magento\Framework\DB\Ddl\Table;
  8. use Magento\Framework\Search\Adapter\OptionsInterface;
  9. use Magento\Framework\Search\Dynamic\DataProviderInterface;
  10. use Magento\Framework\Search\Dynamic\EntityStorage;
  11. use Magento\Framework\Search\Request\BucketInterface;
  12. class Auto implements AlgorithmInterface
  13. {
  14. /**
  15. * @var DataProviderInterface
  16. */
  17. private $dataProvider;
  18. /**
  19. * @var OptionsInterface
  20. */
  21. private $options;
  22. /**
  23. * @param DataProviderInterface $dataProvider
  24. * @param OptionsInterface $options
  25. */
  26. public function __construct(DataProviderInterface $dataProvider, OptionsInterface $options)
  27. {
  28. $this->dataProvider = $dataProvider;
  29. $this->options = $options;
  30. }
  31. /**
  32. * {@inheritdoc}
  33. */
  34. public function getItems(
  35. BucketInterface $bucket,
  36. array $dimensions,
  37. EntityStorage $entityStorage
  38. ) {
  39. $data = [];
  40. $range = $this->dataProvider->getRange();
  41. if ($entityStorage->getSource()) {
  42. $range = !empty($range) ? $range : $this->getRange($bucket, $dimensions, $entityStorage);
  43. $dbRanges = $this->dataProvider->getAggregation($bucket, $dimensions, $range, $entityStorage);
  44. $data = $this->dataProvider->prepareData($range, $dbRanges);
  45. }
  46. return $data;
  47. }
  48. /**
  49. * @param BucketInterface $bucket
  50. * @param array $dimensions
  51. * @param EntityStorage $entityStorage
  52. * @return number
  53. */
  54. private function getRange($bucket, array $dimensions, EntityStorage $entityStorage)
  55. {
  56. $maxPrice = $this->getMaxPriceInt($entityStorage);
  57. $index = 1;
  58. do {
  59. $range = pow(10, strlen(floor($maxPrice)) - $index);
  60. $items = $this->dataProvider->getAggregation($bucket, $dimensions, $range, $entityStorage);
  61. $index++;
  62. } while ($range > $this->getMinRangePower() && count($items) < 2);
  63. return $range;
  64. }
  65. /**
  66. * Get maximum price from layer products set
  67. *
  68. * @param EntityStorage $entityStorage
  69. * @return float
  70. */
  71. private function getMaxPriceInt(EntityStorage $entityStorage)
  72. {
  73. $aggregations = $this->dataProvider->getAggregations($entityStorage);
  74. $maxPrice = $aggregations['max'];
  75. $maxPrice = floor($maxPrice);
  76. return $maxPrice;
  77. }
  78. /**
  79. * @return int
  80. */
  81. private function getMinRangePower()
  82. {
  83. $options = $this->options->get();
  84. return $options['min_range_power'];
  85. }
  86. }