Skip to content
Merged
30 changes: 30 additions & 0 deletions fixtures/MartinGeorgiev/Doctrine/Entity/ContainsNumerics.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace Fixtures\MartinGeorgiev\Doctrine\Entity;

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity()]
class ContainsNumerics extends Entity
{
#[ORM\Column(type: Types::INTEGER)]
public int $integer1;

#[ORM\Column(type: Types::INTEGER)]
public int $integer2;

#[ORM\Column(type: Types::BIGINT)]
public int $bigint1;

#[ORM\Column(type: Types::BIGINT)]
public int $bigint2;

#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2)]
public float $decimal1;

#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2)]
public float $decimal2;
}
26 changes: 21 additions & 5 deletions src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Daterange.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,28 @@
*
* @author Martin Georgiev <martin.georgiev@gmail.com>
*/
class Daterange extends BaseFunction
class Daterange extends BaseVariadicFunction
{
protected function customizeFunction(): void
protected function getFunctionName(): string
{
$this->setFunctionPrototype('daterange(%s, %s)');
$this->addNodeMapping('StringPrimary');
$this->addNodeMapping('StringPrimary');
return 'daterange';
}

/**
* @return array<string>
*/
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getMinArgumentCount(): int
{
return 2;
}

protected function getMaxArgumentCount(): int
{
return 3;
}
}
26 changes: 21 additions & 5 deletions src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Int4range.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,28 @@
*
* @author Martin Georgiev <martin.georgiev@gmail.com>
*/
class Int4range extends BaseFunction
class Int4range extends BaseVariadicFunction
{
protected function customizeFunction(): void
protected function getFunctionName(): string
{
$this->setFunctionPrototype('int4range(%s, %s)');
$this->addNodeMapping('StringPrimary');
$this->addNodeMapping('StringPrimary');
return 'int4range';
}

/**
* @return array<string>
*/
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getMinArgumentCount(): int
{
return 2;
}

protected function getMaxArgumentCount(): int
{
return 3;
}
}
26 changes: 21 additions & 5 deletions src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Int8range.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,28 @@
*
* @author Martin Georgiev <martin.georgiev@gmail.com>
*/
class Int8range extends BaseFunction
class Int8range extends BaseVariadicFunction
{
protected function customizeFunction(): void
protected function getFunctionName(): string
{
$this->setFunctionPrototype('int8range(%s, %s)');
$this->addNodeMapping('StringPrimary');
$this->addNodeMapping('StringPrimary');
return 'int8range';
}

/**
* @return array<string>
*/
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getMinArgumentCount(): int
{
return 2;
}

protected function getMaxArgumentCount(): int
{
return 3;
}
}
26 changes: 21 additions & 5 deletions src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Numrange.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,28 @@
*
* @author Martin Georgiev <martin.georgiev@gmail.com>
*/
class Numrange extends BaseFunction
class Numrange extends BaseVariadicFunction
{
protected function customizeFunction(): void
protected function getFunctionName(): string
{
$this->setFunctionPrototype('numrange(%s, %s)');
$this->addNodeMapping('StringPrimary');
$this->addNodeMapping('StringPrimary');
return 'numrange';
}

/**
* @return array<string>
*/
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getMinArgumentCount(): int
{
return 2;
}

protected function getMaxArgumentCount(): int
{
return 3;
}
}
26 changes: 21 additions & 5 deletions src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Tsrange.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,28 @@
*
* @author Martin Georgiev <martin.georgiev@gmail.com>
*/
class Tsrange extends BaseFunction
class Tsrange extends BaseVariadicFunction
{
protected function customizeFunction(): void
protected function getFunctionName(): string
{
$this->setFunctionPrototype('tsrange(%s, %s)');
$this->addNodeMapping('StringPrimary');
$this->addNodeMapping('StringPrimary');
return 'tsrange';
}

/**
* @return array<string>
*/
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getMinArgumentCount(): int
{
return 2;
}

protected function getMaxArgumentCount(): int
{
return 3;
}
}
26 changes: 21 additions & 5 deletions src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Tstzrange.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,28 @@
*
* @author Martin Georgiev <martin.georgiev@gmail.com>
*/
class Tstzrange extends BaseFunction
class Tstzrange extends BaseVariadicFunction
{
protected function customizeFunction(): void
protected function getFunctionName(): string
{
$this->setFunctionPrototype('tstzrange(%s, %s)');
$this->addNodeMapping('StringPrimary');
$this->addNodeMapping('StringPrimary');
return 'tstzrange';
}

/**
* @return array<string>
*/
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getMinArgumentCount(): int
{
return 2;
}

protected function getMaxArgumentCount(): int
{
return 3;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ protected function createTestTableForDateFixture(): void
datetime1 TIMESTAMP,
datetime2 TIMESTAMP,
time1 TIME,
time2 TIME
time2 TIME,
datetimetz1 TIMESTAMPTZ,
datetimetz2 TIMESTAMPTZ
)
', $fullTableName);

Expand All @@ -41,8 +43,8 @@ protected function createTestTableForDateFixture(): void
protected function insertTestDataForDateFixture(): void
{
$sql = \sprintf('
INSERT INTO %s.containsdates (date1, date2, datetime1, datetime2, time1, time2) VALUES
(\'2023-06-15\', \'2023-06-16\', \'2023-06-15 10:30:00\', \'2023-06-16 11:45:00\', \'10:30:00\', \'11:45:00\')
INSERT INTO %s.containsdates (date1, date2, datetime1, datetime2, time1, time2, datetimetz1, datetimetz2) VALUES
(\'2023-06-15\', \'2023-06-16\', \'2023-06-15 10:30:00\', \'2023-06-16 11:45:00\', \'10:30:00\', \'11:45:00\', \'2023-06-15 10:30:00+00\', \'2023-06-16 11:45:00+00\')
', self::DATABASE_SCHEMA);
$this->connection->executeStatement($sql);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace Tests\Integration\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Daterange;

class DaterangeTest extends DateTestCase
{
protected function getStringFunctions(): array
{
return [
'DATERANGE' => Daterange::class,
];
}

public function test_daterange(): void
{
$dql = 'SELECT DATERANGE(t.date1, t.date2) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsDates t WHERE t.id = 1';
$result = $this->executeDqlQuery($dql);
$this->assertIsArray($result);
$this->assertNotEmpty($result[0]['result']);
$this->assertIsString($result[0]['result']);
$this->assertSame('[2023-06-15,2023-06-16)', $result[0]['result']);
}

public function test_daterange_with_bounds(): void
{
$dql = "SELECT DATERANGE(t.date1, t.date2, '[)') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsDates t WHERE t.id = 1";
$result = $this->executeDqlQuery($dql);
$this->assertIsArray($result);
$this->assertNotEmpty($result[0]['result']);
$this->assertIsString($result[0]['result']);
$this->assertSame('[2023-06-15,2023-06-16)', $result[0]['result']);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace Tests\Integration\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Int4range;

class Int4rangeTest extends NumericTestCase
{
protected function getStringFunctions(): array
{
return [
'INT4RANGE' => Int4range::class,
];
}

public function test_int4range(): void
{
$dql = 'SELECT INT4RANGE(t.integer1, t.integer2) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1';
$result = $this->executeDqlQuery($dql);
$this->assertIsArray($result);
$this->assertNotEmpty($result[0]['result']);
$this->assertIsString($result[0]['result']);
$this->assertSame('[10,20)', $result[0]['result']);
}

public function test_int4range_with_bounds(): void
{
$dql = "SELECT INT4RANGE(t.integer1, t.integer2, '[)') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsNumerics t WHERE t.id = 1";
$result = $this->executeDqlQuery($dql);
$this->assertIsArray($result);
$this->assertNotEmpty($result[0]['result']);
$this->assertIsString($result[0]['result']);
$this->assertSame('[10,20)', $result[0]['result']);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace Tests\Integration\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Int8range;

class Int8rangeTest extends NumericTestCase
{
protected function getStringFunctions(): array
{
return [
'INT8RANGE' => Int8range::class,
];
}

public function test_int8range(): void
{
$dql = 'SELECT INT8RANGE(t.bigint1, t.bigint2) as result FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsNumerics t WHERE t.id = 1';
$result = $this->executeDqlQuery($dql);
$this->assertIsArray($result);
$this->assertNotEmpty($result[0]['result']);
$this->assertIsString($result[0]['result']);
$this->assertSame('[1000,2000)', $result[0]['result']);
}

public function test_int8range_with_bounds(): void
{
$dql = "SELECT INT8RANGE(t.bigint1, t.bigint2, '[)') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsNumerics t WHERE t.id = 1";
$result = $this->executeDqlQuery($dql);
$this->assertIsArray($result);
$this->assertNotEmpty($result[0]['result']);
$this->assertIsString($result[0]['result']);
$this->assertSame('[1000,2000)', $result[0]['result']);
}
}
Loading
Loading