/** * @param string $str * @return NQLQuery * @throws SyntaxErrorException */ public static function parse($str) : NQLQuery { /** @var NQLQuery $query */ $query = new NQLQuery(); $match = []; $wasFound = preg_match(self::$regSearchQuery, $str, $match); if ($wasFound) { if (array_key_exists('select', $match) && !empty($match['select'])) { $query->select = Select::parse($match['select']); } else { $query->select = Select::getBlank(); } if (array_key_exists('where', $match)) { $query->where = Where::parse($match['where']); } else { $query->where = Where::getBlank(); } if (array_key_exists('limit', $match) && !empty($match['limit'])) { $query->limit = $match['limit']; } if (array_key_exists('offset', $match) && !empty($match['offset'])) { $query->offset = $match['offset']; } $query->from = From::parse($match['from']); if (array_key_exists('orderby', $match) && !empty($match['orderby'])) { $query->orderBy = OrderBy::parse($match['orderby']); } else { $query->orderBy = OrderBy::getBlank(); } } else { throw new SyntaxErrorException('Incorrect query'); } return $query; }
/** * @param NQLQuery $nqlQuery * @param bool $skipSelection * @return QueryBuilder * @throws SyntaxErrorException */ public function convert(NQLQuery $nqlQuery, bool $skipSelection) : QueryBuilder { $this->checkTables($nqlQuery->getFrom()); /** @var QueryBuilder $query */ $query = $this->em->createQueryBuilder(); /** @var string $columnDefaultAlias */ $columnDefaultAlias = count($nqlQuery->getFrom()->getTables()) === 1 ? $nqlQuery->getFrom()->getTables()[0]->getAlias() : ''; if ($columnDefaultAlias === 'group') { $columnDefaultAlias = '_group'; } if ($skipSelection) { $query->select($columnDefaultAlias); } else { if ($nqlQuery->getSelect()->getColumns()) { /** @var Column $column */ foreach ($nqlQuery->getSelect()->getColumns() as $column) { $query->addSelect(($column->getAlias() ?? $columnDefaultAlias) . '.' . $column->getName()); } } else { $query->select($columnDefaultAlias); } } foreach ($nqlQuery->getFrom()->getTables() as $table) { $query->from($this->entities[strtolower($table->getName())], $table->getAlias()); } if ($nqlQuery->getWhere()->getConditions()) { $paramWhere = $this->getParametrizedWhere($nqlQuery->getWhere()->getConditions(), $columnDefaultAlias); $query->where($paramWhere['clause'])->setParameters($paramWhere['params']); } $columns = $this->getAllColumns($skipSelection ? Select::getBlank() : $nqlQuery->getSelect(), $nqlQuery->getWhere(), $nqlQuery->getOrderBy()); $alreadyJoined = []; foreach ($columns as $column) { if (count($column->getJoinWith())) { $joinWith = $column->getJoinWith(); $iMax = count($joinWith); for ($i = 0; $i < $iMax; $i++) { if (!array_key_exists($joinWith[$i], $alreadyJoined)) { if ($i === 0) { $column = ($column->getAlias() === null ? $columnDefaultAlias : $column->getAlias()) . '.' . $column->getJoinWith()[$i]; } else { $column = $joinWith[$i - 1] . '.' . $joinWith[$i]; } $query->innerJoin($column, $joinWith[$i]); $alreadyJoined[$joinWith[$i]] = null; } } } } /** @var OrderingColumn $column */ foreach ($nqlQuery->getOrderBy()->getColumns() as $column) { $query->addOrderBy((count($column->getJoinWith()) ? $column->getJoinWith()[count($column->getJoinWith()) - 1] : ($column->getAlias() === null ? $columnDefaultAlias : $column->getAlias())) . '.' . $column->getName(), $column->getOrdering()); } if (null !== $nqlQuery->getLimit()) { $query->setMaxResults($nqlQuery->getLimit()); } if (null !== $nqlQuery->getOffset()) { $query->setFirstResult($nqlQuery->getOffset()); } return $query; }