Skip to content

Commit

Permalink
Allow multiples document managers in model manager
Browse files Browse the repository at this point in the history
  • Loading branch information
EmmanuelVella committed Mar 29, 2014
1 parent fda3890 commit bc8ad7d
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 30 deletions.
77 changes: 49 additions & 28 deletions Model/ModelManager.php
Expand Up @@ -19,34 +19,34 @@
use Sonata\AdminBundle\Admin\FieldDescriptionInterface;
use Sonata\AdminBundle\Datagrid\DatagridInterface;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Doctrine\ODM\MongoDB\DocumentManager;
use Doctrine\ODM\MongoDB\Query\Builder;

use Symfony\Bridge\Doctrine\ManagerRegistry;
use Symfony\Component\Form\Exception\PropertyAccessDeniedException;

use Exporter\Source\DoctrineODMQuerySourceIterator;

class ModelManager implements ModelManagerInterface
{
protected $documentManager;
protected $registry;

const ID_SEPARATOR = '-';

/**
*
* @param \Doctrine\ODM\MongoDB\DocumentManager $documentManager
* @param \Symfony\Bridge\Doctrine\ManagerRegistry $registry
*/
public function __construct(DocumentManager $documentManager)
public function __construct(ManagerRegistry $registry)
{
$this->documentManager = $documentManager;
$this->registry = $registry;
}

/**
* {@inheritdoc}
*/
public function getMetadata($class)
{
return $this->documentManager->getMetadataFactory()->getMetadataFor($class);
return $this->getDocumentManager($class)->getMetadataFactory()->getMetadataFor($class);
}

/**
Expand Down Expand Up @@ -83,7 +83,7 @@ public function getParentMetadataForProperty($baseClass, $propertyFullName)
*/
public function hasMetadata($class)
{
return $this->documentManager->getMetadataFactory()->hasMetadataFor($class);
return $this->getDocumentManager($class)->getMetadataFactory()->hasMetadataFor($class);
}

/**
Expand Down Expand Up @@ -127,26 +127,29 @@ public function getNewFieldDescriptionInstance($class, $name, array $options = a
*/
public function create($object)
{
$this->documentManager->persist($object);
$this->documentManager->flush();
$documentManager = $this->getDocumentManager($object);
$documentManager->persist($object);
$documentManager->flush();
}

/**
* {@inheritdoc}
*/
public function update($object)
{
$this->documentManager->persist($object);
$this->documentManager->flush();
$documentManager = $this->getDocumentManager($object);
$documentManager->persist($object);
$documentManager->flush();
}

/**
* {@inheritdoc}
*/
public function delete($object)
{
$this->documentManager->remove($object);
$this->documentManager->flush();
$documentManager = $this->getDocumentManager($object);
$documentManager->remove($object);
$documentManager->flush();
}

/**
Expand All @@ -158,40 +161,56 @@ public function find($class, $id)
return null;
}

$documentManager = $this->getDocumentManager($class);

if (is_numeric($id)) {

$value = $this->documentManager->getRepository($class)->find(intval($id));
$value = $documentManager->getRepository($class)->find(intval($id));

if (!empty($value)) {
return $value;
}
}

return $this->documentManager->getRepository($class)->find($id);
return $documentManager->getRepository($class)->find($id);
}

/**
* {@inheritdoc}
*/
public function findBy($class, array $criteria = array())
{
return $this->documentManager->getRepository($class)->findBy($criteria);
return $this->getDocumentManager($class)->getRepository($class)->findBy($criteria);
}

/**
* {@inheritdoc}
*/
public function findOneBy($class, array $criteria = array())
{
return $this->documentManager->getRepository($class)->findOneBy($criteria);
return $this->getDocumentManager($class)->getRepository($class)->findOneBy($criteria);
}

/**
* @return DocumentManager
* @param string $class
*
* @throw \RuntimeException
*
* @return \Doctrine\ODM\MongoDB\DocumentManager
*/
public function getDocumentManager()
public function getDocumentManager($class)
{
return $this->documentManager;
if (is_object($class)) {
$class = get_class($class);
}

$dm = $this->registry->getManagerForClass($class);

if (!$dm) {
throw new \RuntimeException(sprintf('No document manager defined for class %s', $class));
}

return $dm;
}

/**
Expand All @@ -217,7 +236,7 @@ public function getParentFieldDescription($parentAssociationMapping, $class)
*/
public function createQuery($class, $alias = 'o')
{
$repository = $this->getDocumentManager()->getRepository($class);
$repository = $this->getDocumentManager($class)->getRepository($class);

return new ProxyQuery($repository->createQueryBuilder());
}
Expand Down Expand Up @@ -247,7 +266,7 @@ public function getModelIdentifier($class)
*/
public function getIdentifierValues($document)
{
return array($this->documentManager->getUnitOfWork()->getDocumentIdentifier($document));
return array($this->getDocumentManager($document)->getUnitOfWork()->getDocumentIdentifier($document));
}

/**
Expand All @@ -268,7 +287,7 @@ public function getNormalizedIdentifier($document)
}

// the entities is not managed
if (!$document || !$this->getDocumentManager()->getUnitOfWork()->isInIdentityMap($document)) {
if (!$document || !$this->getDocumentManager($document)->getUnitOfWork()->isInIdentityMap($document)) {
return null;
}

Expand Down Expand Up @@ -302,18 +321,20 @@ public function batchDelete($class, ProxyQueryInterface $queryProxy)
/** @var Query $queryBuilder */
$queryBuilder = $queryProxy->getQuery();

$documentManager = $this->getDocumentManager($class);

$i = 0;
foreach ($queryBuilder->execute() as $object) {
$this->documentManager->remove($object);
$documentManager->remove($object);

if ((++$i % 20) == 0) {
$this->documentManager->flush();
$this->documentManager->clear();
$documentManager->flush();
$documentManager->clear();
}
}

$this->documentManager->flush();
$this->documentManager->clear();
$documentManager->flush();
$documentManager->clear();
}

/**
Expand Down
2 changes: 1 addition & 1 deletion Resources/config/doctrine_mongodb.xml
Expand Up @@ -7,7 +7,7 @@
<services>

<service id="sonata.admin.manager.doctrine_mongodb" class="Sonata\DoctrineMongoDBAdminBundle\Model\ModelManager">
<argument type="service" id="doctrine.odm.mongodb.document_manager" on-invalid="ignore" />
<argument type="service" id="doctrine_mongodb" on-invalid="ignore" />
</service>

<!-- FormBuilder -->
Expand Down
2 changes: 1 addition & 1 deletion Tests/Model/ModelManagerTest.php
Expand Up @@ -18,7 +18,7 @@ class ModelManagerTest extends \PHPUnit_Framework_TestCase
{
public function testFilterEmpty()
{
$registry = $this->getMockBuilder('Doctrine\ODM\MongoDB\DocumentManager')
$registry = $this->getMockBuilder('Symfony\Bridge\Doctrine\ManagerRegistry')
->disableOriginalConstructor()
->getMock();

Expand Down

0 comments on commit bc8ad7d

Please sign in to comment.