public function findOnPath($pathStartingPoint, $pathEndPoint, Workspace $workspace, array $dimensions = null, $includeRemovedNodes = false, $nodeTypeFilter = null)
{
$pathStartingPoint = strtolower($pathStartingPoint);
$pathEndPoint = strtolower($pathEndPoint);
if (NodePaths::isSubPathOf($pathStartingPoint, $pathEndPoint) === false) {
throw new \InvalidArgumentException('Invalid paths: path of starting point must be first part of end point path.', 1284391181);
}
$workspaces = $this->collectWorkspaceAndAllBaseWorkspaces($workspace);
$queryBuilder = $this->createQueryBuilder($workspaces);
if ($dimensions !== null) {
$this->addDimensionJoinConstraintsToQueryBuilder($queryBuilder, $dimensions);
} else {
$dimensions = [];
}
if ($nodeTypeFilter !== null) {
$this->addNodeTypeFilterConstraintsToQueryBuilder($queryBuilder, $nodeTypeFilter);
}
$pathConstraints = [];
$constraintPath = $pathStartingPoint;
$pathConstraints[] = md5($constraintPath);
$pathSegments = explode('/', NodePaths::getRelativePathBetween($pathStartingPoint, $pathEndPoint));
foreach ($pathSegments as $pathSegment) {
$constraintPath = NodePaths::addNodePathSegment($constraintPath, $pathSegment);
$pathConstraints[] = md5($constraintPath);
}
if (count($pathConstraints) > 0) {
$queryBuilder->andWhere('n.pathHash IN (:paths)')->setParameter('paths', $pathConstraints);
}
$query = $queryBuilder->getQuery();
$foundNodes = $query->getResult();
$foundNodes = $this->reduceNodeVariantsByWorkspacesAndDimensions($foundNodes, $workspaces, $dimensions);
$foundNodes = $this->filterNodeDataByBestMatchInContext($foundNodes, $workspaces[0], $dimensions, $includeRemovedNodes);
if ($includeRemovedNodes === false) {
$foundNodes = $this->filterRemovedNodes($foundNodes, false);
}
$nodesByDepth = [];
/** @var NodeData $node */
foreach ($foundNodes as $node) {
$nodesByDepth[$node->getDepth()] = $node;
}
ksort($nodesByDepth);
return array_values($nodesByDepth);
}