Manual.php 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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\Search\Adapter\OptionsInterface;
  8. use Magento\Framework\Search\Dynamic\DataProviderInterface;
  9. use Magento\Framework\Search\Dynamic\EntityStorage;
  10. use Magento\Framework\Search\Request\BucketInterface;
  11. class Manual implements AlgorithmInterface
  12. {
  13. /**
  14. * @var DataProviderInterface
  15. */
  16. private $dataProvider;
  17. /**
  18. * @var OptionsInterface
  19. */
  20. private $options;
  21. /**
  22. * @param DataProviderInterface $dataProvider
  23. * @param OptionsInterface $options
  24. */
  25. public function __construct(DataProviderInterface $dataProvider, OptionsInterface $options)
  26. {
  27. $this->dataProvider = $dataProvider;
  28. $this->options = $options;
  29. }
  30. /**
  31. * {@inheritdoc}
  32. */
  33. public function getItems(
  34. BucketInterface $bucket,
  35. array $dimensions,
  36. EntityStorage $entityStorage
  37. ) {
  38. $range = $this->dataProvider->getRange();
  39. $options = $this->options->get();
  40. if (!$range) {
  41. $range = $options['range_step'];
  42. }
  43. $dbRanges = $this->dataProvider->getAggregation($bucket, $dimensions, $range, $entityStorage);
  44. $dbRanges = $this->processRange($dbRanges, $options['max_intervals_number']);
  45. $data = $this->dataProvider->prepareData($range, $dbRanges);
  46. return $data;
  47. }
  48. /**
  49. * @param array $items
  50. * @param int $maxIntervalsNumber
  51. * @return array
  52. */
  53. private function processRange($items, $maxIntervalsNumber)
  54. {
  55. $i = 0;
  56. $lastIndex = null;
  57. foreach ($items as $k => $v) {
  58. ++$i;
  59. if ($i > 1 && $i > $maxIntervalsNumber) {
  60. $items[$lastIndex] += $v;
  61. unset($items[$k]);
  62. } else {
  63. $lastIndex = $k;
  64. }
  65. }
  66. return $items;
  67. }
  68. }