Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- Enh #482: Improve performance of `SqlParser::getNextPlaceholder()` method (@Tigrov)
- Chg #483: Bump `yiisoft/db` version to `^2.0.1` (@vjik)
- Bug #484: Fix building range-type column definitions (@Tigrov)
- Enh #489: Clarify return type of `phpTypecast()` methods for range columns (@Tigrov)

## 2.0.1 February 07, 2026

Expand Down
20 changes: 20 additions & 0 deletions src/Column/AbstractMultiRangeColumn.php
Comment thread
Tigrov marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,16 @@
use function is_array;
use function is_string;

/**
* @template T of ExpressionInterface
*/
abstract class AbstractMultiRangeColumn extends AbstractColumn
{
/**
* @inheritDoc
*
* @return string|ExpressionInterface|MultiRangeValue|null
*/
public function dbTypecast(mixed $value): mixed
{
if ($value === null
Expand All @@ -42,6 +50,13 @@ public function dbTypecast(mixed $value): mixed
return new MultiRangeValue(...$ranges);
}

/**
* @inheritDoc
*
* @return ?ExpressionInterface[]
*
* @psalm-return ?T[]
*/
public function phpTypecast(mixed $value): mixed
{
/**
Expand All @@ -64,11 +79,16 @@ public function phpTypecast(mixed $value): mixed
preg_match_all('/[\[\(][^,]*,[^\)\]]*[\)\]]/', $value, $matches);

$rangeColumn = $this->getRangeColumn();

/** @psalm-var T[] */
return array_map(
$rangeColumn->phpTypecast(...),
$matches[0],
);
}

/**
* @psalm-return AbstractRangeColumn<T>
*/
abstract protected function getRangeColumn(): ColumnInterface;
}
19 changes: 18 additions & 1 deletion src/Column/AbstractRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,16 @@
use function is_string;
use function sprintf;

/**
* @template T of ExpressionInterface
*/
abstract class AbstractRangeColumn extends AbstractColumn
{
/**
* @inheritDoc
*
* @return string|ExpressionInterface|null
*/
public function dbTypecast(mixed $value): mixed
{
if ($value === null
Expand Down Expand Up @@ -45,6 +53,13 @@ public function dbTypecast(mixed $value): mixed
. ']';
}

/**
* @inheritDoc
*
* @return ?ExpressionInterface
*
* @psalm-return ?T
*/
public function phpTypecast(mixed $value): mixed
{
/**
Expand All @@ -56,7 +71,7 @@ public function phpTypecast(mixed $value): mixed
return null;
}

if (!preg_match('/^(?P<open>\[|\()(?P<lower>[^,]*),(?P<upper>[^\)\]]*)(?P<close>\)|\])$/', $value, $matches)) {
if (!preg_match('/^(?P<open>[\[\(])(?P<lower>[^,]*),(?P<upper>[^\)\]]*)(?P<close>[\)\]])$/', $value, $matches)) {
throw new NotSupportedException('Unsupported range format.');
}

Expand All @@ -72,6 +87,8 @@ abstract protected function getBoundColumn(): ColumnInterface;

/**
* @throws NotSupportedException
*
* @psalm-return T
*/
abstract protected function createRangeValue(
?string $lower,
Expand Down
4 changes: 4 additions & 0 deletions src/Column/DateMultiRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
namespace Yiisoft\Db\Pgsql\Column;

use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\DateRangeValue;
use Yiisoft\Db\Schema\Column\ColumnInterface;

/**
* @extends AbstractMultiRangeColumn<DateRangeValue>
*/
final class DateMultiRangeColumn extends AbstractMultiRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::DATEMULTIRANGE;
Expand Down
16 changes: 14 additions & 2 deletions src/Column/DateRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,29 @@
use Yiisoft\Db\Pgsql\Expression\DateRangeValue;
use Yiisoft\Db\Schema\Column\DateTimeColumn;

/**
* @extends AbstractRangeColumn<DateRangeValue>
*/
final class DateRangeColumn extends AbstractRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::DATERANGE;

public function phpTypecast(mixed $value): ?DateRangeValue
{
return parent::phpTypecast($value);
}

Comment thread
vjik marked this conversation as resolved.
protected function getBoundColumn(): DateTimeColumn
{
return RangeBoundColumnFactory::date();
}

protected function createRangeValue(?string $lower, ?string $upper, bool $includeLower, bool $includeUpper): DateRangeValue
{
protected function createRangeValue(
?string $lower,
?string $upper,
bool $includeLower,
bool $includeUpper,
): DateRangeValue {
$column = $this->getBoundColumn();
return new DateRangeValue(
$column->phpTypecast($lower),
Expand Down
4 changes: 4 additions & 0 deletions src/Column/Int4MultiRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
namespace Yiisoft\Db\Pgsql\Column;

use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\Int4RangeValue;
use Yiisoft\Db\Schema\Column\ColumnInterface;

/**
* @extends AbstractMultiRangeColumn<Int4RangeValue>
*/
final class Int4MultiRangeColumn extends AbstractMultiRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::INT4MULTIRANGE;
Expand Down
8 changes: 8 additions & 0 deletions src/Column/Int4RangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,18 @@
use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\Int4RangeValue;

/**
* @extends AbstractRangeColumn<Int4RangeValue>
*/
final class Int4RangeColumn extends AbstractRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::INT4RANGE;

public function phpTypecast(mixed $value): ?Int4RangeValue
{
return parent::phpTypecast($value);
}

protected function getBoundColumn(): IntegerColumn
{
return RangeBoundColumnFactory::int4();
Expand Down
4 changes: 4 additions & 0 deletions src/Column/Int8MultiRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
namespace Yiisoft\Db\Pgsql\Column;

use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\Int8RangeValue;
use Yiisoft\Db\Schema\Column\ColumnInterface;

/**
* @extends AbstractMultiRangeColumn<Int8RangeValue>
*/
final class Int8MultiRangeColumn extends AbstractMultiRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::INT8MULTIRANGE;
Expand Down
8 changes: 8 additions & 0 deletions src/Column/Int8RangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,18 @@
use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\Int8RangeValue;

/**
* @extends AbstractRangeColumn<Int8RangeValue>
*/
final class Int8RangeColumn extends AbstractRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::INT8RANGE;

public function phpTypecast(mixed $value): ?Int8RangeValue
{
return parent::phpTypecast($value);
}

protected function getBoundColumn(): BigIntColumn|IntegerColumn
{
return RangeBoundColumnFactory::int8();
Expand Down
4 changes: 4 additions & 0 deletions src/Column/NumMultiRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
namespace Yiisoft\Db\Pgsql\Column;

use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\NumRangeValue;
use Yiisoft\Db\Schema\Column\ColumnInterface;

/**
* @extends AbstractMultiRangeColumn<NumRangeValue>
*/
final class NumMultiRangeColumn extends AbstractMultiRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::NUMMULTIRANGE;
Expand Down
8 changes: 8 additions & 0 deletions src/Column/NumRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
use Yiisoft\Db\Pgsql\Expression\NumRangeValue;
use Yiisoft\Db\Schema\Column\DoubleColumn;

/**
* @extends AbstractRangeColumn<NumRangeValue>
*/
final class NumRangeColumn extends AbstractRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::NUMRANGE;

public function phpTypecast(mixed $value): ?NumRangeValue
{
return parent::phpTypecast($value);
}

protected function getBoundColumn(): DoubleColumn
{
return RangeBoundColumnFactory::num();
Expand Down
4 changes: 4 additions & 0 deletions src/Column/TsMultiRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
namespace Yiisoft\Db\Pgsql\Column;

use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\TsRangeValue;
use Yiisoft\Db\Schema\Column\ColumnInterface;

/**
* @extends AbstractMultiRangeColumn<TsRangeValue>
*/
final class TsMultiRangeColumn extends AbstractMultiRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::TSMULTIRANGE;
Expand Down
8 changes: 8 additions & 0 deletions src/Column/TsRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
use Yiisoft\Db\Pgsql\Expression\TsRangeValue;
use Yiisoft\Db\Schema\Column\DateTimeColumn;

/**
* @extends AbstractRangeColumn<TsRangeValue>
*/
final class TsRangeColumn extends AbstractRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::TSRANGE;

public function phpTypecast(mixed $value): ?TsRangeValue
{
return parent::phpTypecast($value);
}

protected function getBoundColumn(): DateTimeColumn
{
return RangeBoundColumnFactory::ts();
Expand Down
4 changes: 4 additions & 0 deletions src/Column/TsTzMultiRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
namespace Yiisoft\Db\Pgsql\Column;

use Yiisoft\Db\Pgsql\Constant\PgsqlColumnType;
use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue;
use Yiisoft\Db\Schema\Column\ColumnInterface;

/**
* @extends AbstractMultiRangeColumn<TsTzRangeValue>
*/
final class TsTzMultiRangeColumn extends AbstractMultiRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::TSTZMULTIRANGE;
Expand Down
8 changes: 8 additions & 0 deletions src/Column/TsTzRangeColumn.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
use Yiisoft\Db\Pgsql\Expression\TsTzRangeValue;
use Yiisoft\Db\Schema\Column\DateTimeColumn;

/**
* @extends AbstractRangeColumn<TsTzRangeValue>
*/
final class TsTzRangeColumn extends AbstractRangeColumn
{
protected const DEFAULT_TYPE = PgsqlColumnType::TSTZRANGE;

public function phpTypecast(mixed $value): ?TsTzRangeValue
{
return parent::phpTypecast($value);
}

protected function getBoundColumn(): DateTimeColumn
{
return RangeBoundColumnFactory::tsTz();
Expand Down
Loading