Skip to content

Commit

Permalink
Fix hydration map
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasell committed May 8, 2015
1 parent d78f0e0 commit cce1f60
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 16 deletions.
45 changes: 29 additions & 16 deletions src/Drivers/Doctrine.php
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,12 @@ public function store($object, $oid = null)
}
switch ($instance->getState()) {
case Instance::STATE_NEW:
// var_dump("NEW " . $class);
$oid = $oid ? : $this->generateObjectId();
$instance->setObjectId($oid);
break;
case Instance::STATE_MANAGED:
// var_dump("MANAGED " . $class);
$oid = $instance->getObjectId();
break;
default:
Expand Down Expand Up @@ -318,8 +320,9 @@ public function delete($object)
case Instance::STATE_MANAGED:
$oid = $instance->getObjectId();
$tableNames = $this->tablesFor($class);
$tableName = $this->link->quoteIdentifier(array_shift($tableNames));
$this->deleteCascade($object);
$this->link->delete(array_shift($tableNames), array($objectIdFieldName => $oid));
$this->link->delete($tableName, array($objectIdFieldName => $oid));
$instance->setState(Instance::STATE_DELETED);
$this->invalidateCacheFor($class);
$this->hydrationMap->detach($object);
Expand All @@ -339,7 +342,7 @@ public function first($class, array $search = array(), array $options = array())
{
$options['limit'] = 1;
return $this->fetch($class, $search, $options)->then(function ($results) use ($class) {
return current($results) ? : When::reject(new Exception('Model not found.'));
return current($results) ? : When::reject(new Exception("{$class} not found."));
});
}

Expand Down Expand Up @@ -386,16 +389,18 @@ public function getObject($class, $oid, $instance = null, $properties = array(),
$values = $this->fetchFromDB($class, $oid, $properties, $db);
$object = $this->hydrateObject($object, $values, $class, $oid, false);
} else {
$object = $this->createObjectPlaceholder($class, $oid, $instance)->then(function ($object) use ($class, $oid, $properties) {
$object = $this->createObjectPlaceholder($class, $oid, $instance)->then(function ($object) use ($class, $oid, $properties, $db) {
$useCache = Configuration::get($class, 'storage.options.cache', $this->domain);
return $this->fetchPropertiesFromCache($class, $oid, $useCache)->then(null, function ($cacheKey) use ($class, $oid, $useCache, $properties) {
$values = $this->fetchFromDB($class, $oid, $properties);
return $this->fetchPropertiesFromCache($class, $oid, $useCache)->then(null, function ($cacheKey) use ($class, $oid, $useCache, $properties, $db) {
$values = $this->fetchFromDB($class, $oid, $properties, $db);
return $this->storePropertiesToCache($cacheKey, $values, $useCache);
})->then(function ($values) use ($object, $class, $oid, $properties) {
return $this->hydrateObject($object, $values, $class, $oid);
});
});
}
} elseif ($object && !$hydrate) {
$this->hydrationMap->getInstance($object)->setObject($object);
}
return ($object instanceof Promise) ? $object : When::resolve($object);
}
Expand Down Expand Up @@ -462,6 +467,8 @@ protected function select($class, array $search = array(), array $options = arra
return $this->denormalizeSearch($queryBuilder, array($search), $class)->then(function($where) use ($queryBuilder, $options) {
$queryBuilder->where($where);
$this->applyOptions($queryBuilder, $options);
// var_dump($queryBuilder->getSql());
// var_dump($queryBuilder->getParameters());
return $queryBuilder->execute();
});
}
Expand Down Expand Up @@ -668,19 +675,19 @@ protected function denormalizeCondition($queryBuilder, $property, $condition, $c
return $this->denormalizeValue($v, $property, $class)->then(function ($value) use ($queryBuilder, $property, $class) {
$field = $this->link->quoteIdentifier($property);
$subQueryBuilder = $this->link->createQueryBuilder();
$objectIdFieldName = Configuration::get($class, 'storage.options.oid', $this->domain) ? : self::OBJECTID_FIELD_NAME;
$tableAlias = $this->link->quoteIdentifier('t');
$oidIdentifier = $this->link->quoteIdentifier($objectIdFieldName);
$projection = "$tableAlias.$oidIdentifier";
if($value) {
$subQueryBuilder
->add('select', $queryBuilder->getQueryPart('select'))
->add('from', $queryBuilder->getQueryPart('from'))
->add('join', $queryBuilder->getQueryPart('join'))
->where($queryBuilder->expr()->eq($field, $queryBuilder->createNamedParameter($value)));
} else {
$objectIdFieldName = Configuration::get($class, 'storage.options.oid', $this->domain) ? : self::OBJECTID_FIELD_NAME;
$tableNames = $this->tablesFor($class);
$tableName = $this->link->quoteIdentifier(array_shift($tableNames));
$tableAlias = $this->link->quoteIdentifier('t');
$oidIdentifier = $this->link->quoteIdentifier($objectIdFieldName);
$projection = "$tableAlias.$oidIdentifier";
$subQueryBuilder->select($projection)->groupBy($projection)->from($tableName, $tableAlias)->add('join', $queryBuilder->getQueryPart('join'))->where($queryBuilder->expr()->isNull($field));
// $subQueryBuilder
// ->add('select', $queryBuilder->getQueryPart('select') . $oidIdentifier)
Expand All @@ -689,7 +696,7 @@ protected function denormalizeCondition($queryBuilder, $property, $condition, $c
// ->where($queryBuilder->expr()->isNull($field));
}
// TODO vvvvv -> guess alias and identifier
return "t._id NOT IN (" . $subQueryBuilder->getSQL() . ")";
return "{$projection} NOT IN (" . $subQueryBuilder->getSQL() . ")";
});
case '$regex':
return $this->denormalizeValue($v, $property, $class)->then(function ($v) use ($queryBuilder, $property) {
Expand All @@ -710,18 +717,24 @@ protected function denormalizeCondition($queryBuilder, $property, $condition, $c
);
});
case '$all':
return $this->denormalizeValue($v, $property, $class)->then(function ($value) use ($queryBuilder, $property) {
return $this->denormalizeValue($v, $property, $class)->then(function ($value) use ($queryBuilder, $property, $class) {
if ($value) {
$field = $this->link->quoteIdentifier($property);
$all = array_map(function ($value) use ($queryBuilder, $field) {
$all = array_map(function ($value) use ($queryBuilder, $field, $class) {
$objectIdFieldName = Configuration::get($class, 'storage.options.oid', $this->domain) ? : self::OBJECTID_FIELD_NAME;
$tableNames = $this->tablesFor($class);
$tableName = $this->link->quoteIdentifier(array_shift($tableNames));
$tableAlias = $this->link->quoteIdentifier('t');
$oidIdentifier = $this->link->quoteIdentifier($objectIdFieldName);
$projection = "$tableAlias.$oidIdentifier";
$subQueryBuilder = $this->link->createQueryBuilder();
$subQueryBuilder
->add('select', $queryBuilder->getQueryPart('select'))
->add('from', $queryBuilder->getQueryPart('from'))
$subQueryBuilder->select($projection)
->groupBy($projection)
->from($tableName, $tableAlias)
->add('join', $queryBuilder->getQueryPart('join'))
->where($queryBuilder->expr()->eq($field, $queryBuilder->createNamedParameter($value)));
// TODO vvvvv -> guess alias and identifier
return 't._id IN (' . $subQueryBuilder->getSQL() . ')';
return "{$projection} IN (" . $subQueryBuilder->getSQL() . ")";
}, $value);
return implode(' AND ', $all);
}
Expand Down
8 changes: 8 additions & 0 deletions src/Hydration/Instance.php
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,14 @@ public function getModifiedProperties($object)
if ($this->state === self::STATE_NEW) {
return $this->getProperties($object);
}
// $o = json_encode($this->originalObject, JSON_PRETTY_PRINT);
// $o = json_decode($o, true);
// $o['notes'] = array();
// var_dump(__LINE__, json_encode($o, JSON_PRETTY_PRINT));
// $ob = json_encode($object, JSON_PRETTY_PRINT);
// $ob = json_decode($ob, true);
// $ob['notes'] = array();
// var_dump(__LINE__, json_encode($ob, JSON_PRETTY_PRINT));
$modifiedProperties = array();
foreach ($this->reflector->getProperties() as $property) {
$property->setAccessible(true);
Expand Down
1 change: 1 addition & 0 deletions src/Manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public static function factory($url, $options = array(), $domain = '__default__'
'drivers' => array(
'mongodb' => 'Bread\Storage\Drivers\MongoDB',
'mysql' => 'Bread\Storage\Drivers\Doctrine',
'sqlsrv' => 'Bread\Storage\Drivers\Doctrine',
'db2' => 'Bread\Storage\Drivers\Doctrine',
'ldap' => 'Bread\Storage\Drivers\LDAP'
)
Expand Down

0 comments on commit cce1f60

Please sign in to comment.