Skip to content

Conversation

@fogelito
Copy link
Contributor

@fogelito fogelito commented Jan 6, 2026

Summary by CodeRabbit

  • Dependencies

    • Updated database dependency constraint to an aliased development release.
  • Improvements

    • Export now requests related IDs individually for more precise data retrieval.
    • Query selection narrowed to single-field selections for more consistent behavior and simpler queries.
  • Documentation

    • Expanded documentation for the database migration input structure.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 6, 2026

Walkthrough

composer.json: require entry for "utopia-php/database" changed from "4.*" to "dev-joins8 as 5.0.0". The Reader interface querySelect parameter narrowed from array $columns to string $column; implementing classes src/Migration/Sources/Appwrite/Reader/API.php and src/Migration/Sources/Appwrite/Reader/Database.php updated accordingly and their PHPDoc adjusted. Appwrite::exportRows now calls querySelect per select item and rebuilds per-row relation selects for many-to-many handling before fetching rows. Database::fromArray PHPDoc documents an additional type field; no runtime signature changes.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Joins' is vague and does not clearly convey the specific changes made in the pull request, which involve refactoring querySelect to accept single column strings instead of arrays and updating dependency constraints. Consider using a more descriptive title that clearly summarizes the main changes, such as 'Refactor querySelect to accept single column parameter' or 'Update database dependency and refactor query selection API'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 85.71% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch joins

No actionable comments were generated in the recent review. 🎉


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
Contributor

@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: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Migration/Sources/Appwrite.php (1)

1160-1164: Critical: querySelect called with array instead of string.

The $stack variable is an array, but querySelect now expects a single string $column parameter per the updated interface. This will cause a type mismatch at runtime.

This code path needs to iterate over $stack elements, similar to lines 1146-1148:

🔎 Proposed fix
+                        $stackQueries = [];
+                        foreach ($stack as $stackColumn) {
+                            $stackQueries[] = $this->database->querySelect($stackColumn);
+                        }
+
                         $rowItem = $this->database->getRow(
                             $table,
                             $row['$id'],
-                            [$this->database->querySelect($stack)]
+                            $stackQueries
                         );
🤖 Fix all issues with AI Agents
In @src/Migration/Sources/Appwrite.php:
- Around line 1144-1148: The stale PHPDoc "@var Column|Relationship $attribute"
above the foreach is incorrect because the loop iterates over $selects as
$select; remove the erroneous PHPDoc or relocate it to the actual context where
$attribute is used (e.g., the block that handles $attribute variables), and
ensure the foreach uses no misleading docblock so PHPStan no longer flags
$attribute in the scope of the foreach over $selects/$select.

In @src/Migration/Sources/Appwrite/Reader/API.php:
- Around line 207-219: The querySelect method currently returns a Query object
via new Query('select', $column) while its native signature declares : string
and the PHPDoc says @return Query; replace the implementation to mirror other
methods by returning the static string form Query::select($column), update the
native return type to string (or adjust PHPDoc if you intentionally want a Query
object), and remove the unreachable/new Query(...) code so querySelect
consistently returns a string like the other query* methods.
🧹 Nitpick comments (1)
src/Migration/Sources/Appwrite/Reader.php (1)

5-5: Unused import.

The Utopia\Database\Query import is not used in this interface file. The interface only declares method signatures without referencing the Query class directly.

🔎 Proposed fix
 namespace Utopia\Migration\Sources\Appwrite;

-use Utopia\Database\Query;
 use Utopia\Migration\Resource;
 use Utopia\Migration\Resources\Database\Database;
 use Utopia\Migration\Resources\Database\Table;
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a4b99c3 and 01e06cf.

⛔ Files ignored due to path filters (1)
  • composer.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • composer.json
  • src/Migration/Resources/Database/Database.php
  • src/Migration/Sources/Appwrite.php
  • src/Migration/Sources/Appwrite/Reader.php
  • src/Migration/Sources/Appwrite/Reader/API.php
  • src/Migration/Sources/Appwrite/Reader/Database.php
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Supabase.php:300-308
Timestamp: 2025-06-28T09:47:58.757Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the user ItzNotABug prefers to keep the existing query logic unchanged even if it becomes semantically incorrect with the new naming. The focus is purely on resource type renaming, not on fixing logical issues that become apparent after the terminology change.
📚 Learning: 2025-06-28T09:47:58.757Z
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Supabase.php:300-308
Timestamp: 2025-06-28T09:47:58.757Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the user ItzNotABug prefers to keep the existing query logic unchanged even if it becomes semantically incorrect with the new naming. The focus is purely on resource type renaming, not on fixing logical issues that become apparent after the terminology change.

