/** * @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 string $str * @return OrderBy * @throws SyntaxErrorException */ public static function parse($str) : OrderBy { /** @var OrderBy $orderBy */ $orderBy = new OrderBy(); $exploded = explode(',', $str); $columns = []; foreach ($exploded as $item) { $item = trim($item); $args = explode(' ', $item); if (count($args) !== 2) { throw new SyntaxErrorException('Error in order by part'); } $col = $args[0]; /** @noinspection MultiAssignmentUsageInspection */ $ordering = $args[1]; if (strcasecmp($ordering, 'ASC') !== 0 && strcasecmp($ordering, 'DESC') !== 0) { throw new SyntaxErrorException('Unknown order by direction'); } $column = OrderingColumn::parse($col, $ordering); $columns[] = $column; } $orderBy->setColumns($columns); return $orderBy; }
/** * @param Select $select * @param Where $where * @param OrderBy $orderBy * @return Column[] */ private function getAllColumns(Select $select, Where $where, OrderBy $orderBy) : array { $columns = []; foreach ($select->getColumns() as $column) { $columns[$column->getFullName()] = $column; } $whereColumns = $this->getAllColumnsFromWhere($where->getConditions()); foreach ($whereColumns as $column) { $columns[$column->getFullName()] = $column; } foreach ($orderBy->getColumns() as $column) { $columns[$column->getFullName()] = $column; } return $columns; }