Skip to content

Commit

Permalink
Merge pull request #16 from rybakit/text_array
Browse files Browse the repository at this point in the history
Enhance the "text_array" type
  • Loading branch information
richardfullmer authored Jul 22, 2016
2 parents 052126e + 0563906 commit 7682f19
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 104 deletions.
55 changes: 0 additions & 55 deletions src/Doctrine/DBAL/PostgresTypes/AbstractArrayType.php

This file was deleted.

36 changes: 24 additions & 12 deletions src/Doctrine/DBAL/PostgresTypes/IntArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,39 +8,51 @@
namespace Doctrine\DBAL\PostgresTypes;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

/**
* IntArrayType.
*
* Only supports single dimensional arrays like text[].
*
* @author Richard Fullmer <richard.fullmer@opensoftdev.com>
* @author Eugene Leonovich <gen.work@gmail.com>
*/
class IntArrayType extends AbstractArrayType
class IntArrayType extends Type
{
/**
* @return string
* {@inheritdoc}
*/
public function getName()
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return 'int_array';
$value = trim($value, '{}');

if ($value === '') {
return array();
}

return array_map('intval', explode(',', $value));
}

/**
* {@inheritdoc}
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
return '_int4';
return '{'.implode(',', $value).'}';
}

/**
* {@inheritdoc}
* @return string
*/
public function convertToPHPValue($value, AbstractPlatform $platform)
public function getName()
{
$result = parent::convertToPHPValue($value, $platform);
return 'int_array';
}

return array_map('intval', $result);
/**
* {@inheritdoc}
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return '_int4';
}
}
60 changes: 55 additions & 5 deletions src/Doctrine/DBAL/PostgresTypes/TextArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,68 @@
namespace Doctrine\DBAL\PostgresTypes;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;

/**
* TextArrayType.
*
* Only supports single dimensional arrays like text[].
*
* @author Richard Fullmer <richard.fullmer@opensoftdev.com>
* @author Eugene Leonovich <gen.work@gmail.com>
*/
class TextArrayType extends AbstractArrayType
class TextArrayType extends Type
{
/**
* @return string
* {@inheritdoc}
*/
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (empty($value)) {
return '{}';
}

$result = '';
foreach ($value as $part) {
if (null === $part) {
$result .= 'NULL,';
continue;
}
if ('' === $part) {
$result .= '"",';
continue;
}

$result .= '"'.addcslashes($part, '"').'",';
}

return '{'.substr($result, 0, -1).'}';
}

/**
* {@inheritdoc}
*/
public function convertToPHPValue($value, AbstractPlatform $platform)
{
if (empty($value) || '{}' === $value) {
return array();
}

// @see http://stackoverflow.com/a/19082849/1160901
preg_match_all('/(?<=^\{|,)(([^,"{]*)|\s*"((?:[^"\\\\]|\\\\(?:.|[0-9]+|x[0-9a-f]+))*)"\s*)(,|(?<!^\{)(?=\}$))/i', $value, $matches, PREG_SET_ORDER);

$array = array();
foreach ($matches as $match) {
if ('' !== $match[3]) {
$array[] = stripcslashes($match[3]);
continue;
}

$array[] = 'NULL' === $match[2] ? null : $match[2];
}

return $array;
}

/**
* {@inheritdoc}
*/
public function getName()
{
Expand Down
63 changes: 31 additions & 32 deletions tests/Doctrine/Tests/DBAL/PostgresTypes/TextArrayTypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;

/**
* Class TextArrayTypeTest.
*
* Unit tests for the TextArray type
* @author Richard Fullmer <richard.fullmer@opensoftdev.com>
* @author Eugene Leonovich <gen.work@gmail.com>
*/
class TextArrayTypeTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -27,61 +26,61 @@ class TextArrayTypeTest extends \PHPUnit_Framework_TestCase
*/
protected $_platform;

/**
* Pre-instantiation setup.
*/
public static function setUpBeforeClass()
{
Type::addType('text_array', 'Doctrine\\DBAL\\PostgresTypes\\TextArrayType');
}

/**
* Pre-execution setup.
*/
protected function setUp()
{
$this->_platform = new PostgreSqlPlatform();
$this->_type = Type::getType('text_array');
}

/**
* Test conversion of PHP array to database value.
*
* @dataProvider databaseConvertProvider
* @dataProvider provideValidValues
*/
public function testTextArrayConvertsToDatabaseValue($serialized, $array)
{
$converted = $this->_type->convertToDatabaseValue($array, $this->_platform);
$this->assertInternalType('string', $converted);
$this->assertEquals($serialized, $converted);
$this->assertSame($serialized, $this->_type->convertToDatabaseValue($array, $this->_platform));
}

/**
* Test conversion of database value to PHP array.
*
* @dataProvider databaseConvertProvider
* @dataProvider provideToPHPValidValues
*/
public function testTextArrayConvertsToPHPValue($serialized, $array)
{
$converted = $this->_type->convertToPHPValue($serialized, $this->_platform);
$this->assertInternalType('array', $converted);
$this->assertEquals($array, $converted);

if (sizeof($converted) > 0) {
$this->assertInternalType('string', reset($converted));
}
$this->assertSame($array, $this->_type->convertToPHPValue($serialized, $this->_platform));
}

/**
* Provider for conversion test values.
*
* @return array
*/
public static function databaseConvertProvider()
public static function provideValidValues()
{
return array(
array('{simple,extended}', array('simple', 'extended')),
array('{}', array()),
array('{""}', array('')),
array('{NULL}', array(null)),
array('{"1,NULL"}', array('1,NULL')),
array('{"NULL,2"}', array('NULL,2')),
array('{"1",NULL}', array('1', null)),
array('{"NULL"}', array('NULL')),
array('{"1,NULL"}', array('1,NULL')),
array('{"1","2"}', array('1', '2')),
array('{"1\"2"}', array('1"2')),
array('{"\"2"}', array('"2')),
array('{"\"\""}', array('""')),
array('{"1","2"}', array('1', '2')),
array('{"1,2","3,4"}', array('1,2', '3,4')),
);
}

public static function provideToPHPValidValues()
{
return self::provideValidValues() + array(
array('{NULL,2}', array(null, '2')),
array('{NOTNULL}', array('NOTNULL')),
array('{NOTNULL,2}', array('NOTNULL', '2')),
array('{NULL2}', array('NULL2')),
array('{1,2}', array('1', '2')),
);
}
}

0 comments on commit 7682f19

Please # to comment.