Skip to content

Conversation

@martin-georgiev
Copy link
Owner

@martin-georgiev martin-georgiev commented Sep 12, 2025

Summary by CodeRabbit

  • Refactor

    • Standardized the OVERLAPS function naming to align with other functions. No functional changes expected for end-users.
  • Tests

    • Added comprehensive integration tests for the OVERLAPS DQL function (text, integer, boolean, literal arrays, and DB-to-DB comparisons).
    • Updated unit tests to reflect the standardized naming to improve reliability and prevent regressions.
  • Chores

    • Added an internal type annotation for an ltree value object; no runtime behavior change.

@coderabbitai
Copy link

coderabbitai bot commented Sep 12, 2025

Walkthrough

Namespace for the Overlaps AST function moved from the PostGIS sub-namespace into the parent Functions namespace; imports and test namespaces were updated accordingly. A new integration test suite for the OVERLAPS DQL function was added and existing tests updated to reference the new FQCN.

Changes

Cohort / File(s) Summary of Changes
Core DQL function namespace update
src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
Moved class namespace from ...Functions\PostGIS to ...Functions; removed explicit BaseFunction import; no logic changes.
Integration test import adjustment
tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
Updated use statement to new Overlaps FQCN.
New integration tests for OVERLAPS
tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
Added new test class registering the OVERLAPS function and covering overlapping and non-overlapping scenarios across text, int, bool, literal arrays, and cross-entity comparisons.
Unit test namespace/import update
tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
Changed test namespace from ...Functions\PostGIS to ...Functions; updated Overlaps import; removed explicit TestCase import; no behavior changes.
Docblock type clarification
src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php
Added /** @var list<non-empty-string> */ annotation for $pathFromRoot in Ltree::fromString; no runtime changes.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related issues

Possibly related PRs

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title concisely and accurately summarizes the primary change: restoring the OVERLAPS function to its intended namespace and strengthening test coverage, which aligns with the namespace edits and added/updated tests in the diff; it is a single clear sentence and avoids noisy details.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

I hop from namespace burrow to sunlit functions lane,
Overlaps now strolling where the plain names reign.
Tests bloom like clover, assertions all clear,
I twitch my whiskers and give a cheer! 🐇🌿

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.


📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a9300fb and 2f97943.

📒 Files selected for processing (1)
  • src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/Ltree.php
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (18)
  • GitHub Check: sloth
  • GitHub Check: PostgreSQL 16 + PostGIS 3.5 + PHP 8.4
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.3
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.4
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.4
  • GitHub Check: PostgreSQL 16 + PostGIS 3.4 + PHP 8.4
  • GitHub Check: PostgreSQL 16 + PostGIS 3.4 + PHP 8.3
  • GitHub Check: PostgreSQL 16 + PostGIS 3.5 + PHP 8.2
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.3
  • GitHub Check: PostgreSQL 16 + PostGIS 3.5 + PHP 8.3
  • GitHub Check: PostgreSQL 16 + PostGIS 3.4 + PHP 8.1
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.2
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.2
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.1
  • GitHub Check: PHP 8.3 + Doctrine ORM latest + Doctrine Lexer 3.0
  • GitHub Check: PHP 8.2 + Doctrine ORM 3.0 + Doctrine Lexer latest
  • GitHub Check: PHP 8.1 + Doctrine ORM 2.14 + Doctrine Lexer 2.1
  • GitHub Check: wait-for-tests-worflows-before-upload
✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch overlaps

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (5)
src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php (1)

5-5: Optional: add PostGIS BC shim for Overlaps

No occurrences of MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS\Overlaps were found in the repo (only OverlapsLeft/Right/Above/Below are referenced). Add a lightweight deprecated alias to preserve backward compatibility for external users if desired — e.g. create src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/Overlaps.php:

<?php
declare(strict_types=1);

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

/**
 * @deprecated Use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Overlaps instead.
 */
class Overlaps extends \MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Overlaps {}
tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php (1)

24-29: Optional: add scenarios for empty and unbounded ranges in subclasses’ providers.

OVERLAPS on ranges has nuances with empty/unbounded ends; adding such cases in concrete RangeType tests would strengthen coverage.

tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (3)

19-39: Parameterized array comparisons: verify transformer casting across element types.

These tests rely on PHPArrayToPostgresValueTransformer; ensure it emits appropriately typed array literals for ints/bools so PG doesn’t need risky implicit casts during &&.

You can sanity-check with a query log or add one more test that uses an explicit typed literal to prove parity:

