Files
ltsecurityinc/app/code/Amasty/ElasticSearch/Model/Search/Dynamic/Algorithm.php
T

131 lines
5.0 KiB
PHP
Executable File

<?php
/**
* @author Amasty Team
* @copyright Copyright (c) Amasty (https://www.amasty.com)
* @package Elastic Search Base for Magento 2
*/
namespace Amasty\ElasticSearch\Model\Search\Dynamic;
use Magento\Framework\Search\Dynamic\Algorithm as MagentoAlgorithm;
use Magento\Framework\Search\Dynamic\IntervalInterface;
/**
* Class Algorithm
* Class implemented for fixing magento bug, related to notice "Undefined index in Search\Dynamic\Algorithm"
*/
class Algorithm extends MagentoAlgorithm
{
/**
* @param int $quantileNumber
* @param IntervalInterface $interval
* @return array|false
*/
protected function _findValueSeparator($quantileNumber, IntervalInterface $interval)
{
if ($quantileNumber < 1 || $quantileNumber >= $this->getIntervalsNumber()) {
return null;
}
$values = [];
$quantileInterval = $this->_getQuantileInterval($quantileNumber);
$intervalValuesCount = $quantileInterval[1] - $quantileInterval[0] + 1;
$offset = $quantileInterval[0];
if ($this->_lastValueLimiter[0] !== null) {
$offset -= $this->_lastValueLimiter[0];
}
if ($offset < 0) {
$intervalValuesCount += $offset;
$values = array_slice(
$this->_values,
$this->_lastValueLimiter[0] + $offset - $this->_quantileInterval[0],
-$offset
);
$offset = 0;
}
$lowerValue = $this->_lastValueLimiter[1];
if ($this->_lowerLimit !== null) {
$lowerValue = max($lowerValue, $this->_lowerLimit);
}
if ($intervalValuesCount >= 0) {
$values = array_merge(
$values,
$interval->load($intervalValuesCount + 1, $offset, $lowerValue, $this->_upperLimit)
);
}
$bestRoundValue = [];
if (isset($values[0]) && isset($values[$intervalValuesCount - 1])) {
$lastValue = $values[$intervalValuesCount - 1];
if ($lastValue == $values[0]) {
if ($quantileNumber == 1 && $offset) {
$additionalValues = $interval->loadPrevious($lastValue, $quantileInterval[0], $this->_lowerLimit);
if ($additionalValues) {
$quantileInterval[0] -= count($additionalValues);
$values = array_merge($additionalValues, $values);
$bestRoundValue = $this->_findRoundValue(
$values[0] + self::MIN_POSSIBLE_VALUE / 10,
$lastValue,
false
);
}
}
if ($quantileNumber == $this->getIntervalsNumber() - 1) {
$valuesCount = count($values);
if ($values[$valuesCount - 1] > $lastValue) {
$additionalValues = [$values[$valuesCount - 1]];
} else {
$additionalValues = $interval->loadNext(
$lastValue,
$this->_count - $quantileInterval[0] - count($values),
$this->_upperLimit
);
}
if ($additionalValues) {
$quantileInterval[1] = $quantileInterval[0] + count($values) - 1;
if ($values[$valuesCount - 1] <= $lastValue) {
$quantileInterval[1] += count($additionalValues);
$values = array_merge($values, $additionalValues);
}
$upperBestRoundValue = $this->_findRoundValue(
$lastValue + self::MIN_POSSIBLE_VALUE / 10,
$values[count($values) - 1],
false
);
$this->_mergeRoundValues($bestRoundValue, $upperBestRoundValue);
}
}
} else {
$bestRoundValue = $this->_findRoundValue(
$values[0] + self::MIN_POSSIBLE_VALUE / 10,
$lastValue
);
}
}
$this->_quantileInterval = $quantileInterval;
$this->_values = $values;
if (empty($bestRoundValue)) {
$this->_skippedQuantilesUpperLimits[$quantileNumber] = $quantileInterval[1];
return $bestRoundValue;
}
$valuesCount = count($values);
if ($values[$valuesCount - 1] > $lastValue) {
$this->_lastValueLimiter = [$quantileInterval[0] + $valuesCount - 1, $values[$valuesCount - 1]];
}
ksort($bestRoundValue, SORT_NUMERIC);
foreach ($bestRoundValue as $index => &$bestRoundValueValues) {
if (empty($bestRoundValueValues)) {
unset($bestRoundValue[$index]);
} else {
sort($bestRoundValueValues);
}
}
return array_reverse($bestRoundValue);
}
}