bug fixes and better response handling

This commit is contained in:
Dennis Eichhorn 2019-05-07 20:00:30 +02:00
parent 7eb8322d71
commit 5965f2a4ca
15 changed files with 62 additions and 71 deletions

View File

@ -194,48 +194,19 @@ abstract class GrammarAbstract
* *
* @param array $elements Elements * @param array $elements Elements
* @param string $prefix Prefix for table * @param string $prefix Prefix for table
* @param string $column Is always column?
* *
* @return string * @return string
* *
* @since 1.0.0 * @since 1.0.0
*/ */
protected function expressionizeTableColumn(array $elements, string $prefix = '') : string protected function expressionizeTableColumn(array $elements, string $prefix = '', bool $column = true) : string
{
$expression = '';
foreach ($elements as $key => $element) {
if (\is_string($element) && $element !== '*') {
$expression .= $this->compileSystem($element, $prefix) . ', ';
} elseif (\is_string($element) && $element === '*') {
$expression .= '*, ';
} elseif ($element instanceof \Closure) {
$expression .= $element() . ', ';
} elseif ($element instanceof BuilderAbstract) {
$expression .= $element->toSql() . ', ';
} else {
throw new \InvalidArgumentException();
}
}
return \rtrim($expression, ', ');
}
/**
* Expressionize elements.
*
* @param array $elements Elements
* @param string $prefix Prefix for table
*
* @return string
*
* @since 1.0.0
*/
protected function expressionizeTable(array $elements, string $prefix = '') : string
{ {
$expression = ''; $expression = '';
foreach ($elements as $key => $element) { foreach ($elements as $key => $element) {
if (\is_string($element) && $element !== '*') { if (\is_string($element) && $element !== '*') {
$prefix = \stripos($element, '.') !== false || $column ? $prefix : '';
$expression .= $this->compileSystem($element, $prefix) . ', '; $expression .= $this->compileSystem($element, $prefix) . ', ';
} elseif (\is_string($element) && $element === '*') { } elseif (\is_string($element) && $element === '*') {
$expression .= '*, '; $expression .= '*, ';

View File

@ -130,7 +130,7 @@ class Grammar extends GrammarAbstract
*/ */
protected function compileSelects(Builder $query, array $columns) : string protected function compileSelects(Builder $query, array $columns) : string
{ {
$expression = $this->expressionizeTableColumn($columns, $query->getPrefix()); $expression = $this->expressionizeTableColumn($columns, $query->getPrefix(), false);
if ($expression === '') { if ($expression === '') {
$expression = '*'; $expression = '*';
@ -151,7 +151,7 @@ class Grammar extends GrammarAbstract
*/ */
protected function compileUpdates(Builder $query, array $table) : string protected function compileUpdates(Builder $query, array $table) : string
{ {
$expression = $this->expressionizeTable($table, $query->getPrefix()); $expression = $this->expressionizeTableColumn($table, $query->getPrefix());
if ($expression === '') { if ($expression === '') {
return ''; return '';
@ -187,7 +187,7 @@ class Grammar extends GrammarAbstract
*/ */
protected function compileFrom(Builder $query, array $table) : string protected function compileFrom(Builder $query, array $table) : string
{ {
$expression = $this->expressionizeTable($table, $query->getPrefix()); $expression = $this->expressionizeTableColumn($table, $query->getPrefix());
if ($expression === '') { if ($expression === '') {
return ''; return '';
@ -245,12 +245,10 @@ class Grammar extends GrammarAbstract
} }
if (\is_string($element['column'])) { if (\is_string($element['column'])) {
// handle bug when no table is specified in the where column // No prefix if it is ONLY a field
if (\count($query->from) === 1 && \stripos($element['column'], '.') === false) { $prefix = \stripos($element['column'], '.') === false ? '' : $query->getPrefix();
$element['column'] = $query->from[0] . '.' . $element['column'];
}
$expression .= $this->compileSystem($element['column'], $query->getPrefix()); $expression .= $this->compileSystem($element['column'], $prefix);
} elseif ($element['column'] instanceof \Closure) { } elseif ($element['column'] instanceof \Closure) {
$expression .= $element['column'](); $expression .= $element['column']();
} elseif ($element['column'] instanceof Builder) { } elseif ($element['column'] instanceof Builder) {
@ -318,6 +316,12 @@ class Grammar extends GrammarAbstract
return $this->compileSystem($value->getColumn(), $prefix); return $this->compileSystem($value->getColumn(), $prefix);
} elseif ($value instanceof Builder) { } elseif ($value instanceof Builder) {
return '(' . \rtrim($value->toSql(), ';') . ')'; return '(' . \rtrim($value->toSql(), ';') . ')';
} elseif ($value instanceof \JsonSerializable) {
$encoded = \json_encode($value);
return $encoded ? $encoded : null;
} elseif ($value instanceof \Serializable) {
return $element->serialize();
} else { } else {
throw new \InvalidArgumentException(\gettype($value)); throw new \InvalidArgumentException(\gettype($value));
} }
@ -591,8 +595,7 @@ class Grammar extends GrammarAbstract
$vals = ''; $vals = '';
foreach ($values as $column => $value) { foreach ($values as $column => $value) {
// todo change expressionizeTableColumn to accept single column and create additionl for Columns $expression = $this->expressionizeTableColumn([$column], $query->getPrefix(), false);
$expression = $this->expressionizeTableColumn([$column], $query->getPrefix());
$vals .= $expression . ' = ' . $this->compileValue($query, $value) . ', '; $vals .= $expression . ' = ' . $this->compileValue($query, $value) . ', ';
} }

View File

@ -113,7 +113,7 @@ class Grammar extends QueryGrammar
*/ */
protected function compileCreateTable(BuilderAbstract $query, string $table) : string protected function compileCreateTable(BuilderAbstract $query, string $table) : string
{ {
return 'CREATE TABLE ' . $this->expressionizeTable([$table], $query->getPrefix()); return 'CREATE TABLE ' . $this->expressionizeTableColumn([$table], $query->getPrefix());
} }
/** /**

View File

@ -116,7 +116,7 @@ class MysqlGrammar extends Grammar
&& !empty($field['foreignTable']) && !empty($field['foreignKey']) && !empty($field['foreignTable']) && !empty($field['foreignKey'])
) { ) {
$keys .= ' FOREIGN KEY (' . $this->expressionizeTableColumn([$name], '') . ') REFERENCES ' $keys .= ' FOREIGN KEY (' . $this->expressionizeTableColumn([$name], '') . ') REFERENCES '
. $this->expressionizeTable([$field['foreignTable']], $query->getPrefix()) . $this->expressionizeTableColumn([$field['foreignTable']], $query->getPrefix())
. ' (' . $this->expressionizeTableColumn([$field['foreignKey']], '') . '),'; . ' (' . $this->expressionizeTableColumn([$field['foreignKey']], '') . '),';
} }
} }

View File

@ -134,14 +134,18 @@ final class Header extends HeaderAbstract
/** /**
* Get header by name. * Get header by name.
* *
* @param string $key Header key * @param null|string $key Header key
* *
* @return array * @return array
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function get(string $key) : array public function get(string $key = null) : array
{ {
if ($key === null) {
return $this->header;
}
return $this->header[\strtolower($key)] ?? []; return $this->header[\strtolower($key)] ?? [];
} }

View File

@ -90,19 +90,21 @@ final class Response extends ResponseAbstract implements RenderableInterface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function getBody() : string public function getBody(bool $optimize = false) : string
{ {
return $this->render(); return $this->render($optimize);
} }
/** /**
* Generate response based on header. * Generate response based on header.
* *
* @param bool $optimize Optimize response / minify
*
* @return string * @return string
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function render() : string public function render(bool $optimize = false) : string
{ {
$types = $this->header->get('Content-Type'); $types = $this->header->get('Content-Type');
@ -112,19 +114,21 @@ final class Response extends ResponseAbstract implements RenderableInterface
} }
} }
return $this->getRaw(); return $this->getRaw($optimize);
} }
/** /**
* Generate raw response. * Generate raw response.
* *
* @param bool $optimize Optimize response / minify
*
* @return string * @return string
* *
* @throws \Exception this exception is thrown if the response cannot be rendered * @throws \Exception this exception is thrown if the response cannot be rendered
* *
* @since 1.0.0 * @since 1.0.0
*/ */
private function getRaw() : string private function getRaw(bool $optimize = false) : string
{ {
$render = ''; $render = '';

View File

@ -207,7 +207,7 @@ abstract class HeaderAbstract
/** /**
* Get header by key. * Get header by key.
* *
* @param string $key Header key * @param null|string $key Header key
* *
* @return array * @return array
* *

View File

@ -45,7 +45,6 @@ final class Header extends HeaderAbstract
*/ */
public function __construct() public function __construct()
{ {
$this->set('Content-Type', 'text/html; charset=utf-8');
parent::__construct(); parent::__construct();
} }

View File

@ -90,27 +90,29 @@ final class Response extends ResponseAbstract implements RenderableInterface
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function getBody() : string public function getBody(bool $optimize = false) : string
{ {
return $this->render(); return $this->render($optimize);
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function getJson() : array public function getJsonData() : array
{ {
return \json_decode($this->render(), true); return \json_decode($this->getRaw(), true);
} }
/** /**
* Generate response based on header. * Generate response based on header.
* *
* @param bool $optimize Optimize response / minify
*
* @return string * @return string
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public function render() : string public function render(bool $optimize = false) : string
{ {
$types = $this->header->get('Content-Type'); $types = $this->header->get('Content-Type');
@ -120,19 +122,21 @@ final class Response extends ResponseAbstract implements RenderableInterface
} }
} }
return $this->getRaw(); return $this->getRaw($optimize);
} }
/** /**
* Generate raw response. * Generate raw response.
* *
* @param bool $optimize Optimize response / minify
*
* @return string * @return string
* *
* @throws \Exception * @throws \Exception
* *
* @since 1.0.0 * @since 1.0.0
*/ */
private function getRaw() : string private function getRaw(bool $optimize = false) : string
{ {
$render = ''; $render = '';
@ -140,7 +144,11 @@ final class Response extends ResponseAbstract implements RenderableInterface
$render .= StringUtils::stringify($response); $render .= StringUtils::stringify($response);
} }
return $this->removeWhitespaceAndLineBreak($render); if ($optimize) {
return $this->removeWhitespaceAndLineBreak($render);
}
return $render;
} }
/** /**

View File

@ -106,9 +106,11 @@ abstract class ResponseAbstract implements MessageInterface, \JsonSerializable
/** /**
* Get response body. * Get response body.
* *
* @param bool $optimize Optimize response / minify
*
* @return string * @return string
* *
* @since 1.0.0 * @since 1.0.0
*/ */
abstract public function getBody() : string; abstract public function getBody(bool $optimize = false) : string;
} }

View File

@ -39,14 +39,14 @@ class BuilderTest extends \PHPUnit\Framework\TestCase
public function testMysqlShowTables() : void public function testMysqlShowTables() : void
{ {
$query = new Builder($this->con); $query = new Builder($this->con);
$sql = 'SELECT `table_name` FROM `information_schema`.`tables` WHERE `information_schema`.`tables`.`table_schema` = \'' . $GLOBALS['CONFIG']['db']['core']['masters']['admin']['database']. '\';'; $sql = 'SELECT `table_name` FROM `information_schema`.`tables` WHERE `table_schema` = \'' . $GLOBALS['CONFIG']['db']['core']['masters']['admin']['database']. '\';';
self::assertEquals($sql, $query->selectTables()->toSql()); self::assertEquals($sql, $query->selectTables()->toSql());
} }
public function testMysqlShowFields() : void public function testMysqlShowFields() : void
{ {
$query = new Builder($this->con); $query = new Builder($this->con);
$sql = 'SELECT * FROM `information_schema`.`columns` WHERE `information_schema`.`columns`.`table_schema` = \'' . $GLOBALS['CONFIG']['db']['core']['masters']['admin']['database']. '\' AND `information_schema`.`columns`.`table_name` = \'test\';'; $sql = 'SELECT * FROM `information_schema`.`columns` WHERE `table_schema` = \'' . $GLOBALS['CONFIG']['db']['core']['masters']['admin']['database']. '\' AND `table_name` = \'test\';';
self::assertEquals($sql, $query->selectFields('test')->toSql()); self::assertEquals($sql, $query->selectFields('test')->toSql());
} }

View File

@ -43,7 +43,7 @@ class HeaderAbstractTest extends \PHPUnit\Framework\TestCase
return true; return true;
} }
public function get(string $key) : array public function get(string $key = null) : array
{ {
return []; return [];
} }

View File

@ -164,7 +164,7 @@ class RequestTest extends \PHPUnit\Framework\TestCase
self::assertEquals( self::assertEquals(
"The OMS License 1.0\n\nCopyright (c) <Dennis Eichhorn> All Rights Reserved\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.", "The OMS License 1.0\n\nCopyright (c) <Dennis Eichhorn> All Rights Reserved\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.",
$request->rest() $request->rest()->getBody()
); );
} }

View File

@ -40,7 +40,7 @@ class RestTest extends \PHPUnit\Framework\TestCase
$request = new Request(new Http('http://httpbin.org/post')); $request = new Request(new Http('http://httpbin.org/post'));
$request->setMethod(RequestMethod::POST); $request->setMethod(RequestMethod::POST);
self::assertTrue($request->setData('pdata', 'abc')); self::assertTrue($request->setData('pdata', 'abc'));
self::assertEquals('abc', REST::request($request)->getJson()['form']['pdata']); self::assertEquals('abc', REST::request($request)->getJsonData()['form']['pdata']);
} }
public function testPut() : void public function testPut() : void
@ -48,7 +48,7 @@ class RestTest extends \PHPUnit\Framework\TestCase
$request = new Request(new Http('http://httpbin.org/put')); $request = new Request(new Http('http://httpbin.org/put'));
$request->setMethod(RequestMethod::PUT); $request->setMethod(RequestMethod::PUT);
self::assertTrue($request->setData('pdata', 'abc')); self::assertTrue($request->setData('pdata', 'abc'));
self::assertEquals('abc', REST::request($request)->getJson()['form']['pdata']); self::assertEquals('abc', REST::request($request)->getJsonData()['form']['pdata']);
} }
public function testDelete() : void public function testDelete() : void
@ -56,7 +56,7 @@ class RestTest extends \PHPUnit\Framework\TestCase
$request = new Request(new Http('http://httpbin.org/delete')); $request = new Request(new Http('http://httpbin.org/delete'));
$request->setMethod(RequestMethod::DELETE); $request->setMethod(RequestMethod::DELETE);
self::assertTrue($request->setData('ddata', 'abc')); self::assertTrue($request->setData('ddata', 'abc'));
self::assertEquals('abc', REST::request($request)->getJson()['form']['ddata']); self::assertEquals('abc', REST::request($request)->getJsonData()['form']['ddata']);
} }
public function testGet() : void public function testGet() : void
@ -64,6 +64,6 @@ class RestTest extends \PHPUnit\Framework\TestCase
$request = new Request(new Http('http://httpbin.org/get')); $request = new Request(new Http('http://httpbin.org/get'));
$request->setMethod(RequestMethod::GET); $request->setMethod(RequestMethod::GET);
self::assertTrue($request->setData('gdata', 'abc')); self::assertTrue($request->setData('gdata', 'abc'));
self::assertEquals('abc', REST::request($request)->getJson()['args']['gdata']); self::assertEquals('abc', REST::request($request)->getJsonData()['args']['gdata']);
} }
} }

View File

@ -34,7 +34,7 @@ class ResponseAbstractTest extends \PHPUnit\Framework\TestCase
return [1]; return [1];
} }
public function getBody() : string public function getBody(bool $optimize = false) : string
{ {
return ''; return '';
} }