+    #[Test]
+    public function returns_true_with_explicitly_typed_integer_array_literal(): void
+    {
+        $dql = "SELECT OVERLAPS(t.integerArray, 'ARRAY[2,5,6]'::integer[]) as result
+                FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsArrays t
+                WHERE t.id = 1";
+        $result = $this->executeDqlQuery($dql);
+        $this->assertTrue($result[0]['result']);
+    }

52-71: Add an empty-array case for completeness.

PostgreSQL array && with an empty array should yield FALSE; adding a literal empty-array test tightens semantics.

+    #[Test]
+    public function returns_false_when_overlapping_with_empty_array_literal(): void
+    {
+        $dql = "SELECT OVERLAPS(t.textArray, ARRAY[]::text[]) as result
+                FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsArrays t
+                WHERE t.id = 1";
+        $result = $this->executeDqlQuery($dql);
+        $this->assertFalse($result[0]['result']);
+    }

85-119: Use explicit JOIN for clarity (optional).

The comma join works, but an explicit JOIN reads clearer in tests.

-        $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';
+        $dql = 'SELECT OVERLAPS(t1.textArray, t2.textArray) as result
+                FROM Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t1
+                JOIN Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsArrays t2 WITH t2.id = 2
+                WHERE t1.id = 1';
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8b0fab4 and a9300fb.

📒 Files selected for processing (4)
  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php (1 hunks)
  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php (1 hunks)
  • tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (1 hunks)
  • tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (1 hunks)
🧰 Additional context used
🧠 Learnings (9)
📓 Common learnings
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#434
File: tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/ST_CrossesTest.php:12-31
Timestamp: 2025-09-01T18:48:28.508Z
Learning: When analyzing unit test files in this codebase, always verify the actual file structure and existing patterns before suggesting changes. The ContainsGeometries fixture exists at ./fixtures/MartinGeorgiev/Doctrine/Entity/ContainsGeometries.php and the PostGIS unit tests use the namespace Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS consistently.
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#430
File: tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsRightTest.php:41-50
Timestamp: 2025-08-26T22:06:36.659Z
Learning: The PostGIS OVERLAPS_RIGHT (&>) operator returns TRUE only if the left geometry's bounding box overlaps or is entirely to the right of the right geometry's bounding box. It returns FALSE if the left geometry extends to the left of the right geometry's leftmost boundary, even if the geometries overlap.
📚 Learning: 2025-05-23T11:11:57.951Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#383
File: tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/RadiansTest.php:1-9
Timestamp: 2025-05-23T11:11:57.951Z
Learning: Tests in the `Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions` namespace extend a custom `TestCase` class from the same namespace (`Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\TestCase`), rather than PHPUnit's TestCase directly, and therefore don't need an explicit import.

Applied to files:

  • tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
  • tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
📚 Learning: 2025-03-29T03:31:17.114Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#318
File: tests/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/XmlAggTest.php:1-9
Timestamp: 2025-03-29T03:31:17.114Z
Learning: Tests in the `Tests\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions` namespace extend a custom `TestCase` class from the same namespace (`Tests\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\TestCase`), rather than PHPUnit's TestCase, and therefore don't need an explicit import.

Applied to files:

  • tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
  • tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
📚 Learning: 2025-09-01T18:48:28.508Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#434
File: tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/PostGIS/ST_CrossesTest.php:12-31
Timestamp: 2025-09-01T18:48:28.508Z
Learning: When analyzing unit test files in this codebase, always verify the actual file structure and existing patterns before suggesting changes. The ContainsGeometries fixture exists at ./fixtures/MartinGeorgiev/Doctrine/Entity/ContainsGeometries.php and the PostGIS unit tests use the namespace Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\PostGIS consistently.

Applied to files:

  • tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
  • tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
📚 Learning: 2025-08-26T22:06:36.659Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#430
File: tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsRightTest.php:41-50
Timestamp: 2025-08-26T22:06:36.659Z
Learning: The PostGIS OVERLAPS_RIGHT (&>) operator returns TRUE only if the left geometry's bounding box overlaps or is entirely to the right of the right geometry's bounding box. It returns FALSE if the left geometry extends to the left of the right geometry's leftmost boundary, even if the geometries overlap.

Applied to files:

  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
  • tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
📚 Learning: 2025-03-11T12:32:10.726Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#263
File: src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Numrange.php:19-21
Timestamp: 2025-03-11T12:32:10.726Z
Learning: In the postgresql-for-doctrine repository, PostgreSQL range functions have distinct implementations for different data types. The `Numrange` function works with numeric/decimal values and is tested using the `ContainsDecimals` fixture with properties typed as `float`. In contrast, the `Int4range` function works with 32-bit integers and is tested using the `ContainsIntegers` fixture with properties typed as `int`. While the PHP implementations share a similar structure (extending `BaseFunction`), they are semantically different as they handle different PostgreSQL data types.

