From 6603b763a0b01edb29790c0f29759920a30bc62d Mon Sep 17 00:00:00 2001 From: William Allen <16820599+williamjallen@users.noreply.github.com> Date: Thu, 15 Jan 2026 13:46:21 -0500 Subject: [PATCH] Remove unnecessary build2update pivot table --- app/Http/Controllers/BuildController.php | 32 +++++---- app/Http/Controllers/SiteController.php | 4 +- app/Http/Controllers/TestController.php | 8 +-- app/Http/Controllers/UserController.php | 4 +- app/Http/Submission/Handlers/DoneHandler.php | 2 +- app/Jobs/ProcessSubmission.php | 4 +- app/Models/Build.php | 8 +-- app/Models/BuildUpdate.php | 7 +- app/Utils/RepositoryUtils.php | 2 +- app/cdash/app/Controller/Api/Index.php | 3 +- app/cdash/app/Controller/Api/QueryTests.php | 3 +- app/cdash/app/Controller/Api/TestDetails.php | 4 +- app/cdash/app/Controller/Api/Timeline.php | 3 +- app/cdash/app/Lib/Repository/GitHub.php | 5 +- app/cdash/app/Model/Build.php | 11 ++- app/cdash/app/Model/BuildUpdate.php | 37 +++++----- app/cdash/app/Model/Repository.php | 3 +- app/cdash/include/filterdataFunctions.php | 2 +- app/cdash/tests/test_removebuilds.php | 8 +-- app/cdash/tests/test_sequenceindependence.php | 4 +- app/cdash/tests/test_updateappend.php | 2 +- ...6_01_15_143405_drop_build2update_table.php | 26 +++++++ graphql/schema.graphql | 4 +- phpstan-baseline.neon | 18 ----- tests/Feature/GraphQL/UpdateFileTypeTest.php | 67 ++++++++----------- tests/Feature/GraphQL/UpdateTypeTest.php | 45 +++++-------- 26 files changed, 148 insertions(+), 168 deletions(-) create mode 100644 database/migrations/2026_01_15_143405_drop_build2update_table.php diff --git a/app/Http/Controllers/BuildController.php b/app/Http/Controllers/BuildController.php index f2c64786ce..4b25552a74 100644 --- a/app/Http/Controllers/BuildController.php +++ b/app/Http/Controllers/BuildController.php @@ -319,10 +319,10 @@ public function apiBuildSummary(): JsonResponse SELECT * FROM buildupdate AS u, - build2update AS b2u + build AS b WHERE - b2u.updateid = u.id - AND b2u.buildid = ? + b.updateid = u.id + AND b.id = ? ', [$this->build->Id])[0] ?? []; // TODO: (williamjallen) Determine what $buildupdate was supposed to be. It is currently undefined. @@ -334,10 +334,10 @@ public function apiBuildSummary(): JsonResponse SELECT count(*) AS c FROM updatefile, - build2update AS b2u + build WHERE - updatefile.updateid=b2u.updateid - AND b2u.buildid = ? + updatefile.updateid=build.updateid + AND build.id = ? AND author = 'Local User' ", [$this->build->Id])[0]->c; @@ -352,8 +352,8 @@ public function apiBuildSummary(): JsonResponse $nupdates = (int) DB::select(' SELECT count(*) AS c - FROM updatefile, build2update AS b2u - WHERE updatefile.updateid=b2u.updateid AND b2u.buildid=? + FROM updatefile, build + WHERE updatefile.updateid=build.updateid AND build.id=? ', [$this->build->Id])[0]->c; $update_response['nupdates'] = $nupdates; @@ -436,7 +436,7 @@ public function apiBuildSummary(): JsonResponse // Previous build if ($previous_buildid > 0 && isset($previous_build)) { - $previous_build_update = EloquentBuild::findOrFail($previous_buildid)->updates()->first(); + $previous_build_update = EloquentBuild::findOrFail($previous_buildid)->updateStep; $response['previousbuild'] = [ 'buildid' => $previous_buildid, @@ -460,7 +460,7 @@ public function apiBuildSummary(): JsonResponse $next_build = new Build(); $next_build->Id = $next_buildid; $next_build->FillFromId($next_build->Id); - $next_build_update = EloquentBuild::findOrFail($next_buildid)->updates()->first(); + $next_build_update = EloquentBuild::findOrFail($next_buildid)->updateStep; $response['nextbuild'] = [ 'buildid' => $next_buildid, @@ -642,7 +642,7 @@ public function viewUpdatePageContent(): JsonResponse $response['build'] = $build_response; // Update - $update = EloquentBuild::findOrFail((int) $this->build->Id)->updates()->first(); + $update = EloquentBuild::findOrFail((int) $this->build->Id)->updateStep; $update_response = []; if ($update !== null) { @@ -896,8 +896,8 @@ public function apiViewBuildError(): JsonResponse ]; // Update - if ($eloquentBuild->updates()->exists()) { - $revision = $eloquentBuild->updates()->firstOrFail()->revision; + if ($eloquentBuild->updateStep !== null) { + $revision = $eloquentBuild->updateStep->revision; $extra_build_fields['revision'] = $revision; } else { $revision = null; @@ -1103,8 +1103,7 @@ public function apiBuildUpdateGraph(): JsonResponse b.starttime, bu.nfiles FROM build as b - JOIN build2update AS b2u ON b2u.buildid = b.id - JOIN buildupdate AS bu ON bu.id = b2u.updateid + JOIN buildupdate AS bu ON bu.id = b.updateid WHERE b.siteid = ? AND b.type = ? @@ -1161,8 +1160,7 @@ public function apiGetPreviousBuilds(): JsonResponse b.starttime, b.endtime FROM build AS b - LEFT JOIN build2update AS b2u ON (b2u.buildid=b.id) - LEFT JOIN buildupdate AS bu ON (b2u.updateid=bu.id) + LEFT JOIN buildupdate AS bu ON (bu.updateid=b.id) WHERE siteid = ? AND b.type = ? diff --git a/app/Http/Controllers/SiteController.php b/app/Http/Controllers/SiteController.php index 14ed67cf83..e79bdadad5 100644 --- a/app/Http/Controllers/SiteController.php +++ b/app/Http/Controllers/SiteController.php @@ -26,14 +26,12 @@ public function siteStatistics(): View|RedirectResponse AVG(submittime - buildupdate.starttime) AS elapsed FROM build, - build2update, buildupdate, project, site WHERE submittime > NOW() - interval '168 hours' - AND build2update.buildid = build.id - AND buildupdate.id = build2update.updateid + AND buildupdate.id = build.updateid AND site.id = build.siteid AND build.projectid = project.id GROUP BY diff --git a/app/Http/Controllers/TestController.php b/app/Http/Controllers/TestController.php index e03b2444f9..9c7fe0e1c4 100644 --- a/app/Http/Controllers/TestController.php +++ b/app/Http/Controllers/TestController.php @@ -302,17 +302,17 @@ public function apiTestSummary(): JsonResponse|StreamedResponse $prepared_array = Database::getInstance()->createPreparedArray(count($buildids)); $query = DB::select(" SELECT - b2u.buildid as buildid, + build.id as buildid, status, revision, priorrevision, path FROM buildupdate, - build2update AS b2u + build WHERE - b2u.updateid = buildupdate.id - AND b2u.buildid IN $prepared_array + build.updateid = buildupdate.id + AND build.id IN $prepared_array ", $buildids); foreach ($query as $row) { $status_by_buildid[(int) $row->buildid] = $row; diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 4616f60eae..3b82add369 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\BuildUpdate; use App\Models\Site; use App\Models\User; use App\Utils\AuthTokenUtil; @@ -293,7 +294,8 @@ private function ReportLastBuild(string $type, int $projectid, int $siteid, stri } // Update - $BuildUpdate = $build->updates()->first(); + /** @var ?BuildUpdate $BuildUpdate */ + $BuildUpdate = $build->updateStep; $response['update'] = $BuildUpdate->nfiles ?? 0; $response['updateclass'] = $BuildUpdate !== null && $BuildUpdate->warnings > 0 ? 'error' : 'normal'; diff --git a/app/Http/Submission/Handlers/DoneHandler.php b/app/Http/Submission/Handlers/DoneHandler.php index e55bd97702..149f790e33 100644 --- a/app/Http/Submission/Handlers/DoneHandler.php +++ b/app/Http/Submission/Handlers/DoneHandler.php @@ -66,7 +66,7 @@ public function endElement($parser, $name): void // Should we re-run any checks that were previously marked // as pending? if ($pendingSubmissionsModel !== null && $pendingSubmissionsModel->recheck) { - $revision = \App\Models\Build::findOrFail((int) $this->Build->Id)->updates()->first()->revision ?? ''; + $revision = \App\Models\Build::findOrFail((int) $this->Build->Id)->updateStep->revision ?? ''; Repository::createOrUpdateCheck($revision); } diff --git a/app/Jobs/ProcessSubmission.php b/app/Jobs/ProcessSubmission.php index 0f7a461e27..08892d4480 100644 --- a/app/Jobs/ProcessSubmission.php +++ b/app/Jobs/ProcessSubmission.php @@ -629,7 +629,7 @@ private static function send_update_email(UpdateHandler $handler, int $projectid $body = "$sitename has encountered errors during the Update step and you have been identified as the maintainer of this site.\n\n"; $body .= "*Update Errors*\n"; - $body .= 'Status: ' . $eloquentBuild->updates()->firstOrFail()->status . ' (' . url('/builds/' . $buildid . '/update') . ")\n"; + $body .= 'Status: ' . $eloquentBuild->updateStep?->status . ' (' . url('/builds/' . $buildid . '/update') . ")\n"; Mail::raw($body, function ($message) use ($subject, $recipients): void { $message->subject($subject) @@ -642,7 +642,7 @@ private static function send_update_email(UpdateHandler $handler, int $projectid /** Check for update errors for a given build. */ private static function check_email_update_errors(int $buildid): array { - $num_errors = \App\Models\Build::findOrFail($buildid)->updates()->first()->errors ?? 0; + $num_errors = \App\Models\Build::findOrFail($buildid)->updateStep->errors ?? 0; return [ 'hasfixes' => false, diff --git a/app/Models/Build.php b/app/Models/Build.php index 0fd0e7793f..66a074fc9c 100644 --- a/app/Models/Build.php +++ b/app/Models/Build.php @@ -310,13 +310,11 @@ public function pendingSubmissions(): HasOne } /** - * TODO: Perhaps rename this function in the future to make it less similar to Laravel's update()? - * - * @return BelongsToMany + * @return BelongsTo */ - public function updates(): BelongsToMany + public function updateStep(): BelongsTo { - return $this->belongsToMany(BuildUpdate::class, 'build2update', 'buildid', 'updateid'); + return $this->belongsTo(BuildUpdate::class, 'updateid'); } /** diff --git a/app/Models/BuildUpdate.php b/app/Models/BuildUpdate.php index e5ef24fc67..73b43c7433 100644 --- a/app/Models/BuildUpdate.php +++ b/app/Models/BuildUpdate.php @@ -5,7 +5,6 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Carbon; @@ -63,11 +62,11 @@ protected function errors(): Attribute } /** - * @return BelongsToMany + * @return HasMany */ - public function builds(): BelongsToMany + public function builds(): HasMany { - return $this->belongsToMany(Build::class, 'build2update', 'updateid', 'buildid'); + return $this->hasMany(Build::class, 'updateid'); } /** diff --git a/app/Utils/RepositoryUtils.php b/app/Utils/RepositoryUtils.php index dac09b9856..da32bb0d82 100644 --- a/app/Utils/RepositoryUtils.php +++ b/app/Utils/RepositoryUtils.php @@ -507,7 +507,7 @@ private static function get_email_summary(int $buildid, array $errors, $errorkey if ($errorkey === 'update_errors') { $information = "\n\n*Update*\n"; - $update = $eloquentBuild->updates()->firstOrFail(); + $update = $eloquentBuild->updateStep()->firstOrFail(); $information .= "Status: {$update->status} ({$serverURI}/builds/{$buildid}/update)\n"; $information .= 'Command: '; $information .= substr($update->command, 0, $maxchars); diff --git a/app/cdash/app/Controller/Api/Index.php b/app/cdash/app/Controller/Api/Index.php index 97dd4cff01..50a81ffdec 100644 --- a/app/cdash/app/Controller/Api/Index.php +++ b/app/cdash/app/Controller/Api/Index.php @@ -316,8 +316,7 @@ public function getIndexQuery(): string LEFT JOIN buildgroup AS g ON (g.id=b2g.groupid) LEFT JOIN buildgroupposition AS gp ON (gp.buildgroupid=g.id) LEFT JOIN site AS s ON (s.id=b.siteid) - LEFT JOIN build2update AS b2u ON (b2u.buildid=b.id) - LEFT JOIN buildupdate AS bu ON (b2u.updateid=bu.id) + LEFT JOIN buildupdate AS bu ON (b.updateid=bu.id) LEFT JOIN coveragesummary AS cs ON (cs.buildid=b.id) LEFT JOIN dynamicanalysissummary AS das ON (das.buildid=b.id) LEFT JOIN builderrordiff AS be_diff ON (be_diff.buildid=b.id AND be_diff.type=0) diff --git a/app/cdash/app/Controller/Api/QueryTests.php b/app/cdash/app/Controller/Api/QueryTests.php index b6498d2096..413f41e51c 100644 --- a/app/cdash/app/Controller/Api/QueryTests.php +++ b/app/cdash/app/Controller/Api/QueryTests.php @@ -321,8 +321,7 @@ public function getResponse(): array } if ($this->filterOnRevision) { $filter_joins .= ' - LEFT JOIN build2update b2u ON b2u.buildid = b.id - LEFT JOIN buildupdate bu ON bu.id = b2u.updateid'; + LEFT JOIN buildupdate bu ON bu.id = b.updateid'; } // Select extra data if we are filtering on test output. diff --git a/app/cdash/app/Controller/Api/TestDetails.php b/app/cdash/app/Controller/Api/TestDetails.php index 78582941d8..e2843f995f 100644 --- a/app/cdash/app/Controller/Api/TestDetails.php +++ b/app/cdash/app/Controller/Api/TestDetails.php @@ -166,8 +166,8 @@ function () use ($query): void { $stmt = $this->db->prepare( 'SELECT status, revision, priorrevision, path FROM buildupdate bu - JOIN build2update b2u ON (b2u.updateid = bu.id) - WHERE b2u.buildid = :buildid'); + JOIN build b ON (b.updateid = bu.id) + WHERE b.id = :buildid'); $this->db->execute($stmt, [':buildid' => $this->build->Id]); $status_array = $stmt->fetch(); if (is_array($status_array)) { diff --git a/app/cdash/app/Controller/Api/Timeline.php b/app/cdash/app/Controller/Api/Timeline.php index 6cf9e15d91..e3184fe796 100644 --- a/app/cdash/app/Controller/Api/Timeline.php +++ b/app/cdash/app/Controller/Api/Timeline.php @@ -210,8 +210,7 @@ private function chartForBuildGroup() FROM build b JOIN build2group b2g ON b2g.buildid = b.id JOIN buildgroup bg ON bg.id = b2g.groupid - LEFT JOIN build2update b2u ON b2u.buildid = b.id - LEFT JOIN buildupdate bu ON bu.id = b2u.updateid + LEFT JOIN buildupdate bu ON bu.id = b.updateid WHERE b.projectid = :projectid AND b.parentid IN (0, -1) AND bg.name = :buildgroupname ORDER BY starttime'); diff --git a/app/cdash/app/Lib/Repository/GitHub.php b/app/cdash/app/Lib/Repository/GitHub.php index 52b0713026..ac68bd4914 100644 --- a/app/cdash/app/Lib/Repository/GitHub.php +++ b/app/cdash/app/Lib/Repository/GitHub.php @@ -227,8 +227,7 @@ public function getBuildRowsForCheck(string $head_sha): array SELECT b.id, b.name, b.builderrors, b.configureerrors, b.testfailed, b.done, b.starttime, bp.properties FROM build b - JOIN build2update b2u ON b2u.buildid = b.id - JOIN buildupdate bu ON bu.id = b2u.updateid + JOIN buildupdate bu ON bu.id = b.updateid LEFT JOIN buildproperties bp ON bp.buildid = b.id WHERE bu.revision = :sha'); $this->db->execute($stmt, [':sha' => $head_sha]); @@ -481,7 +480,7 @@ public function compareCommits(BuildUpdate $update): bool if ($previous_buildid < 1) { return false; } - $previous_update = \App\Models\Build::findOrFail($previous_buildid)->updates()->first(); + $previous_update = \App\Models\Build::findOrFail($previous_buildid)->updateStep; if ($previous_update === null) { return false; } diff --git a/app/cdash/app/Model/Build.php b/app/cdash/app/Model/Build.php index 9fa22b8681..cb34973b28 100644 --- a/app/cdash/app/Model/Build.php +++ b/app/cdash/app/Model/Build.php @@ -1365,8 +1365,8 @@ public function ComputeUpdateStatistics(): bool // Record user statistics for each updated file. $updatefiles_stmt = $this->PDO->prepare( "SELECT author,email,checkindate,filename FROM updatefile AS uf - JOIN build2update AS b2u ON b2u.updateid=uf.updateid - WHERE b2u.buildid=? AND checkindate>'1980-01-01T00:00:00' + JOIN build AS b ON b.updateid=uf.updateid + WHERE b.id=? AND checkindate>'1980-01-01T00:00:00' ORDER BY author ASC, checkindate ASC"); pdo_execute($updatefiles_stmt, [$this->Id]); @@ -2345,11 +2345,10 @@ public function GetCommitAuthors(): array // file submission. if ($this->CommitAuthors === []) { - $update_files = EloquentBuild::with('updates.updateFiles') + $update_files = EloquentBuild::with('updateStep.updateFiles') ->findOrFail((int) $this->Id) - ->updates - ->pluck('updateFiles') - ->flatten(); + ->updateStep + ->updateFiles ?? []; $authors = []; /** @var BuildUpdateFile $row */ diff --git a/app/cdash/app/Model/BuildUpdate.php b/app/cdash/app/Model/BuildUpdate.php index c15a032e15..ba30c29e85 100644 --- a/app/cdash/app/Model/BuildUpdate.php +++ b/app/cdash/app/Model/BuildUpdate.php @@ -20,6 +20,7 @@ use App\Models\Build; use App\Models\BuildUpdate as EloquentBuildUpdate; use App\Models\BuildUpdateFile; +use Exception; use Illuminate\Support\Facades\DB; class BuildUpdate @@ -56,7 +57,8 @@ public function Insert(): int|bool $build = Build::findOrFail((int) $this->BuildId); // Check if this update already exists. - $update = $build->updates()->first(); + /** @var ?EloquentBuildUpdate $update */ + $update = $build->updateStep; $exists = false; if ($update !== null) { $exists = true; @@ -66,11 +68,11 @@ public function Insert(): int|bool // Remove previous updates if ($exists && !$this->Append) { // Parent builds share updates with their children. - // So if this is a parent build remove any build2update rows + // So if this is a parent build remove any associations // from the children here. /** @var Build $child_build */ foreach ($build->children as $child_build) { - $child_build->updates()->detach(); + $child_build->updateStep()->dissociate(); } // If the buildupdate and updatefile are not shared @@ -78,7 +80,7 @@ public function Insert(): int|bool if ($update->builds()->count() === 1) { $update->delete(); } - $build->updates()->detach(); + $build->updateStep()->dissociate(); $exists = false; $this->UpdateId = ''; } @@ -109,13 +111,13 @@ public function Insert(): int|bool 'priorrevision' => $this->PriorRevision ?? '', 'path' => $this->Path ?? '', ]); - $update_model->builds()->attach((int) $this->BuildId); + $update_model->builds()->save($build); $this->UpdateId = $update_model->id; // If this is a parent build, make sure that all of its children // are also associated with a buildupdate. - $children_needing_buildupdates = $build->children()->whereDoesntHave('updates')->pluck('id'); - $update_model->builds()->attach($children_needing_buildupdates); + $children_needing_buildupdates = $build->children()->whereDoesntHave('updateStep')->get(); + $update_model->builds()->saveMany($children_needing_buildupdates); } else { $update_model = EloquentBuildUpdate::findOrFail((int) $this->UpdateId); $update_model->update([ @@ -148,7 +150,7 @@ public function AssociateBuild(int $siteid, string $name, $stamp): bool } // If we already have something in the database we return - if ($build->updates()->exists()) { + if ($build->updateStep()->exists()) { return true; } @@ -157,19 +159,24 @@ public function AssociateBuild(int $siteid, string $name, $stamp): bool 'stamp' => $stamp, 'name' => $name, 'siteid' => $siteid, - ])->whereNot('id', (int) $this->BuildId)->whereHas('updates')->first(); + ])->whereNot('id', (int) $this->BuildId) + ->whereHas('updateStep') + ->first(); if ($similar_build === null) { return true; } - $this->UpdateId = $similar_build->updates()->firstOrFail()->id; + $this->UpdateId = $similar_build->updateStep?->id; + if ($this->UpdateId === null) { + throw new Exception('BuildUpdate::AssociateBuild(): UpdateId not set'); + } - $build->updates()->attach($this->UpdateId); + $build->updateStep()->associate($this->UpdateId)->save(); // check if this build's parent also needs to be associated with // this update. - $build->parent?->updates()->syncWithoutDetaching((int) $this->UpdateId); + $build->parent?->updateStep()->associate((int) $this->UpdateId)->save(); return true; } @@ -182,17 +189,17 @@ public static function AssignUpdateToChild(int $childid, int $parentid): void $parentBuild = Build::findOrFail($parentid); // Make sure the child does not already have an update. - if ($childBuild->updates()->exists()) { + if ($childBuild->updateStep()->exists()) { return; } // Get the parent's update. - $updateid = $parentBuild->updates()->first()?->id; + $updateid = $parentBuild->updateStep?->id; if ($updateid === null) { return; } // Assign the parent's update to the child. - $childBuild->updates()->attach($updateid); + $childBuild->updateStep()->associate($updateid)->save(); } } diff --git a/app/cdash/app/Model/Repository.php b/app/cdash/app/Model/Repository.php index 54ceb475ef..205fbc41a1 100644 --- a/app/cdash/app/Model/Repository.php +++ b/app/cdash/app/Model/Repository.php @@ -72,8 +72,7 @@ public static function createOrUpdateCheck($sha): void $db->getPdo(); $stmt = $db->prepare(' SELECT projectid FROM build b - JOIN build2update b2u ON b2u.buildid = b.id - JOIN buildupdate bu ON bu.id = b2u.updateid + JOIN buildupdate bu ON bu.id = b.updateid WHERE bu.revision = :sha LIMIT 1'); $db->execute($stmt, ['sha' => $sha]); diff --git a/app/cdash/include/filterdataFunctions.php b/app/cdash/include/filterdataFunctions.php index a67edd0f3c..eec0a68ab2 100644 --- a/app/cdash/include/filterdataFunctions.php +++ b/app/cdash/include/filterdataFunctions.php @@ -285,7 +285,7 @@ public function getSqlField($field): string break; case 'updatedfiles': - $sql_field = '(SELECT COUNT(uf.updateid) FROM updatefile AS uf, build2update AS b2u WHERE b2u.updateid=uf.updateid AND b2u.buildid=b.id)'; + $sql_field = '(SELECT COUNT(uf.updateid) FROM updatefile AS uf WHERE uf.updateid=b.updateid)'; break; diff --git a/app/cdash/tests/test_removebuilds.php b/app/cdash/tests/test_removebuilds.php index 06a6f887f7..82c55a0b2e 100644 --- a/app/cdash/tests/test_removebuilds.php +++ b/app/cdash/tests/test_removebuilds.php @@ -163,8 +163,7 @@ public function testBuildRemovalWorksAsExpected(): void $update->Command = 'git fetch'; $update->Insert(); - DB::insert("INSERT INTO build2update (buildid, updateid) - VALUES ($existing_build->Id, $update->UpdateId)"); + App\Models\Build::findOrFail((int) $existing_build->Id)->updateStep()->associate((int) $update->UpdateId)->save(); // Coverage $file1 = new CoverageFile(); @@ -465,8 +464,7 @@ public function testBuildRemovalWorksAsExpected(): void $imgids = $this->verify_get_rows('test2image', 'imgid', 'testid', 'IN', $testids, 2); $this->verify('image', 'id', 'IN', $imgids, 2); - $updateid = - $this->verify_get_rows('build2update', 'updateid', 'buildid', '=', $build->Id, 1); + $updateid = $this->verify_get_rows('build', 'updateid', 'id', '=', $build->Id, 1); $this->verify('buildupdate', 'id', '=', $updateid, 1); $this->verify('updatefile', 'updateid', '=', $updateid, 1); @@ -493,7 +491,6 @@ public function testBuildRemovalWorksAsExpected(): void $this->verify('build2group', 'buildid', '=', $build->Id, 0, $extra_msg); $this->verify('build2note', 'buildid', '=', $build->Id, 0, $extra_msg); $this->verify('build2test', 'buildid', '=', $build->Id, 0, $extra_msg); - $this->verify('build2update', 'buildid', '=', $build->Id, 0, $extra_msg); $this->verify('build2uploadfile', 'buildid', '=', $build->Id, 0, $extra_msg); $this->verify('buildemail', 'buildid', '=', $build->Id, 0, $extra_msg); $this->verify('builderror', 'buildid', '=', $build->Id, 0, $extra_msg); @@ -536,7 +533,6 @@ public function testBuildRemovalWorksAsExpected(): void $this->verify('build2group', 'buildid', '=', $existing_build->Id, 0, $extra_msg); $this->verify('build2note', 'buildid', '=', $existing_build->Id, 0, $extra_msg); $this->verify('build2test', 'buildid', '=', $existing_build->Id, 0, $extra_msg); - $this->verify('build2update', 'buildid', '=', $existing_build->Id, 0, $extra_msg); $this->verify('build2uploadfile', 'buildid', '=', $existing_build->Id, 0, $extra_msg); $this->verify('buildemail', 'buildid', '=', $existing_build->Id, 0, $extra_msg); $this->verify('builderror', 'buildid', '=', $existing_build->Id, 0, $extra_msg); diff --git a/app/cdash/tests/test_sequenceindependence.php b/app/cdash/tests/test_sequenceindependence.php index e4fdc98528..6de648a78e 100644 --- a/app/cdash/tests/test_sequenceindependence.php +++ b/app/cdash/tests/test_sequenceindependence.php @@ -336,8 +336,8 @@ public function VerifyBuild() $update_query = "SELECT bu.nfiles FROM buildupdate AS bu - INNER JOIN build2update AS b2u ON (b2u.updateid=bu.id) - WHERE b2u.buildid='$buildid'"; + INNER JOIN build AS b ON (b.updateid=bu.id) + WHERE b.id='$buildid'"; $update_result = DB::select($update_query); if ($update_result === []) { $this->fail('update query returned false'); diff --git a/app/cdash/tests/test_updateappend.php b/app/cdash/tests/test_updateappend.php index f86c454eb2..74e0ebe59b 100644 --- a/app/cdash/tests/test_updateappend.php +++ b/app/cdash/tests/test_updateappend.php @@ -55,7 +55,7 @@ public function testUpdateAppend() $buildid = $buildids[0]; // Get the updateid associated with the build id - $query = pdo_query('SELECT updateid FROM build2update WHERE buildid=' . qnum($buildid)); + $query = pdo_query('SELECT updateid FROM build WHERE id=' . qnum($buildid)); $query_array = pdo_fetch_array($query); $updateid = $query_array['updateid']; $build_query = pdo_query('SELECT * FROM buildupdate WHERE id=' . qnum($updateid)); diff --git a/database/migrations/2026_01_15_143405_drop_build2update_table.php b/database/migrations/2026_01_15_143405_drop_build2update_table.php new file mode 100644 index 0000000000..712e890bc2 --- /dev/null +++ b/database/migrations/2026_01_15_143405_drop_build2update_table.php @@ -0,0 +1,26 @@ +updates()->create([ + $update = BuildUpdate::create([ 'command' => Str::uuid()->toString(), 'type' => 'GIT', 'status' => Str::uuid()->toString(), @@ -59,6 +59,7 @@ public function testBasicFieldAccess(): void 'priorrevision' => Str::uuid()->toString(), 'path' => Str::uuid()->toString(), ]); + $build->updateStep()->associate($update)->save(); /** @var BuildUpdateFile $updateFile */ $updateFile = $update->updateFiles()->create([ @@ -76,23 +77,19 @@ public function testBasicFieldAccess(): void $this->graphQL(' query build($id: ID) { build(id: $id) { - updates { - edges { - node { - updateFiles { - edges { - node { - fileName - authorName - authorEmail - committerName - committerEmail - log - revision - priorRevision - status - } - } + updateStep { + updateFiles { + edges { + node { + fileName + authorName + authorEmail + committerName + committerEmail + log + revision + priorRevision + status } } } @@ -104,26 +101,20 @@ public function testBasicFieldAccess(): void ])->assertExactJson([ 'data' => [ 'build' => [ - 'updates' => [ - 'edges' => [ - [ - 'node' => [ - 'updateFiles' => [ - 'edges' => [ - [ - 'node' => [ - 'fileName' => $updateFile->filename, - 'authorName' => $updateFile->author, - 'authorEmail' => $updateFile->email, - 'committerName' => $updateFile->committer, - 'committerEmail' => $updateFile->committeremail, - 'log' => $updateFile->log, - 'revision' => $updateFile->revision, - 'priorRevision' => $updateFile->priorrevision, - 'status' => $updateFile->status, - ], - ], - ], + 'updateStep' => [ + 'updateFiles' => [ + 'edges' => [ + [ + 'node' => [ + 'fileName' => $updateFile->filename, + 'authorName' => $updateFile->author, + 'authorEmail' => $updateFile->email, + 'committerName' => $updateFile->committer, + 'committerEmail' => $updateFile->committeremail, + 'log' => $updateFile->log, + 'revision' => $updateFile->revision, + 'priorRevision' => $updateFile->priorrevision, + 'status' => $updateFile->status, ], ], ], diff --git a/tests/Feature/GraphQL/UpdateTypeTest.php b/tests/Feature/GraphQL/UpdateTypeTest.php index 566c50ca8f..d0b4fa96f1 100644 --- a/tests/Feature/GraphQL/UpdateTypeTest.php +++ b/tests/Feature/GraphQL/UpdateTypeTest.php @@ -50,7 +50,7 @@ public function testBasicFieldAccess(): void ]); /** @var BuildUpdate $update */ - $update = $build->updates()->create([ + $update = BuildUpdate::create([ 'command' => Str::uuid()->toString(), 'type' => 'GIT', 'status' => Str::uuid()->toString(), @@ -58,22 +58,19 @@ public function testBasicFieldAccess(): void 'priorrevision' => Str::uuid()->toString(), 'path' => Str::uuid()->toString(), ]); + $build->updateStep()->associate($update)->save(); $this->graphQL(' query build($id: ID) { build(id: $id) { - updates { - edges { - node { - id - command - type - status - revision - priorRevision - path - } - } + updateStep { + id + command + type + status + revision + priorRevision + path } } } @@ -82,20 +79,14 @@ public function testBasicFieldAccess(): void ])->assertExactJson([ 'data' => [ 'build' => [ - 'updates' => [ - 'edges' => [ - [ - 'node' => [ - 'id' => (string) $update->id, - 'command' => $update->command, - 'type' => $update->type, - 'status' => $update->status, - 'revision' => $update->revision, - 'priorRevision' => $update->priorrevision, - 'path' => $update->path, - ], - ], - ], + 'updateStep' => [ + 'id' => (string) $update->id, + 'command' => $update->command, + 'type' => $update->type, + 'status' => $update->status, + 'revision' => $update->revision, + 'priorRevision' => $update->priorrevision, + 'path' => $update->path, ], ], ],