예제 #1
0
 /**
  * INTERNAL:
  * Creates a document. Used for reconstitution of documents during hydration.
  *
  * @ignore
  * @param string $className The name of the document class.
  * @param array $data The data for the document.
  * @param array $hints Any hints to account for during reconstitution/lookup of the document.
  * @param object The document to be hydrated into in case of creation
  * @return object The document instance.
  * @internal Highly performance-sensitive method.
  */
 public function getOrCreateDocument($className, $data, &$hints = array(), $document = null)
 {
     $class = $this->dm->getClassMetadata($className);
     // @TODO figure out how to remove this
     $discriminatorValue = null;
     if (isset($class->discriminatorField, $data[$class->discriminatorField])) {
         $discriminatorValue = $data[$class->discriminatorField];
     } elseif (isset($class->defaultDiscriminatorValue)) {
         $discriminatorValue = $class->defaultDiscriminatorValue;
     }
     if ($discriminatorValue !== null) {
         $className = isset($class->discriminatorMap[$discriminatorValue]) ? $class->discriminatorMap[$discriminatorValue] : $discriminatorValue;
         $class = $this->dm->getClassMetadata($className);
         unset($data[$class->discriminatorField]);
     }
     $id = $class->getDatabaseIdentifierValue($data['_id']);
     $serializedId = serialize($id);
     if (isset($this->identityMap[$class->name][$serializedId])) {
         $document = $this->identityMap[$class->name][$serializedId];
         $oid = spl_object_hash($document);
         if ($document instanceof Proxy && !$document->__isInitialized__) {
             $document->__isInitialized__ = true;
             $overrideLocalValues = true;
             if ($document instanceof NotifyPropertyChanged) {
                 $document->addPropertyChangedListener($this);
             }
         } else {
             $overrideLocalValues = !empty($hints[Query::HINT_REFRESH]);
         }
         if ($overrideLocalValues) {
             $data = $this->hydratorFactory->hydrate($document, $data, $hints);
             $this->originalDocumentData[$oid] = $data;
         }
     } else {
         if ($document === null) {
             $document = $class->newInstance();
         }
         $this->registerManaged($document, $id, $data);
         $oid = spl_object_hash($document);
         $this->documentStates[$oid] = self::STATE_MANAGED;
         $this->identityMap[$class->name][$serializedId] = $document;
         $data = $this->hydratorFactory->hydrate($document, $data, $hints);
         $this->originalDocumentData[$oid] = $data;
     }
     return $document;
 }
예제 #2
0
 /**
  * INTERNAL:
  * Creates an document. Used for reconstitution of documents during hydration.
  *
  * @ignore
  * @param string $className The name of the document class.
  * @param array $data The data for the document.
  * @param array $hints Any hints to account for during reconstitution/lookup of the document.
  * @return object The document instance.
  * @internal Highly performance-sensitive method.
  */
 public function getOrCreateDocument($className, $data, &$hints = array())
 {
     $class = $this->dm->getClassMetadata($className);
     // @TODO figure out how to remove this
     if ($class->discriminatorField) {
         if (isset($data[$class->discriminatorField['name']])) {
             $type = $data[$class->discriminatorField['name']];
             $class = $this->dm->getClassMetadata($class->discriminatorMap[$data[$class->discriminatorField['name']]]);
             unset($data[$class->discriminatorField['name']]);
         }
     }
     $id = $class->getPHPIdentifierValue($data['_id']);
     if (isset($this->identityMap[$class->rootDocumentName][$id])) {
         $document = $this->identityMap[$class->rootDocumentName][$id];
         $oid = spl_object_hash($document);
         if ($document instanceof Proxy && !$document->__isInitialized__) {
             $document->__isInitialized__ = true;
             $overrideLocalValues = true;
             if ($document instanceof NotifyPropertyChanged) {
                 $document->addPropertyChangedListener($this);
             }
         } else {
             $overrideLocalValues = isset($hints[Query::HINT_REFRESH]);
         }
         if ($overrideLocalValues) {
             $data = $this->hydratorFactory->hydrate($document, $data);
             $this->originalDocumentData[$oid] = $data;
         }
     } else {
         $document = $class->newInstance();
         $this->registerManaged($document, $id, $data);
         $oid = spl_object_hash($document);
         $this->documentStates[$oid] = self::STATE_MANAGED;
         $this->identityMap[$class->rootDocumentName][$id] = $document;
         $data = $this->hydratorFactory->hydrate($document, $data);
         $this->originalDocumentData[$oid] = $data;
     }
     return $document;
 }