/** * Ensure index of correct specification and a unique name whether the specification or name already exist or not. * Will not create index if $index is a prefix of an existing index * * @param array $index index to create in same format as \MongoCollection::ensureIndex() * * @return void * * @throws \Exception couldnt create index after 5 attempts */ private function _ensureIndex(array $index) { //if $index is a prefix of any existing index we are good foreach ($this->_collection->getIndexInfo() 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->ensureIndex($index, array('name' => $name, 'background' => true)); } catch (\MongoException $e) { //this happens when the name was too long, let continue } foreach ($this->_collection->getIndexInfo() as $existingIndex) { if ($existingIndex['key'] === $index) { return; } } } } throw new \Exception('couldnt create index after 5 attempts'); }
public function testGetIndexInfo() { $info = $this->object->getIndexInfo(); $this->assertEquals(count($info), 0); $this->object->ensureIndex(array('foo' => 1)); $this->object->ensureIndex(array('foo' => -1)); $this->object->ensureIndex(array('bar' => 1, 'baz' => -1)); $info = $this->object->getIndexInfo(); $this->assertEquals(4, count($info), json_encode($info)); $this->assertEquals($info[1]['key']['foo'], 1); $this->assertEquals($info[1]['name'], 'foo_1'); $this->assertEquals($info[2]['key']['foo'], -1); $this->assertEquals($info[2]['name'], 'foo_-1'); $this->assertEquals($info[3]['key']['bar'], 1); $this->assertEquals($info[3]['key']['baz'], -1); $this->assertEquals($info[3]['name'], 'bar_1_baz_-1'); }
/** * Wrapper method for MongoCollection::getIndexInfo(). * * @see http://php.net/manual/en/mongocollection.getindexinfo.php * @return array */ public function getIndexInfo() { return $this->mongoCollection->getIndexInfo(); }
/** * getIndexInfo. */ public function getIndexInfo() { $this->time->start(); $return = parent::getIndexInfo(); $time = $this->time->stop(); $this->log(array('type' => 'getIndexInfo', 'time' => $time)); return $return; }