/**
  * Returns a SQL string in a readable human-friendly format.
  *
  * @param string $sql
  *
  * @return string
  */
 public function format($sql)
 {
     $this->reset();
     $tab = "\t";
     $originalTokens = $this->tokenizer->tokenize((string) $sql);
     $tokens = WhiteSpace::removeTokenWhitespace($originalTokens);
     foreach ($tokens as $i => $token) {
         $queryValue = $token[Tokenizer::TOKEN_VALUE];
         $this->indentation->increaseSpecialIndent()->increaseBlockIndent();
         $addedNewline = $this->newLine->addNewLineBreak($tab);
         if ($this->comment->stringHasCommentToken($token)) {
             $this->formattedSql = $this->comment->writeCommentBlock($token, $tab, $queryValue);
             continue;
         }
         if ($this->parentheses->getInlineParentheses()) {
             if ($this->parentheses->stringIsClosingParentheses($token)) {
                 $this->parentheses->writeInlineParenthesesBlock($tab, $queryValue);
                 continue;
             }
             $this->newLine->writeNewLineForLongCommaInlineValues($token);
             $this->inlineCount += strlen($token[Tokenizer::TOKEN_VALUE]);
         }
         switch ($token) {
             case $this->parentheses->stringIsOpeningParentheses($token):
                 $tokens = $this->formatOpeningParenthesis($token, $i, $tokens, $originalTokens);
                 break;
             case $this->parentheses->stringIsClosingParentheses($token):
                 $this->indentation->decreaseIndentLevelUntilIndentTypeIsSpecial($this);
                 $this->newLine->addNewLineBeforeToken($addedNewline, $tab);
                 break;
             case $this->stringIsEndOfLimitClause($token):
                 $this->clauseLimit = false;
                 break;
             case $token[Tokenizer::TOKEN_VALUE] === ',' && false === $this->parentheses->getInlineParentheses():
                 $this->newLine->writeNewLineBecauseOfComma();
                 break;
             case Token::isTokenTypeReservedTopLevel($token):
                 $queryValue = $this->formatTokenTypeReservedTopLevel($addedNewline, $tab, $token, $queryValue);
                 break;
             case $this->newLine->isTokenTypeReservedNewLine($token):
                 $this->newLine->addNewLineBeforeToken($addedNewline, $tab);
                 if (WhiteSpace::tokenHasExtraWhiteSpaces($token)) {
                     $queryValue = preg_replace('/\\s+/', ' ', $queryValue);
                 }
                 break;
         }
         $this->formatBoundaryCharacterToken($token, $i, $tokens, $originalTokens);
         $this->formatWhiteSpaceToken($token, $queryValue);
         $this->formatDashToken($token, $i, $tokens);
     }
     return trim(str_replace(array("\t", " \n"), array($this->tab, "\n"), $this->formattedSql)) . "\n";
 }
示例#2
0
    /**
     * @test
     */
    public function itShouldTokenizeFunction()
    {
        $sql = <<<SQL
SELECT customer_id, customer_name, COUNT(order_id) as total FROM customers GROUP BY customer_id, customer_name
HAVING COUNT(order_id) > 5 ORDER BY COUNT(order_id) DESC;
SQL;
        $result = $this->tokenizer->tokenize($sql);
        $functionFound = false;
        foreach ($result as $token) {
            if ('COUNT' === $token[Tokenizer::TOKEN_VALUE]) {
                $functionFound = true;
                break;
            }
        }
        $this->assertTrue($functionFound);
    }