diff --git a/src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php b/src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php index 6d352a5e..8a96d050 100644 --- a/src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php +++ b/src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php @@ -42,6 +42,7 @@ public static function fromString(string $ltree): static return new static([]); } + /** @var list */ $pathFromRoot = \explode('.', $ltree); return new static($pathFromRoot); diff --git a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/Overlaps.php b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php similarity index 83% rename from src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/Overlaps.php rename to src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php index f65af7eb..a38d4cfc 100644 --- a/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/Overlaps.php +++ b/src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php @@ -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 &&). diff --git a/tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php b/tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php index dd40f43e..09c7fc8e 100644 --- a/tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php +++ b/tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php @@ -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; diff --git a/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php new file mode 100644 index 00000000..9572b4ea --- /dev/null +++ b/tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php @@ -0,0 +1,120 @@ + 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 + } +} diff --git a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/OverlapsTest.php b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php similarity index 90% rename from tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/OverlapsTest.php rename to tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php index 1c3a764d..ffd77743 100644 --- a/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/OverlapsTest.php +++ b/tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php @@ -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 {