Note: Is not very useful currently as dirty documents are only registered
at commit time.
public isScheduledForUpdate ( object $document ) : boolean | ||
$document | object | |
리턴 | boolean |
function it_schedules_owning_document_for_update_when_setting_element_by_key_in_the_collection(MongoDBODMUnitOfWork $uow, DocumentStub $document, ObjectRepository $repository, ClassMetadata $classMetadata, EntityStub $entity4, EntityStub $entity8, EntityStub $entity15, EntityStub $newEntity) { $classMetadata->getIdentifier()->willReturn(['id']); $repository->findBy(['id' => [4, 8, 15]])->willReturn([$entity4, $entity8, $entity15]); $uow->getDocumentState($document)->willReturn(MongoDBODMUnitOfWork::STATE_MANAGED); $uow->isScheduledForUpdate($document)->willReturn(false); $uow->scheduleForUpdate($document)->shouldBeCalled(); $this->setOwner($document); $this->set(2, $newEntity); }
/** * If the document is new, ignore shard key field value, otherwise throw an exception. * Also, shard key field should be present in actual document data. * * @param object $document * @param string $shardKeyField * @param array $actualDocumentData * * @throws MongoDBException */ private function guardMissingShardKey($document, $shardKeyField, $actualDocumentData) { $dcs = $this->uow->getDocumentChangeSet($document); $isUpdate = $this->uow->isScheduledForUpdate($document); $fieldMapping = $this->class->getFieldMappingByDbFieldName($shardKeyField); $fieldName = $fieldMapping['fieldName']; if ($isUpdate && isset($dcs[$fieldName]) && $dcs[$fieldName][0] != $dcs[$fieldName][1]) { throw MongoDBException::shardKeyFieldCannotBeChanged($shardKeyField, $this->class->getName()); } if (!isset($actualDocumentData[$fieldName])) { throw MongoDBException::shardKeyFieldMissing($shardKeyField, $this->class->getName()); } }
/** * @param $document * @return array * @throws MongoDBException */ public function getShardKeyQuery($document) { $shardKeysQueryPart = array(); $dcs = $this->uow->getDocumentChangeSet($document); $data = $this->uow->getDocumentActualData($document); $md = $this->dm->getMetadataFactory()->getMetadataFor(get_class($document)); $keys = $md->shardKeys; $fieldMappings = $this->dm->getClassMetadata(get_class($document))->fieldMappings; foreach ($keys as $key) { if ($key !== 'id') { $queryKey = $fieldMappings[$key]['name']; } else { $queryKey = '_id'; } //If the document is new, we can ignore shard key value, otherwise throw exception $isUpdate = $this->uow->isScheduledForUpdate($document); if ($isUpdate && isset($dcs[$key]) && $dcs[$key][0] !== null && $dcs[$key][0] != $dcs[$key][1] && (!isset($options['upsert']) || isset($options['upsert']) && $options['upsert'] === true)) { throw MongoDBException::shardKeyChange($key); } if (!isset($data[$key])) { throw MongoDBException::shardKeyMissing($key); } $new = $data[$key]; $mapping = $fieldMappings[$key]; // @Field, @String, @Date, etc. if (!isset($mapping['association'])) { if (isset($new) || $mapping['nullable'] === true) { $shardKeysQueryPart[$queryKey] = is_null($new) ? null : Type::getType($mapping['type'])->convertToDatabaseValue($new); } // @ReferenceOne } elseif (isset($mapping['association']) && $mapping['association'] === ClassMetadata::REFERENCE_ONE && $mapping['isOwningSide']) { if (isset($new) || $mapping['nullable'] === true) { $shardKeysQueryPart[$queryKey] = is_null($new) ? null : $this->pb->prepareReferencedDocumentValue($mapping, $new); } // @ReferenceMany } elseif (isset($mapping['association']) && $mapping['association'] === ClassMetadata::REFERENCE_MANY) { // Do nothing right now } } return $shardKeysQueryPart; }