/** * {@inheritDoc} */ public function getQuery(QueryBuilder $builder) { $this->aliasWithTranslatedFields = array(); $this->locale = $builder->getLocale(); if (null === $this->locale && $this->dm->hasLocaleChooserStrategy()) { $this->locale = $this->dm->getLocaleChooserStrategy()->getLocale(); } $from = $builder->getChildrenOfType(QBConstants::NT_FROM); if (!$from) { throw new RuntimeException('No From (source) node in query'); } $dispatches = array(QBConstants::NT_FROM, QBConstants::NT_SELECT, QBConstants::NT_WHERE, QBConstants::NT_ORDER_BY); foreach ($dispatches as $dispatchType) { $this->dispatchMany($builder->getChildrenOfType($dispatchType)); } if (count($this->sourceDocumentNodes) > 1 && null === $builder->getPrimaryAlias()) { throw new InvalidArgumentException('You must specify a primary alias when selecting from multiple document sources' . 'e.g. $qb->from(\'a\') ...'); } // for each document source add phpcr:{class,classparents} restrictions foreach ($this->sourceDocumentNodes as $sourceNode) { $documentFqn = $this->aliasMetadata[$sourceNode->getAlias()]->getName(); $odmClassConstraints = $this->qomf->orConstraint($this->qomf->comparison($this->qomf->propertyValue($sourceNode->getAlias(), 'phpcr:class'), QOMConstants::JCR_OPERATOR_EQUAL_TO, $this->qomf->literal($documentFqn)), $this->qomf->comparison($this->qomf->propertyValue($sourceNode->getAlias(), 'phpcr:classparents'), QOMConstants::JCR_OPERATOR_EQUAL_TO, $this->qomf->literal($documentFqn))); if ($this->constraint) { $this->constraint = $this->qomf->andConstraint($this->constraint, $odmClassConstraints); } else { $this->constraint = $odmClassConstraints; } } foreach (array_keys($this->aliasWithTranslatedFields) as $alias) { $this->translator[$alias]->alterQueryForTranslation($this->qomf, $this->from, $this->constraint, $alias, $this->locale); } $phpcrQuery = $this->qomf->createQuery($this->from, $this->constraint, $this->orderings, $this->columns); $query = new Query($phpcrQuery, $this->dm, $builder->getPrimaryAlias()); if ($firstResult = $builder->getFirstResult()) { $query->setFirstResult($firstResult); } if ($maxResults = $builder->getMaxResults()) { $query->setMaxResults($maxResults); } return $query; }