From 5e4a73e8cb51b116bf7ef60a79d77d7a2ab87a6f Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 12 Jun 2025 13:47:03 -0400 Subject: [PATCH 1/5] Sequence as int --- src/Database/Document.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Database/Document.php b/src/Database/Document.php index 2ed634f46..4af45e8ec 100644 --- a/src/Database/Document.php +++ b/src/Database/Document.php @@ -62,9 +62,9 @@ public function getId(): string } /** - * @return string + * @return int */ - public function getSequence(): string + public function getSequence(): int { return $this->getAttribute('$sequence', ''); } From 364ba1b5bc23d1c244da1d7e6c532e88b411eda8 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 12 Jun 2025 13:58:50 -0400 Subject: [PATCH 2/5] Fix stan --- src/Database/Adapter.php | 2 +- src/Database/Adapter/SQL.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Database/Adapter.php b/src/Database/Adapter.php index 88fd7d64f..ffd7ede18 100644 --- a/src/Database/Adapter.php +++ b/src/Database/Adapter.php @@ -747,7 +747,7 @@ abstract public function deleteDocument(string $collection, string $id): bool; * Delete Documents * * @param string $collection - * @param array $sequences + * @param array $sequences * @param array $permissionIds * * @return int diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 31bc7e6a3..692eda71d 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -642,7 +642,7 @@ public function updateDocuments(string $collection, Document $updates, array $do * Delete Documents * * @param string $collection - * @param array $sequences + * @param array $sequences * @param array $permissionIds * * @return int From 19b1010b4ddd6868acef9b14a3a77644708f62e9 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 12 Jun 2025 13:59:26 -0400 Subject: [PATCH 3/5] Fix default --- src/Database/Document.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Database/Document.php b/src/Database/Document.php index 4af45e8ec..9c601d038 100644 --- a/src/Database/Document.php +++ b/src/Database/Document.php @@ -66,7 +66,7 @@ public function getId(): string */ public function getSequence(): int { - return $this->getAttribute('$sequence', ''); + return $this->getAttribute('$sequence', 0); } /** From 9290785488a1baddf4dd6fa0269e693ffcc60049 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 12 Jun 2025 14:17:25 -0400 Subject: [PATCH 4/5] Fix sequence type --- src/Database/Validator/Queries/Documents.php | 2 +- src/Database/Validator/Structure.php | 4 ++-- tests/e2e/Adapter/Scopes/DocumentTests.php | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Database/Validator/Queries/Documents.php b/src/Database/Validator/Queries/Documents.php index 4e5c13f5f..7bef9e466 100644 --- a/src/Database/Validator/Queries/Documents.php +++ b/src/Database/Validator/Queries/Documents.php @@ -38,7 +38,7 @@ public function __construct( $attributes[] = new Document([ '$id' => '$sequence', 'key' => '$sequence', - 'type' => Database::VAR_STRING, + 'type' => Database::VAR_INTEGER, 'array' => false, ]); $attributes[] = new Document([ diff --git a/src/Database/Validator/Structure.php b/src/Database/Validator/Structure.php index 478557697..e8f6d751f 100644 --- a/src/Database/Validator/Structure.php +++ b/src/Database/Validator/Structure.php @@ -32,8 +32,8 @@ class Structure extends Validator ], [ '$id' => '$sequence', - 'type' => Database::VAR_STRING, - 'size' => 255, + 'type' => Database::VAR_INTEGER, + 'size' => 8, 'required' => false, 'signed' => true, 'array' => false, diff --git a/tests/e2e/Adapter/Scopes/DocumentTests.php b/tests/e2e/Adapter/Scopes/DocumentTests.php index 3fdbb87d7..3475393ae 100644 --- a/tests/e2e/Adapter/Scopes/DocumentTests.php +++ b/tests/e2e/Adapter/Scopes/DocumentTests.php @@ -363,7 +363,7 @@ public function testCreateDocumentsWithDifferentAttributes(): void $documents = [ new Document([ '$id' => 'third', - '$sequence' => 'third', + '$sequence' => 3, 'string' => 'text📝', ]), new Document([ @@ -1765,9 +1765,9 @@ public function testFindByID(): void * @depends testFind * @param array $data * @return void - * @throws \Utopia\Database\Exception + * @throws DatabaseException */ - public function testFindByInternalID(array $data): void + public function testFindBySequence(array $data): void { /** @var Database $database */ $database = static::getDatabase(); From 0c92bfc08d1db2d8fc12628d111b95c3b3792346 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 12 Jun 2025 14:48:47 -0400 Subject: [PATCH 5/5] Fix types --- src/Database/Adapter/MariaDB.php | 4 ++-- src/Database/Adapter/Postgres.php | 4 ++-- src/Database/Adapter/SQL.php | 6 +++--- src/Database/Adapter/SQLite.php | 2 +- src/Database/Database.php | 4 ++-- tests/e2e/Adapter/Scopes/DocumentTests.php | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Database/Adapter/MariaDB.php b/src/Database/Adapter/MariaDB.php index bab2eb267..218f06e86 100644 --- a/src/Database/Adapter/MariaDB.php +++ b/src/Database/Adapter/MariaDB.php @@ -905,7 +905,7 @@ public function createDocument(string $collection, Document $document): Document $stmt->execute(); - $document['$sequence'] = $this->pdo->lastInsertId(); + $document['$sequence'] = (int) $this->pdo->lastInsertId(); if (empty($document['$sequence'])) { throw new DatabaseException('Error creating document empty "$sequence"'); @@ -1656,7 +1656,7 @@ public function find(string $collection, array $queries = [], ?int $limit = 25, unset($results[$index]['_uid']); } if (\array_key_exists('_id', $document)) { - $results[$index]['$sequence'] = $document['_id']; + $results[$index]['$sequence'] = (int) $document['_id']; unset($results[$index]['_id']); } if (\array_key_exists('_tenant', $document)) { diff --git a/src/Database/Adapter/Postgres.php b/src/Database/Adapter/Postgres.php index 37d2edeec..f5ed93b65 100644 --- a/src/Database/Adapter/Postgres.php +++ b/src/Database/Adapter/Postgres.php @@ -1028,7 +1028,7 @@ public function createDocument(string $collection, Document $document): Document try { $this->execute($stmt); - $lastInsertedId = $this->getPDO()->lastInsertId(); + $lastInsertedId = (int) $this->getPDO()->lastInsertId(); // Sequence can be manually set as well $document['$sequence'] ??= $lastInsertedId; @@ -1541,7 +1541,7 @@ public function find(string $collection, array $queries = [], ?int $limit = 25, unset($results[$index]['_uid']); } if (\array_key_exists('_id', $document)) { - $results[$index]['$sequence'] = $document['_id']; + $results[$index]['$sequence'] = (int) $document['_id']; unset($results[$index]['_id']); } if (\array_key_exists('_tenant', $document)) { diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 692eda71d..179ea908a 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -369,7 +369,7 @@ public function getDocument(string $collection, string $id, array $queries = [], $document = $document[0]; if (\array_key_exists('_id', $document)) { - $document['$sequence'] = $document['_id']; + $document['$sequence'] = (int) $document['_id']; unset($document['_id']); } if (\array_key_exists('_uid', $document)) { @@ -460,7 +460,7 @@ public function updateDocuments(string $collection, Document $updates, array $do } foreach ($sequences as $id => $value) { - $stmt->bindValue(":_id_{$id}", $value); + $stmt->bindValue(":_id_{$id}", $value, \PDO::PARAM_INT); } $attributeIndex = 0; @@ -1892,7 +1892,7 @@ public function createDocuments(string $collection, array $documents): array foreach ($documents as $document) { if (isset($sequences[$document->getId()])) { - $document['$sequence'] = $sequences[$document->getId()]; + $document['$sequence'] = (int) $sequences[$document->getId()]; } } } catch (PDOException $e) { diff --git a/src/Database/Adapter/SQLite.php b/src/Database/Adapter/SQLite.php index be2c4b5f7..fd42e2260 100644 --- a/src/Database/Adapter/SQLite.php +++ b/src/Database/Adapter/SQLite.php @@ -609,7 +609,7 @@ public function createDocument(string $collection, Document $document): Document $statment->execute(); $last = $statment->fetch(); - $document['$sequence'] = $last['id']; + $document['$sequence'] = (int) $last['id']; if (isset($stmtPermissions)) { $stmtPermissions->execute(); diff --git a/src/Database/Database.php b/src/Database/Database.php index 6ed45aa99..71b9497f9 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -165,8 +165,8 @@ class Database ], [ '$id' => '$sequence', - 'type' => self::VAR_STRING, - 'size' => Database::LENGTH_KEY, + 'type' => self::VAR_INTEGER, + 'size' => 8, 'required' => true, 'signed' => true, 'array' => false, diff --git a/tests/e2e/Adapter/Scopes/DocumentTests.php b/tests/e2e/Adapter/Scopes/DocumentTests.php index 3475393ae..e44c29e71 100644 --- a/tests/e2e/Adapter/Scopes/DocumentTests.php +++ b/tests/e2e/Adapter/Scopes/DocumentTests.php @@ -93,7 +93,7 @@ public function testCreateDocument(): Document // Test create document with manual internal id $manualIdDocument = $database->createDocument('documents', new Document([ '$id' => '56000', - '$sequence' => '56000', + '$sequence' => 56000, '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user(ID::custom('1'))), @@ -292,7 +292,7 @@ public function testCreateDocumentsWithAutoIncrement(): void for ($i = $sequence; $i <= ($sequence + $count); $i++) { $documents[] = new Document([ - '$sequence' => (string)$i, + '$sequence' => $i, '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -4228,7 +4228,7 @@ public function testExceptionCaseInsensitiveDuplicate(Document $document): Docum $database = static::getDatabase(); $document->setAttribute('$id', 'caseSensitive'); - $document->setAttribute('$sequence', '200'); + $document->setAttribute('$sequence', 200); $database->createDocument($document->getCollection(), $document); $document->setAttribute('$id', 'CaseSensitive');