/** * Returns a QueryBuilder of nodes that must be moved to the right * * @param \Doctrine\ORM\QueryBuilder $siblingQueryBuilder * @param \DoctrineExtensions\Hierarchical\MaterializedPath\MaterializedPathNodeInfo $node * @return \Doctrine\ORM\QueryBuilder */ public function getSortedPosQueryBuilder(\Doctrine\ORM\QueryBuilder $siblingQueryBuilder, MaterializedPathNodeInfo $node) { $entity = $node->unwrap(); $qb = $siblingQueryBuilder; $expr = $qb->expr(); $fields = $ands = array(); foreach ($entity->getNodeOrderBy() as $field) { $value = $this->classMetadata->reflFields[$field]->getValue($entity); $andX = $qb->expr(); foreach ($fields as $f => $v) { $andX->add($expr->eq('e.' . $f, $v)); } $andX->add($expr->gt('e.' . $field, $value)); $ands[] = $andX; $fields[$field] = $value; } if (!empty($ands)) { $orX = $qb->expr(); foreach ($ands as $andX) { $orX->add($andX); } $qb->andWhere($orX); } return $qb; }