コード例 #1
0
 /**
  * @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;
 }
コード例 #2
0
 /**
  * @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;
 }