private function combineSynonyms($queryText, $synonymByPositions, $substitutions = 0, $offset = 0)
{
$combinations = [];
if (!empty($synonymByPositions)) {
$currentPositionSynonyms = current($synonymByPositions);
$remainingSynonyms = array_slice($synonymByPositions, 1);
foreach ($currentPositionSynonyms as $synonym) {
$startOffset = $synonym['start_offset'] + $offset;
$length = $synonym['end_offset'] - $synonym['start_offset'];
$rewrittenQueryText = substr_replace($queryText, $synonym['token'], $startOffset, $length);
$newOffset = strlen($rewrittenQueryText) - strlen($queryText) + $offset;
$combinations[$rewrittenQueryText] = $substitutions + 1;
if (!empty($remainingSynonyms)) {
$combinations = array_merge($combinations, $this->combineSynonyms($rewrittenQueryText, $remainingSynonyms, $substitutions + 1, $newOffset));
}
}
if (!empty($remainingSynonyms)) {
$combinations = array_merge($combinations, $this->combineSynonyms($queryText, $remainingSynonyms, $substitutions, $offset));
}
}
return $combinations;
}