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
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public static function fromString(string $ltree): static
return new static([]);
}

/** @var list<non-empty-string> */
$pathFromRoot = \explode('.', $ltree);

return new static($pathFromRoot);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

declare(strict_types=1);

namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS;

use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseFunction;
namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

/**
* Implementation of PostgreSQL check if left side overlaps with right side (using &&).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use MartinGeorgiev\Doctrine\DBAL\Types\ValueObject\Range as RangeValueObject;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Contains;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\IsContainedBy;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS\Overlaps;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Overlaps;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Test;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
<?php

declare(strict_types=1);

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

use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Overlaps;
use PHPUnit\Framework\Attributes\Test;

class OverlapsTest extends ArrayTestCase
{
protected function getStringFunctions(): array
{
return [
'OVERLAPS' => Overlaps::class,
];
}

#[Test]
public function returns_true_when_text_arrays_have_overlapping_elements(): void
{
$dql = 'SELECT OVERLAPS(t.textArray, :value) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t
WHERE t.id = 1';

$result = $this->executeDqlQuery($dql, ['value' => ['apple', 'grape']]);
$this->assertTrue($result[0]['result']);
}

#[Test]
public function returns_true_when_integer_arrays_have_overlapping_elements(): void
{
$dql = 'SELECT OVERLAPS(t.integerArray, :value) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t
WHERE t.id = 1';

$result = $this->executeDqlQuery($dql, ['value' => [2, 5, 6]]);
$this->assertTrue($result[0]['result']);
}

#[Test]
public function returns_false_when_arrays_have_no_overlapping_elements(): void
{
$dql = 'SELECT OVERLAPS(t.textArray, :value) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t
WHERE t.id = 1';

$result = $this->executeDqlQuery($dql, ['value' => ['grape', 'kiwi']]);
$this->assertFalse($result[0]['result']);
}

#[Test]
public function returns_true_when_arrays_overlap_with_literal_array(): void
{
$dql = "SELECT OVERLAPS(t.textArray, '{\"banana\",\"grape\"}') as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t
WHERE t.id = 1";

$result = $this->executeDqlQuery($dql);
$this->assertTrue($result[0]['result']);
}

#[Test]
public function returns_false_when_arrays_do_not_overlap_with_literal_array(): void
{
$dql = "SELECT OVERLAPS(t.textArray, '{\"grape\",\"kiwi\"}') as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t
WHERE t.id = 1";

$result = $this->executeDqlQuery($dql);
$this->assertFalse($result[0]['result']);
}

#[Test]
public function returns_true_when_boolean_arrays_overlap(): void
{
$dql = 'SELECT OVERLAPS(t.boolArray, :value) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t
WHERE t.id = 1';

$result = $this->executeDqlQuery($dql, ['value' => [true, false]]);
$this->assertTrue($result[0]['result']);
}

#[Test]
public function returns_true_when_comparing_two_database_arrays(): void
{
$dql = 'SELECT OVERLAPS(t1.textArray, t2.textArray) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t1,
Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t2
WHERE t1.id = 1 AND t2.id = 2';

$result = $this->executeDqlQuery($dql);
$this->assertTrue($result[0]['result']); // Both contain 'apple'
}

#[Test]
public function returns_true_when_comparing_overlapping_database_arrays(): void
{
$dql = 'SELECT OVERLAPS(t1.textArray, t2.textArray) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t1,
Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t2
WHERE t1.id = 1 AND t2.id = 3';

$result = $this->executeDqlQuery($dql);
$this->assertTrue($result[0]['result']); // Both contain 'banana' and 'orange'
}

#[Test]
public function returns_false_when_comparing_non_overlapping_database_arrays(): void
{
$dql = 'SELECT OVERLAPS(t1.textArray, t2.textArray) as result
FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t1,
Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t2
WHERE t1.id = 2 AND t2.id = 3';

$result = $this->executeDqlQuery($dql);
$this->assertFalse($result[0]['result']); // Row 2: ['grape', 'apple'] vs Row 3: ['banana', 'orange', 'kiwi', 'mango'] - no overlap
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

declare(strict_types=1);

namespace Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS;
namespace Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays;
use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsGeometries;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS\Overlaps;
use Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\TestCase;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Overlaps;

class OverlapsTest extends TestCase
{
Expand Down
Loading