Applied to files:

  • src/Migration/Sources/Appwrite/Reader/Database.php
  • src/Migration/Sources/Appwrite/Reader.php
📚 Learning: 2025-11-20T13:12:43.482Z
Learnt from: ArnabChatterjee20k
Repo: utopia-php/migration PR: 114
File: src/Migration/Resources/Database/Collection.php:14-37
Timestamp: 2025-11-20T13:12:43.482Z
Learning: In the utopia-php/migration codebase, when Collection::fromArray is called, the input array is guaranteed to contain both the 'database' key and the nested 'type' key ($array['database']['type']), so defensive guards for these keys are not necessary.

Applied to files:

  • src/Migration/Resources/Database/Database.php
📚 Learning: 2025-06-28T09:45:36.026Z
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Resources/Database/Row.php:60-60
Timestamp: 2025-06-28T09:45:36.026Z
Learning: In the utopia-php/migration codebase, the `fromArray` method is not used on Row objects, so mismatches between `jsonSerialize()` output keys and `fromArray()` input expectations for Row class are not problematic.

Applied to files:

  • src/Migration/Resources/Database/Database.php
📚 Learning: 2025-07-30T12:06:02.331Z
Learnt from: abnegate
Repo: utopia-php/migration PR: 0
File: :0-0
Timestamp: 2025-07-30T12:06:02.331Z
Learning: In the utopia-php/migration codebase, the Utopia Database package does not have a Memory adapter. When testing classes that require a Database instance (like CSV), use PHPUnit's createMock() method to create proper mocks instead of trying to instantiate real database adapters.

Applied to files:

  • src/Migration/Sources/Appwrite/Reader.php
📚 Learning: 2025-06-28T09:47:08.333Z
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Appwrite.php:843-851
Timestamp: 2025-06-28T09:47:08.333Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the class constructors and method parameters use the new terminology (like "relatedTable"), but the underlying data structures and API responses still use the legacy keys (like "relatedCollection"). This is an intentional design pattern to allow gradual migration while maintaining compatibility with existing data sources.

Applied to files:

  • src/Migration/Sources/Appwrite/Reader.php
🧬 Code graph analysis (4)
src/Migration/Sources/Appwrite.php (3)
src/Migration/Sources/Appwrite/Reader/API.php (1)
  • querySelect (211-219)
src/Migration/Sources/Appwrite/Reader.php (1)
  • querySelect (84-84)
src/Migration/Sources/Appwrite/Reader/Database.php (1)
  • querySelect (359-362)
src/Migration/Sources/Appwrite/Reader/Database.php (2)
src/Migration/Sources/Appwrite/Reader/API.php (1)
  • querySelect (211-219)
src/Migration/Sources/Appwrite/Reader.php (1)
  • querySelect (84-84)
src/Migration/Sources/Appwrite/Reader.php (2)
src/Migration/Sources/Appwrite/Reader/Database.php (2)
  • Database (21-426)
  • querySelect (359-362)
src/Migration/Sources/Appwrite/Reader/API.php (1)
  • querySelect (211-219)
src/Migration/Sources/Appwrite/Reader/API.php (2)
src/Migration/Sources/Appwrite/Reader.php (1)
  • querySelect (84-84)
src/Migration/Sources/Appwrite/Reader/Database.php (1)
  • querySelect (359-362)
🪛 GitHub Actions: CodeQL
src/Migration/Sources/Appwrite.php

[error] 1146-1146: PHPStan: Variable $attribute in PHPDoc tag @var does not match any variable in the foreach loop: $selects, $select

src/Migration/Sources/Appwrite/Reader/API.php

[error] 211-211: PHPStan: PHPDoc tag @return with type Appwrite\Query is incompatible with native type string.

🔇 Additional comments (4)
src/Migration/Resources/Database/Database.php (1)

41-41: LGTM!

The PHPDoc update correctly documents the new type field, which is properly handled throughout the class (constructor, fromArray, jsonSerialize, and getType()).

composer.json (1)

29-29: Using a development branch dependency in a library is risky.

The dependency dev-joins8 as 4.3.0 points to an unstable development branch. This is appropriate for local development and testing, but should be updated to a tagged stable release before merging to main to avoid:

  • Unexpected breaking changes if the branch is updated
  • Build reproducibility issues
  • Potential instability for downstream consumers

Please confirm whether this is intentional for testing purposes and will be updated to a stable version before release.

src/Migration/Sources/Appwrite/Reader.php (1)

81-84: LGTM!

The interface signature change from array $columns to string $column is consistent with the PR's refactoring objective.

src/Migration/Sources/Appwrite/Reader/Database.php (1)

355-362: Cannot verify Query::select() accepts a single string without access to the dev-joins8 branch implementation.

