public function convertSqlToJob(SQLTokenIterator $tokens) { if (!$this->canParseTokens($tokens)) { throw new ErrorException("Tried to convert sql function to job entity when token index is not at function!"); } $tokens->seekIndex($tokens->getExclusiveTokenIndex()); $functionJob = new FunctionJob(); $functionJob->setName($tokens->getCurrentTokenString()); if (!$tokens->seekTokenText('(')) { throw new MalformedSqlException("Missing beginning parenthesis for argument-list in function call!", $tokens); } if (!$tokens->seekTokenText(')')) { do { try { while ($this->parameterConditionParser->canParseTokens($tokens)) { $functionJob->addParameter($this->parameterConditionParser->convertSqlToJob($tokens)); } switch (true) { case $this->valueParser->canParseTokens($tokens): $functionJob->addArgumentValue($this->valueParser->convertSqlToJob($tokens)); break; case $this->selectParser->canParseTokens($tokens): $functionJob->addArgumentValue($this->selectParser->convertSqlToJob($tokens)); break; case $tokens->seekTokenText('*'): $functionJob->addArgumentValue('*'); break; default: throw new MalformedSqlException("Invalid argument defintion in function call!", $tokens); } while ($this->parameterConditionParser->canParseTokens($tokens)) { $functionJob->addParameter($this->parameterConditionParser->convertSqlToJob($tokens)); } } catch (\ErrorException $exception) { throw new MalformedSqlException($exception->getMessage(), $tokens); } } while ($tokens->seekTokenText(',')); if (!$tokens->seekTokenText(')')) { throw new MalformedSqlException("Missing ending parenthesis for argument-list in function call!", $tokens); } } return $functionJob; }