private function ensureIndex(array $index)
{
//if $index is a prefix of any existing index we are good
foreach ($this->collection->listIndexes() as $existingIndex) {
$slice = array_slice($existingIndex['key'], 0, count($index), true);
if ($slice === $index) {
return;
}
}
for ($i = 0; $i < 5; ++$i) {
for ($name = uniqid(); strlen($name) > 0; $name = substr($name, 0, -1)) {
//creating an index with same name and different spec does nothing.
//creating an index with same spec and different name does nothing.
//so we use any generated name, and then find the right spec after we have called,
//and just go with that name.
try {
$this->collection->createIndex($index, ['name' => $name, 'background' => true]);
} catch (\MongoDB\Exception\Exception $e) {
//this happens when the name was too long, let continue
}
foreach ($this->collection->listIndexes() as $existingIndex) {
if ($existingIndex['key'] === $index) {
return;
}
}
}
}
throw new \Exception('couldnt create index after 5 attempts');
//@codeCoverageIgnoreEnd
}