The implementation assumes Query::select($column) accepts a single string parameter, which cannot be confirmed from the available codebase. The vendor code is not accessible in this environment, and external documentation for the dev-joins8 branch changes was not found. To validate this assumption, you must either:

  • Check the actual Query::select() method signature in the utopia-php/database dev-joins8 branch
  • Run the migration code against the target database to verify it functions correctly

Comment on lines 1144 to 1148
/** @var Column|Relationship $attribute */

$queries[] = $this->database->querySelect($selects);
foreach ($selects as $select) {
$queries[] = $this->database->querySelect($select);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Stale PHPDoc annotation causes pipeline failure.

The @var Column|Relationship $attribute annotation at line 1144 references $attribute, but the subsequent loop iterates over $selects/$select. This is flagged by PHPStan.

Remove or relocate the stale PHPDoc comment.

🔎 Proposed fix
-                /** @var Column|Relationship $attribute */
-
                 foreach ($selects as $select) {
                     $queries[] = $this->database->querySelect($select);
                 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
/** @var Column|Relationship $attribute */
$queries[] = $this->database->querySelect($selects);
foreach ($selects as $select) {
$queries[] = $this->database->querySelect($select);
}
foreach ($selects as $select) {
$queries[] = $this->database->querySelect($select);
}
🧰 Tools
🪛 GitHub Actions: CodeQL

[error] 1146-1146: PHPStan: Variable $attribute in PHPDoc tag @var does not match any variable in the foreach loop: $selects, $select

🤖 Prompt for AI Agents
In @src/Migration/Sources/Appwrite.php around lines 1144 - 1148, The stale
PHPDoc "@var Column|Relationship $attribute" above the foreach is incorrect
because the loop iterates over $selects as $select; remove the erroneous PHPDoc
or relocate it to the actual context where $attribute is used (e.g., the block
that handles $attribute variables), and ensure the foreach uses no misleading
docblock so PHPStan no longer flags $attribute in the scope of the foreach over
$selects/$select.

Copy link
Contributor

@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: 2

🤖 Fix all issues with AI agents
In `@src/Migration/Sources/Appwrite/Reader.php`:
- Around line 82-85: The implementation of querySelect in API.php contradicts
the Reader::querySelect signature: either change the API.php method return type
to match the actual object being returned (return Query instance / QueryType) or
change the body to return a string representation; specifically, in API.php
update the method declaration for querySelect to return the correct type (e.g.,
Query or QueryType) and return new Query('select', $column) (removing the
unreachable second return), or if you must keep a string return type, remove the
new Query(...) return and instead return Query::select($column) (ensuring
Query::select returns a string); eliminate the unreachable code and ensure the
declared return type matches the actual returned value (refer to
Reader::querySelect, API::querySelect, Query and Query::select).

In `@src/Migration/Sources/Appwrite/Reader/Database.php`:
- Around line 362-369: The method querySelect currently calls Query::select with
a string; change it to pass an array containing the column name so the
utopia-php/database API is used correctly: update the return in querySelect to
call Query::select with [$column] instead of $column, keeping the method
signature and return type intact.
🧹 Nitpick comments (1)
src/Migration/Sources/Appwrite/Reader.php (1)

5-5: Unused import.

The Query import is not used in this interface file. Consider removing it.

Suggested fix
-use Utopia\Database\Query;
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6a95abb and 53ce92c.

⛔ Files ignored due to path filters (1)
  • composer.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • composer.json
  • src/Migration/Sources/Appwrite.php
  • src/Migration/Sources/Appwrite/Reader.php
  • src/Migration/Sources/Appwrite/Reader/API.php
  • src/Migration/Sources/Appwrite/Reader/Database.php
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/Migration/Sources/Appwrite.php
  • src/Migration/Sources/Appwrite/Reader/API.php
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Supabase.php:300-308
Timestamp: 2025-06-28T09:47:58.757Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the user ItzNotABug prefers to keep the existing query logic unchanged even if it becomes semantically incorrect with the new naming. The focus is purely on resource type renaming, not on fixing logical issues that become apparent after the terminology change.
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Resources/Database/Row.php:60-60
Timestamp: 2025-06-28T09:45:36.026Z
Learning: In the utopia-php/migration codebase, the `fromArray` method is not used on Row objects, so mismatches between `jsonSerialize()` output keys and `fromArray()` input expectations for Row class are not problematic.
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Appwrite.php:843-851
Timestamp: 2025-06-28T09:47:08.333Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the class constructors and method parameters use the new terminology (like "relatedTable"), but the underlying data structures and API responses still use the legacy keys (like "relatedCollection"). This is an intentional design pattern to allow gradual migration while maintaining compatibility with existing data sources.
Learnt from: ArnabChatterjee20k
Repo: utopia-php/migration PR: 114
File: src/Migration/Resources/Database/Collection.php:14-37
Timestamp: 2025-11-20T13:12:43.482Z
Learning: In the utopia-php/migration codebase, when Collection::fromArray is called, the input array is guaranteed to contain both the 'database' key and the nested 'type' key ($array['database']['type']), so defensive guards for these keys are not necessary.
📚 Learning: 2025-06-28T09:47:58.757Z
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Supabase.php:300-308
Timestamp: 2025-06-28T09:47:58.757Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the user ItzNotABug prefers to keep the existing query logic unchanged even if it becomes semantically incorrect with the new naming. The focus is purely on resource type renaming, not on fixing logical issues that become apparent after the terminology change.

Applied to files:

  • src/Migration/Sources/Appwrite/Reader/Database.php
  • src/Migration/Sources/Appwrite/Reader.php
📚 Learning: 2025-07-30T12:06:02.331Z
Learnt from: abnegate
Repo: utopia-php/migration PR: 0
File: :0-0
Timestamp: 2025-07-30T12:06:02.331Z
Learning: In the utopia-php/migration codebase, the Utopia Database package does not have a Memory adapter. When testing classes that require a Database instance (like CSV), use PHPUnit's createMock() method to create proper mocks instead of trying to instantiate real database adapters.

Applied to files:

  • src/Migration/Sources/Appwrite/Reader.php
📚 Learning: 2025-06-28T09:47:08.333Z
Learnt from: ItzNotABug
Repo: utopia-php/migration PR: 80
File: src/Migration/Sources/Appwrite.php:843-851
Timestamp: 2025-06-28T09:47:08.333Z
Learning: In the utopia-php/migration codebase, during the terminology swap from Collection/Attribute/Document to Table/Column/Row, the class constructors and method parameters use the new terminology (like "relatedTable"), but the underlying data structures and API responses still use the legacy keys (like "relatedCollection"). This is an intentional design pattern to allow gradual migration while maintaining compatibility with existing data sources.

Applied to files:

  • src/Migration/Sources/Appwrite/Reader.php
🧬 Code graph analysis (2)
src/Migration/Sources/Appwrite/Reader/Database.php (2)
src/Migration/Sources/Appwrite/Reader/API.php (1)
  • querySelect (218-226)
src/Migration/Sources/Appwrite/Reader.php (1)
  • querySelect (85-85)
src/Migration/Sources/Appwrite/Reader.php (2)
src/Migration/Sources/Appwrite/Reader/Database.php (2)
  • Database (21-432)
  • querySelect (366-369)
src/Migration/Sources/Appwrite/Reader/API.php (1)
  • querySelect (218-226)
🔇 Additional comments (1)
composer.json (1)

29-29: Dev branch dependency should be replaced before merging to main.

Using dev-joins8 as 4.5.2 pins to an unstable development branch. This is acceptable for development/testing, but should be updated to a stable release tag before merging to main to avoid:

  • Breaking changes if the dev branch is rebased or deleted
  • Dependency resolution issues for consumers of this library

Is this PR intended to be merged as-is, or should the dependency be updated to a stable release once utopia-php/database publishes the joins feature?

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Copy link
Contributor

@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: 1

🤖 Fix all issues with AI agents
In `@composer.json`:
- Line 29: The composer.json currently pins "utopia-php/database" to the dev
branch ("dev-joins8 as 4.5.2"), which violates "minimum-stability": "stable";
update the dependency in composer.json to a stable constraint (e.g.,
"utopia-php/database": "4.*" or a specific released tag) and remove the
"dev-joins8 as 4.5.2" alias; also add a TODO comment in composer.json (or create
a tracking issue) referencing the joins8 branch and reminding to switch back to
the stable release once utopia-php/database publishes the merged release.

Copy link
Contributor

@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: 1

🤖 Fix all issues with AI agents
In `@src/Migration/Sources/Appwrite.php`:
- Around line 1155-1165: The bug is that inside the foreach over $manyToMany you
overwrite the $queries array instead of appending new Query objects; change the
assignment in the loop to append results of
$this->database->querySelect($relation . '.$id') to the existing $queries array
(so $queries[] = $this->database->querySelect(...)) so that the initial
$this->database->querySelect('$id') and all relation queries are preserved
before calling $this->database->getRow($table, $row['$id'], $queries) (check the
loop around the foreach ($manyToMany as $relation) and the subsequent getRow
call).
♻️ Duplicate comments (1)
src/Migration/Sources/Appwrite.php (1)

1148-1148: Stale PHPDoc annotation.

The @var Column|Relationship $attribute annotation is misplaced after the foreach loop that iterates over $attribute.

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.

1 participant