98 lines
2.8 KiB
TypeScript
Executable File
98 lines
2.8 KiB
TypeScript
Executable File
import { PrismaClient } from '@prisma/client';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
async function main() {
|
|
console.log('🔍 Checking for potential duplicate matches...');
|
|
|
|
// Group by unique match characteristics
|
|
// Since we can't easily do GROUP BY with HAVING count > 1 in Prisma standard API without raw query,
|
|
// we'll use a raw query for efficiency.
|
|
|
|
const duplicates = await prisma.$queryRaw<
|
|
{
|
|
home_team_id: string;
|
|
away_team_id: string;
|
|
mst_utc: bigint;
|
|
count: bigint;
|
|
ids: string[];
|
|
}[]
|
|
>`
|
|
SELECT
|
|
home_team_id,
|
|
away_team_id,
|
|
mst_utc,
|
|
COUNT(*) as count,
|
|
array_agg(id) as ids
|
|
FROM matches
|
|
WHERE home_team_id IS NOT NULL
|
|
AND away_team_id IS NOT NULL
|
|
GROUP BY home_team_id, away_team_id, mst_utc
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY count DESC
|
|
LIMIT 50;
|
|
`;
|
|
|
|
if (duplicates.length === 0) {
|
|
console.log(
|
|
'✅ No duplicate matches found based on (HomeTeam + AwayTeam + Date).',
|
|
);
|
|
return;
|
|
}
|
|
|
|
console.log(`⚠️ Found ${duplicates.length} sets of duplicate matches:\n`);
|
|
|
|
for (const group of duplicates) {
|
|
const homeTeam = await prisma.team.findUnique({
|
|
where: { id: group.home_team_id },
|
|
select: { name: true },
|
|
});
|
|
const awayTeam = await prisma.team.findUnique({
|
|
where: { id: group.away_team_id },
|
|
select: { name: true },
|
|
});
|
|
|
|
const date = new Date(Number(group.mst_utc)).toISOString();
|
|
console.log(
|
|
`📅 ${date} | ${homeTeam?.name} vs ${awayTeam?.name} (Count: ${group.count})`,
|
|
);
|
|
console.log(` IDs: ${group.ids.join(', ')}`);
|
|
|
|
// Check details of the duplicates to see if one is complete and one is not
|
|
for (const id of group.ids) {
|
|
const match = await prisma.match.findUnique({
|
|
where: { id },
|
|
include: {
|
|
oddCategories: { select: { dbId: true } },
|
|
footballTeamStats: { select: { id: true } },
|
|
basketballPlayerStats: { select: { id: true } },
|
|
playerEvents: { select: { id: true } },
|
|
officials: { select: { id: true } },
|
|
},
|
|
});
|
|
|
|
if (match) {
|
|
const counts = [
|
|
match.oddCategories.length > 0 ? 'Odds' : '',
|
|
match.footballTeamStats.length > 0 ? 'Stats' : '',
|
|
match.playerEvents.length > 0 ? 'Events' : '',
|
|
match.officials.length > 0 ? 'Officials' : '',
|
|
]
|
|
.filter(Boolean)
|
|
.join(', ');
|
|
|
|
console.log(
|
|
` - [${id}] Status: ${match.status} | Score: ${match.scoreHome}-${match.scoreAway} | Data: ${counts || 'None'}`,
|
|
);
|
|
}
|
|
}
|
|
console.log('---------------------------------------------------');
|
|
}
|
|
}
|
|
|
|
main()
|
|
.catch((e) => console.error(e))
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
});
|