public function buildStatement($fromId, $direction, $type, $identifier)
{
$type = $this->relationshipEntityMetadata->getType();
$identifier = 'rel_' . $this->relationshipMetadata->getPropertyName() . '_' . $this->relationshipEntityMetadata->getType();
switch ($direction) {
case 'INCOMING':
$pattern = '<-[%s:%s]-';
break;
case 'OUTGOING':
$pattern = '-[%s:%s]->';
break;
case 'BOTH':
$pattern = '-[%s:%s]->';
break;
default:
throw new \LogicException(sprintf('Unsupported relationship direction "%s"', $direction));
}
$relationshipPattern = sprintf($pattern, $identifier, $type);
$query = 'MATCH (start) WHERE id(start) = {id}
MATCH (start)' . $relationshipPattern . '(end)';
if ($this->relationshipMetadata->hasOrderBy()) {
$orderProperty = $this->relationshipMetadata->getOrderByPropery();
$split = explode('.', $orderProperty);
$reMetadata = $this->relationshipEntityMetadata;
if (count($split) > 1) {
$reName = $split[0];
$v = $split[1];
if ($reMetadata->getStartNodePropertyName() === $reName || $reMetadata->getEndNodePropertyName() === $reName) {
$orderProperty = $this->relationshipMetadata->getPropertyName() . '.' . $v;
}
} else {
if (null !== $reMetadata->getPropertyMetadata($this->relationshipMetadata->getOrderByPropery())) {
$orderProperty = $identifier . '.' . $this->relationshipMetadata->getOrderByPropery();
}
}
$query .= ' WITH end, ' . $identifier . ' ORDER BY ' . $orderProperty . ' ' . $this->relationshipMetadata->getOrder();
}
$query .= ' RETURN CASE count(' . $identifier . ') WHEN 0 THEN [] ELSE collect({start:startNode(' . $identifier . '), end:endNode(' . $identifier . '), rel:' . $identifier . '}) END AS ' . $identifier;
//print_r($query);
return Statement::create($query, ['id' => $fromId]);
}