/**
* Construct an entity object
*
* @param ClassMetadata $class
* @param object $document
*/
public function hydrateEntity(ClassMetadata $class, $document)
{
// TODO: add support for different result set types from different clients
// perhaps by wrapping documents in a layer of abstraction
$data = $document->getData();
$fields = array_merge($document->hasFields() ? $document->getFields() : array(), array('_version' => $document->getVersion()));
foreach ($fields as $name => $value) {
if (isset($class->parameters[$name])) {
$data[$name] = $value;
} else {
foreach ($class->parameters as $param => $mapping) {
if ($mapping->name == $name) {
$data[$param] = $value;
break;
}
}
}
}
$data[$class->getIdentifier()] = $document->getId();
if (method_exists($document, 'getScore')) {
$data['score'] = $document->getScore();
}
$entity = $this->sm->getSerializer()->deserialize($class->className, json_encode($data));
if ($this->evm->hasListeners(Events::postLoad)) {
$this->evm->dispatchEvent(Events::postLoad, new Event\LifecycleEventArgs($entity, $this->sm));
}
return $entity;
}