Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions Manager/ConnectionManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ class ConnectionManager implements ConnectionManagerInterface
*
* @throws AlreadyConnectedException When connection from source to destination already exists
*/
public function connect(NodeInterface $source, NodeInterface $destination, $type)
public function connect(NodeInterface $source, NodeInterface $destination, $type, $direction = ConnectionInterface::DIRECTION_TWO_WAYS)
{
$connection = $this->createConnection($source, $destination, $type);
$connection = $this->createConnection($source, $destination, $type, $direction);
$this->getConnectionRepository()->update($connection);

if ($this->dispatcher) {
Expand Down Expand Up @@ -113,11 +113,11 @@ public function destroy(ConnectionInterface $connection)
/**
* {@inheritDoc}
*/
public function areConnected(NodeInterface $nodeA, NodeInterface $nodeB, array $filters = array())
public function areConnected(NodeInterface $nodeA, NodeInterface $nodeB, array $filters = array(), $direction = null)
{
$this->filterValidator->validateFilters($filters);

return $this->getConnectionRepository()->areConnected($nodeA, $nodeB, $filters);
return $this->getConnectionRepository()->areConnected($nodeA, $nodeB, $filters, $direction);
}

/**
Expand Down Expand Up @@ -185,9 +185,9 @@ public function getConnections(NodeInterface $node, array $filters = array())
* @return \Kitano\ConnectionBundle\Model\ConnectionInterface
* @throws \Kitano\ConnectionBundle\Exception\AlreadyConnectedException
*/
protected function createConnection(NodeInterface $source, NodeInterface $destination, $type)
protected function createConnection(NodeInterface $source, NodeInterface $destination, $type, $direction = ConnectionInterface::DIRECTION_TWO_WAYS)
{
if ($this->areConnected($source, $destination, array('type' => $type))) {
if ($this->areConnected($source, $destination, array('type' => $type, 'direction' => $direction))) {
throw new AlreadyConnectedException(
sprintf('Objects %s (%s) and %s (%s) are already connected',
get_class($source),
Expand Down
26 changes: 17 additions & 9 deletions Manager/FilterValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@

use Kitano\ConnectionBundle\Exception\InvalidFilterException;

use Kitano\ConnectionBundle\Model\ConnectionInterface;
use Symfony\Component\Validator\Constraints\Choice;
use Symfony\Component\Validator\Validator;

use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\NotNull;
use Symfony\Component\Validator\Constraints\Type;
Expand All @@ -23,16 +24,23 @@ class FilterValidator
*/
public function validateFilters(array &$filters)
{
$direction = new Choice();
$direction->choices = array(
ConnectionInterface::DIRECTION_ONE_WAY,
ConnectionInterface::DIRECTION_TWO_WAYS
);
$filterConstraint = new Collection(array(
'type' => array(
new NotBlank(),
new NotNull(),
),
'depth' => new Type('integer'),
));
'type' => array(
new NotBlank(),
new NotNull(),
),
'direction' => $direction,
'depth' => new Type('integer'),
));

$filtersDefault = array(
'depth' => 1,
'direction' => ConnectionInterface::DIRECTION_TWO_WAYS,
'depth' => 1
);

$filters = array_merge($filtersDefault, $filters);
Expand All @@ -46,7 +54,7 @@ public function validateFilters(array &$filters)
}
}

public function setValidator(Validator $validator)
public function setValidator(Validator\LegacyValidator $validator)
{
$this->validator = $validator;
}
Expand Down
3 changes: 3 additions & 0 deletions Model/ConnectionInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

interface ConnectionInterface
{
const DIRECTION_ONE_WAY = 'one-way';
const DIRECTION_TWO_WAYS = 'two-ways';

/**
* Returns the Node from where the Connection (edge) start
*
Expand Down
22 changes: 12 additions & 10 deletions Repository/DoctrineMongoDBConnectionRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,18 @@ public function areConnected(NodeInterface $nodeA, NodeInterface $nodeB, array $
{
$qb = $this->createQueryBuilder('Connection');

$qb->addOr(
$qb->expr()
->field("source")->references($nodeA)
->field("destination")->references($nodeB)
)
->addOr(
$qb->expr()
->field("source")->references($nodeB)
->field("destination")->references($nodeA)
) ;
$sourceAExpr = $qb->expr()
->field("source")->references($nodeA)
->field("destination")->references($nodeB);
$sourceBExpr = $qb->expr()
->field("source")->references($nodeB)
->field("destination")->references($nodeA);

$qb->addOr($sourceAExpr);

if (!isset($filters['direction']) || $filters['direction'] == ConnectionInterface::DIRECTION_TWO_WAYS) {
$qb->addOr($sourceBExpr);
}

if (array_key_exists('type', $filters)) {
$qb->field('type')->equals($filters['type']);
Expand Down
31 changes: 19 additions & 12 deletions Repository/DoctrineOrmConnectionRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,19 +136,26 @@ public function areConnected(NodeInterface $nodeA, NodeInterface $nodeB, array $

$queryBuilder = $this->createQueryBuilder('connection');

$queryBuilder->select('COUNT (connection)')
->where(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->andX("connection.sourceObjectId = :nodeAId", "connection.sourceObjectClass = :nodeAClass"),
$queryBuilder->expr()->andX("connection.destinationObjectId = :nodeBId", "connection.destinationObjectClass = :nodeBClass")
),
$queryBuilder->expr()->andX(
$queryBuilder->expr()->andX("connection.sourceObjectId = :nodeBId", "connection.sourceObjectClass = :nodeBClass"),
$queryBuilder->expr()->andX("connection.destinationObjectId = :nodeAId", "connection.destinationObjectClass = :nodeAClass")
)
)
$sourceAExpr = $queryBuilder->expr()->andX(
$queryBuilder->expr()->andX("connection.sourceObjectId = :nodeAId", "connection.sourceObjectClass = :nodeAClass"),
$queryBuilder->expr()->andX("connection.destinationObjectId = :nodeBId", "connection.destinationObjectClass = :nodeBClass")
);
$sourceBExpr = $queryBuilder->expr()->andX(
$queryBuilder->expr()->andX("connection.sourceObjectId = :nodeBId", "connection.sourceObjectClass = :nodeBClass"),
$queryBuilder->expr()->andX("connection.destinationObjectId = :nodeAId", "connection.destinationObjectClass = :nodeAClass")
);

if (!isset($filters['direction']) || $filters['direction'] == ConnectionInterface::DIRECTION_TWO_WAYS) {
$whereExpr = $queryBuilder->expr()->orX(
$sourceAExpr,
$sourceBExpr
);
} else {
$whereExpr = $sourceAExpr;
}

$queryBuilder->select('COUNT (connection)')
->where($whereExpr);

$queryBuilder->setParameters(array(
'nodeAClass' => $nodeAInformations['object_class'],
Expand Down
34 changes: 34 additions & 0 deletions Tests/Repository/DoctrineMongoDBConnectionRepositoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Kitano\ConnectionBundle\Tests\Repository;

use Kitano\ConnectionBundle\Model\ConnectionInterface;
use Kitano\ConnectionBundle\Repository\DoctrineMongoDBConnectionRepository;
use Kitano\ConnectionBundle\Model\NodeInterface;
use Kitano\ConnectionBundle\Tests\MongoDBTestCase;
Expand Down Expand Up @@ -197,6 +198,39 @@ public function testAreConnected()
$this->assertFalse($this->repository->areConnected($node2, $node3, array('type' => self::CONNECTION_TYPE)));
}

/**
* @group odm
*/
public function testAreConnectedOneWay()
{
$node1 = new Node(455);
$node2 = new Node(4412);
$node3 = new Node(4244);

$this->getDocumentManager()->persist($node1);
$this->getDocumentManager()->persist($node2);
$this->getDocumentManager()->persist($node3);
$this->getDocumentManager()->flush();

$connection1 = $this->createConnection($node1, $node2, self::CONNECTION_TYPE, ConnectionInterface::DIRECTION_ONE_WAY);
$connection2 = $this->createConnection($node2, $node1, self::CONNECTION_TYPE, ConnectionInterface::DIRECTION_ONE_WAY);
$connection3 = $this->createConnection($node1, $node3, self::CONNECTION_TYPE, ConnectionInterface::DIRECTION_ONE_WAY);

$this->repository->update($connection1);
$this->repository->update($connection2);
$this->repository->update($connection3);

$filters = array(
'type' => self::CONNECTION_TYPE,
'direction' => ConnectionInterface::DIRECTION_ONE_WAY
);
$this->assertTrue($this->repository->areConnected($node1, $node2, $filters));
$this->assertTrue($this->repository->areConnected($node2, $node1, $filters));
$this->assertTrue($this->repository->areConnected($node1, $node3, $filters));
$this->assertFalse($this->repository->areConnected($node2, $node3, $filters));
$this->assertFalse($this->repository->areConnected($node3, $node1, $filters));
}

/**
* @group odm
*/
Expand Down
34 changes: 34 additions & 0 deletions Tests/Repository/DoctrineOrmConnectionRepositoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Kitano\ConnectionBundle\Tests\Repository;

use Kitano\ConnectionBundle\Model\ConnectionInterface;
use Kitano\ConnectionBundle\Tests\Fixtures\Doctrine\Entity\Node;
use Kitano\ConnectionBundle\Tests\OrmTestCase;
use Kitano\ConnectionBundle\Repository\DoctrineOrmConnectionRepository;
Expand Down Expand Up @@ -199,6 +200,39 @@ public function testAreConnected()
$this->assertFalse($this->repository->areConnected($node2, $node3, array('type' => self::CONNECTION_TYPE)));
}

/**
* @group orm
*/
public function testAreConnectedOneWay()
{
$node1 = new Node(455);
$node2 = new Node(4412);
$node3 = new Node(4244);

$this->getEntityManager()->persist($node1);
$this->getEntityManager()->persist($node2);
$this->getEntityManager()->persist($node3);
$this->getEntityManager()->flush();

$connection1 = $this->createConnection($node1, $node2, self::CONNECTION_TYPE, ConnectionInterface::DIRECTION_ONE_WAY);
$connection2 = $this->createConnection($node2, $node1, self::CONNECTION_TYPE, ConnectionInterface::DIRECTION_ONE_WAY);
$connection3 = $this->createConnection($node1, $node3, self::CONNECTION_TYPE, ConnectionInterface::DIRECTION_ONE_WAY);

$this->repository->update($connection1);
$this->repository->update($connection2);
$this->repository->update($connection3);

$filters = array(
'type' => self::CONNECTION_TYPE,
'direction' => ConnectionInterface::DIRECTION_ONE_WAY
);
$this->assertTrue($this->repository->areConnected($node1, $node2, $filters));
$this->assertTrue($this->repository->areConnected($node2, $node1, $filters));
$this->assertTrue($this->repository->areConnected($node1, $node3, $filters));
$this->assertFalse($this->repository->areConnected($node2, $node3, $filters));
$this->assertFalse($this->repository->areConnected($node3, $node1, $filters));
}

/**
* @group orm
*/
Expand Down