diff --git a/app/Platform/Services/GameSuggestions/Strategies/CommonPlayersStrategy.php b/app/Platform/Services/GameSuggestions/Strategies/CommonPlayersStrategy.php index a8aeae3296..25090f6791 100644 --- a/app/Platform/Services/GameSuggestions/Strategies/CommonPlayersStrategy.php +++ b/app/Platform/Services/GameSuggestions/Strategies/CommonPlayersStrategy.php @@ -12,7 +12,6 @@ use App\Platform\Data\GameSuggestionContextData; use App\Platform\Enums\GameSuggestionReason; use Illuminate\Support\Collection; -use Illuminate\Support\Facades\DB; class CommonPlayersStrategy implements GameSuggestionStrategy { @@ -39,7 +38,7 @@ public function select(): ?Game ->whereAllAchievementsUnlocked() ->where('achievements_total', '>', 0) ->where('game_id', '!=', $this->sourceGame->id) - ->whereNull('deleted_at') + ->withTrashed() ->groupBy('game_id') ->orderByRaw('COUNT(*) DESC') ->limit(10) @@ -76,44 +75,14 @@ public function reasonContext(): ?GameSuggestionContextData * @return Collection */ private function getMasterUserIds(): Collection - { - $connection = DB::connection()->getDriverName(); - - return match ($connection) { - 'sqlite' => $this->getMasterUserIdsSQLite(), - default => $this->getMasterUserIdsMariaDB(), - }; - } - - /** - * @return Collection - */ - private function getMasterUserIdsMariaDB(): Collection { // Use the optimized index hint for MariaDB. // This is unfortunately not supported by SQLite. - return PlayerGame::from(DB::raw('`player_games` FORCE INDEX (player_games_completion_sample_idx)')) - ->where('game_id', $this->sourceGame->id) - ->where('user_id', '!=', $this->user->id) - ->whereAllAchievementsUnlocked() - ->whereNull('deleted_at') - ->whereRaw('id % 100 < 5') - ->limit(5) - ->pluck('user_id'); - } - - /** - * @return Collection - */ - private function getMasterUserIdsSQLite(): Collection - { - // For SQLite, we'll use a different approach to get a stable random sample. - // We use the rowid (which SQLite automatically provides) for sampling. return PlayerGame::where('game_id', $this->sourceGame->id) ->where('user_id', '!=', $this->user->id) ->whereAllAchievementsUnlocked() - ->whereNull('deleted_at') - ->orderByRaw('rowid % 100') + ->withTrashed() + ->whereRaw('id % 100 < 5') ->limit(5) ->pluck('user_id'); } diff --git a/database/migrations/2025_01_25_000000_update_player_games_table.php b/database/migrations/2025_01_25_000000_update_player_games_table.php new file mode 100644 index 0000000000..a9b60af5e1 --- /dev/null +++ b/database/migrations/2025_01_25_000000_update_player_games_table.php @@ -0,0 +1,41 @@ +dropIndex('player_games_completion_sample_idx'); + + $table->index([ + 'user_id', + 'achievements_unlocked', + 'achievements_total', + 'game_id', + ], 'player_games_suggestions_index'); // custom name needed because the auto-generated one is too long + }); + } + + public function down(): void + { + Schema::table('player_games', function (Blueprint $table) { + $table->dropIndex('player_games_suggestions_index'); + + $table->index( + [ + 'game_id', + 'achievements_unlocked', + 'achievements_total', + 'user_id', + 'id', + ], + 'player_games_completion_sample_idx' // custom name needed because the auto-generated one is too long + ); + }); + } +};