|
20 | 20 | use Utopia\Database\Helpers\Role; |
21 | 21 | use Utopia\Database\PDO; |
22 | 22 | use Utopia\Database\Query; |
23 | | -use Utopia\Database\Validator\Authorization; |
24 | 23 | use Utopia\Validator\Boolean; |
25 | 24 | use Utopia\Validator\Integer; |
26 | 25 | use Utopia\Validator\Text; |
|
34 | 33 | * @Example |
35 | 34 | * docker compose exec tests bin/relationships --adapter=mariadb --limit=1000 |
36 | 35 | */ |
| 36 | + |
37 | 37 | $cli |
38 | 38 | ->task('relationships') |
39 | 39 | ->desc('Load database with mock relationships for testing') |
|
49 | 49 |
|
50 | 50 | Console::info("Filling {$adapter} with {$limit} records: {$name}"); |
51 | 51 |
|
| 52 | + $createRelationshipSchema = function (Database $database): void { |
| 53 | + if ($database->exists($database->getDatabase())) { |
| 54 | + $database->delete($database->getDatabase()); |
| 55 | + } |
| 56 | + $database->getAuthorization()->addRole(Role::any()->toString()); |
| 57 | + $database->create(); |
| 58 | + $database->createCollection('authors', permissions: [ |
| 59 | + Permission::create(Role::any()), |
| 60 | + Permission::read(Role::any()), |
| 61 | + Permission::update(Role::any()), |
| 62 | + ]); |
| 63 | + $database->createAttribute('authors', 'name', Database::VAR_STRING, 256, true); |
| 64 | + $database->createAttribute('authors', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']); |
| 65 | + $database->createAttribute('authors', 'bio', Database::VAR_STRING, 5000, true); |
| 66 | + $database->createAttribute('authors', 'avatar', Database::VAR_STRING, 256, true); |
| 67 | + $database->createAttribute('authors', 'website', Database::VAR_STRING, 256, true); |
| 68 | + |
| 69 | + $database->createCollection('articles', permissions: [ |
| 70 | + Permission::create(Role::any()), |
| 71 | + Permission::read(Role::any()), |
| 72 | + Permission::update(Role::any()), |
| 73 | + ]); |
| 74 | + $database->createAttribute('articles', 'title', Database::VAR_STRING, 256, true); |
| 75 | + $database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true); |
| 76 | + $database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true); |
| 77 | + $database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true); |
| 78 | + $database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true); |
| 79 | + |
| 80 | + $database->createCollection('users', permissions: [ |
| 81 | + Permission::create(Role::any()), |
| 82 | + Permission::read(Role::any()), |
| 83 | + Permission::update(Role::any()), |
| 84 | + ]); |
| 85 | + $database->createAttribute('users', 'username', Database::VAR_STRING, 256, true); |
| 86 | + $database->createAttribute('users', 'email', Database::VAR_STRING, 256, true); |
| 87 | + $database->createAttribute('users', 'password', Database::VAR_STRING, 256, true); |
| 88 | + |
| 89 | + $database->createCollection('comments', permissions: [ |
| 90 | + Permission::create(Role::any()), |
| 91 | + Permission::read(Role::any()), |
| 92 | + Permission::update(Role::any()), |
| 93 | + ]); |
| 94 | + $database->createAttribute('comments', 'content', Database::VAR_STRING, 256, true); |
| 95 | + $database->createAttribute('comments', 'likes', Database::VAR_INTEGER, 8, true, signed: false); |
| 96 | + |
| 97 | + $database->createCollection('profiles', permissions: [ |
| 98 | + Permission::create(Role::any()), |
| 99 | + Permission::read(Role::any()), |
| 100 | + Permission::update(Role::any()), |
| 101 | + ]); |
| 102 | + $database->createAttribute('profiles', 'bio_extended', Database::VAR_STRING, 10000, true); |
| 103 | + $database->createAttribute('profiles', 'social_links', Database::VAR_STRING, 256, true, array: true); |
| 104 | + $database->createAttribute('profiles', 'verified', Database::VAR_BOOLEAN, 0, true); |
| 105 | + |
| 106 | + $database->createCollection('categories', permissions: [ |
| 107 | + Permission::create(Role::any()), |
| 108 | + Permission::read(Role::any()), |
| 109 | + Permission::update(Role::any()), |
| 110 | + ]); |
| 111 | + $database->createAttribute('categories', 'name', Database::VAR_STRING, 256, true); |
| 112 | + $database->createAttribute('categories', 'description', Database::VAR_STRING, 1000, true); |
| 113 | + |
| 114 | + $database->createRelationship('authors', 'articles', Database::RELATION_MANY_TO_MANY, true, onDelete: Database::RELATION_MUTATE_SET_NULL); |
| 115 | + $database->createRelationship('articles', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'article', onDelete: Database::RELATION_MUTATE_CASCADE); |
| 116 | + $database->createRelationship('users', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'user', onDelete: Database::RELATION_MUTATE_CASCADE); |
| 117 | + $database->createRelationship('authors', 'profiles', Database::RELATION_ONE_TO_ONE, true, twoWayKey: 'author', onDelete: Database::RELATION_MUTATE_CASCADE); |
| 118 | + $database->createRelationship('articles', 'categories', Database::RELATION_MANY_TO_ONE, true, id: 'category', twoWayKey: 'articles', onDelete: Database::RELATION_MUTATE_SET_NULL); |
| 119 | + }; |
| 120 | + |
52 | 121 | $dbAdapters = [ |
53 | 122 | 'mariadb' => [ |
54 | 123 | 'host' => 'mariadb', |
|
98 | 167 | ->setNamespace($namespace) |
99 | 168 | ->setSharedTables($sharedTables); |
100 | 169 |
|
101 | | - createRelationshipSchema($database); |
| 170 | + $createRelationshipSchema($database); |
102 | 171 |
|
103 | 172 | // Create categories and users once before parallel batch creation |
104 | 173 | $globalDocs = createGlobalDocuments($database, $limit); |
|
165 | 234 | displayBenchmarkResults($results, $runs); |
166 | 235 | }); |
167 | 236 |
|
168 | | -function createRelationshipSchema(Database $database): void |
169 | | -{ |
170 | | - if ($database->exists($database->getDatabase())) { |
171 | | - $database->delete($database->getDatabase()); |
172 | | - } |
173 | | - $database->create(); |
174 | | - |
175 | | - Authorization::setRole(Role::any()->toString()); |
176 | | - |
177 | | - $database->createCollection('authors', permissions: [ |
178 | | - Permission::create(Role::any()), |
179 | | - Permission::read(Role::any()), |
180 | | - Permission::update(Role::any()), |
181 | | - ]); |
182 | | - $database->createAttribute('authors', 'name', Database::VAR_STRING, 256, true); |
183 | | - $database->createAttribute('authors', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']); |
184 | | - $database->createAttribute('authors', 'bio', Database::VAR_STRING, 5000, true); |
185 | | - $database->createAttribute('authors', 'avatar', Database::VAR_STRING, 256, true); |
186 | | - $database->createAttribute('authors', 'website', Database::VAR_STRING, 256, true); |
187 | | - |
188 | | - $database->createCollection('articles', permissions: [ |
189 | | - Permission::create(Role::any()), |
190 | | - Permission::read(Role::any()), |
191 | | - Permission::update(Role::any()), |
192 | | - ]); |
193 | | - $database->createAttribute('articles', 'title', Database::VAR_STRING, 256, true); |
194 | | - $database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true); |
195 | | - $database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true); |
196 | | - $database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true); |
197 | | - $database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true); |
198 | | - |
199 | | - $database->createCollection('users', permissions: [ |
200 | | - Permission::create(Role::any()), |
201 | | - Permission::read(Role::any()), |
202 | | - Permission::update(Role::any()), |
203 | | - ]); |
204 | | - $database->createAttribute('users', 'username', Database::VAR_STRING, 256, true); |
205 | | - $database->createAttribute('users', 'email', Database::VAR_STRING, 256, true); |
206 | | - $database->createAttribute('users', 'password', Database::VAR_STRING, 256, true); |
207 | | - |
208 | | - $database->createCollection('comments', permissions: [ |
209 | | - Permission::create(Role::any()), |
210 | | - Permission::read(Role::any()), |
211 | | - Permission::update(Role::any()), |
212 | | - ]); |
213 | | - $database->createAttribute('comments', 'content', Database::VAR_STRING, 256, true); |
214 | | - $database->createAttribute('comments', 'likes', Database::VAR_INTEGER, 8, true, signed: false); |
215 | | - |
216 | | - $database->createCollection('profiles', permissions: [ |
217 | | - Permission::create(Role::any()), |
218 | | - Permission::read(Role::any()), |
219 | | - Permission::update(Role::any()), |
220 | | - ]); |
221 | | - $database->createAttribute('profiles', 'bio_extended', Database::VAR_STRING, 10000, true); |
222 | | - $database->createAttribute('profiles', 'social_links', Database::VAR_STRING, 256, true, array: true); |
223 | | - $database->createAttribute('profiles', 'verified', Database::VAR_BOOLEAN, 0, true); |
224 | | - |
225 | | - $database->createCollection('categories', permissions: [ |
226 | | - Permission::create(Role::any()), |
227 | | - Permission::read(Role::any()), |
228 | | - Permission::update(Role::any()), |
229 | | - ]); |
230 | | - $database->createAttribute('categories', 'name', Database::VAR_STRING, 256, true); |
231 | | - $database->createAttribute('categories', 'description', Database::VAR_STRING, 1000, true); |
232 | | - |
233 | | - $database->createRelationship('authors', 'articles', Database::RELATION_MANY_TO_MANY, true, onDelete: Database::RELATION_MUTATE_SET_NULL); |
234 | | - $database->createRelationship('articles', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'article', onDelete: Database::RELATION_MUTATE_CASCADE); |
235 | | - $database->createRelationship('users', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'user', onDelete: Database::RELATION_MUTATE_CASCADE); |
236 | | - $database->createRelationship('authors', 'profiles', Database::RELATION_ONE_TO_ONE, true, twoWayKey: 'author', onDelete: Database::RELATION_MUTATE_CASCADE); |
237 | | - $database->createRelationship('articles', 'categories', Database::RELATION_MANY_TO_ONE, true, id: 'category', twoWayKey: 'articles', onDelete: Database::RELATION_MUTATE_SET_NULL); |
238 | | -} |
239 | 237 |
|
240 | 238 | function createGlobalDocuments(Database $database, int $limit): array |
241 | 239 | { |
|
0 commit comments