Skip to content
Merged
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
@@ -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']);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

declare(strict_types=1);

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

use Tests\Integration\MartinGeorgiev\TestCase;

abstract class NumericTestCase extends TestCase
{
protected function setUp(): void
{
parent::setUp();
$this->createTestTableForNumericFixture();
$this->insertTestDataForNumericFixture();
}

protected function createTestTableForNumericFixture(): void
{
$tableName = 'containsnumerics';

$this->createTestSchema();
$this->dropTestTableIfItExists($tableName);

$fullTableName = \sprintf('%s.%s', self::DATABASE_SCHEMA, $tableName);
$sql = \sprintf('
CREATE TABLE %s (
id SERIAL PRIMARY KEY,
integer1 INTEGER,
integer2 INTEGER,
bigint1 BIGINT,
bigint2 BIGINT,
decimal1 DECIMAL,
decimal2 DECIMAL
)
', $fullTableName);

$this->connection->executeStatement($sql);
}

protected function insertTestDataForNumericFixture(): void
{
$sql = \sprintf('
INSERT INTO %s.containsnumerics (integer1, integer2, bigint1, bigint2, decimal1, decimal2) VALUES
(10, 20, 1000, 2000, 10.5, 20.5)
', self::DATABASE_SCHEMA);
$this->connection->executeStatement($sql);
}
}
Loading
Loading