Applied to files:

  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
  • tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php
  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
📚 Learning: 2025-03-11T17:02:51.971Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#0
File: :0-0
Timestamp: 2025-03-11T17:02:51.971Z
Learning: When using operator-like functions in PostgreSQL-for-doctrine, they must be used as boolean functions with `= TRUE` rather than as direct operators (e.g., `RIGHT_EXISTS_ON_LEFT(column, value) = TRUE` instead of `column RIGHT_EXISTS_ON_LEFT value`).

Applied to files:

  • src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php
📚 Learning: 2025-08-24T23:39:18.782Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#411
File: src/MartinGeorgiev/Doctrine/DBAL/Types/ValueObject/LtreeInterface.php:7-7
Timestamp: 2025-08-24T23:39:18.782Z
Learning: This repository follows a concrete value object pattern without interfaces. All value objects (Point, DateRange, Int4Range, NumericRange, etc.) are concrete classes that directly implement required interfaces like \Stringable and \JsonSerializable. The codebase uses abstract base classes for shared functionality rather than interfaces for abstraction. Adding interfaces for value objects violates the established architectural patterns.

Applied to files:

  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
📚 Learning: 2025-04-11T11:23:44.192Z
Learnt from: martin-georgiev
PR: martin-georgiev/postgresql-for-doctrine#340
File: tests/MartinGeorgiev/Doctrine/DBAL/Types/InetArrayTest.php:145-145
Timestamp: 2025-04-11T11:23:44.192Z
Learning: In the PostgreSQL for Doctrine test cases, methods that test database-to-PHP conversions should use `mixed` type for parameter and include non-string test cases in their data providers, following the pattern in classes like InetTest, CidrTest, and MacaddrTest.

Applied to files:

  • tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php
🧬 Code graph analysis (3)
tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (4)
src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php (1)
  • Overlaps (18-26)
tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (2)
  • OverlapsTest (11-37)
  • getStringFunctions (13-18)
tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/ArrayTestCase.php (1)
  • ArrayTestCase (9-51)
tests/Integration/MartinGeorgiev/TestCase.php (1)
  • executeDqlQuery (284-298)
tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (3)
fixtures/MartinGeorgiev/Doctrine/Entity/ContainsGeometries.php (1)
  • ORM (10-24)
fixtures/MartinGeorgiev/Doctrine/Entity/ContainsArrays.php (1)
  • ORM (9-26)
src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php (1)
  • Overlaps (18-26)
tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php (1)
src/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/Overlaps.php (1)
  • Overlaps (18-26)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (16)
  • GitHub Check: PHP 8.4 + Doctrine ORM 2.18 + Doctrine Lexer latest
  • GitHub Check: PHP 8.2 + Doctrine ORM latest + Doctrine Lexer 3.0
  • GitHub Check: PHP 8.2 + Doctrine ORM latest + Doctrine Lexer latest
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.4
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.3
  • GitHub Check: PostgreSQL 16 + PostGIS 3.4 + PHP 8.4
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.3
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.4
  • GitHub Check: PostgreSQL 16 + PostGIS 3.5 + PHP 8.3
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.1
  • GitHub Check: PostgreSQL 17 + PostGIS 3.5 + PHP 8.2
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.2
  • GitHub Check: PostgreSQL 17 + PostGIS 3.4 + PHP 8.1
  • GitHub Check: PostgreSQL 16 + PostGIS 3.4 + PHP 8.1
  • GitHub Check: PostgreSQL 16 + PostGIS 3.5 + PHP 8.1
  • GitHub Check: wait-for-tests-worflows-before-upload
🔇 Additional comments (4)
tests/Integration/MartinGeorgiev/Doctrine/DBAL/Types/RangeTypeTestCase.php (1)

10-10: Import update LGTM; registration remains consistent.

No further changes needed here.

tests/Unit/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (2)

5-5: Unit test namespace realignment is correct.


9-9: Use statement updated to new FQCN — good.

tests/Integration/MartinGeorgiev/Doctrine/ORM/Query/AST/Functions/OverlapsTest.php (1)

12-17: Function registration is correct and minimal.

coderabbitai[bot]
coderabbitai bot previously approved these changes Sep 12, 2025
@coveralls
Copy link

Coverage Status

coverage: 95.592%. remained the same
when pulling 2f97943 on overlaps
into 8b0fab4 on main.

@martin-georgiev martin-georgiev merged commit 6435f06 into main Sep 12, 2025
67 checks passed
@martin-georgiev martin-georgiev deleted the overlaps branch September 12, 2025 10:53
@github-actions github-actions bot mentioned this pull request Sep 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants