chore(web): Remove join on connections for getRepos (#527)

This commit is contained in:
Brendan Kellam 2025-09-20 11:35:00 -07:00 committed by GitHub
parent 5bc8fc323a
commit a76ae68c64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 20 additions and 82 deletions

View file

@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Improved repository query performance by adding db indices. [#526](https://github.com/sourcebot-dev/sourcebot/pull/526) - Improved repository query performance by adding db indices. [#526](https://github.com/sourcebot-dev/sourcebot/pull/526)
- Improved repository query performance by removing JOIN on `Connection` table. [#527](https://github.com/sourcebot-dev/sourcebot/pull/527)
## [4.7.1] - 2025-09-19 ## [4.7.1] - 2025-09-19

View file

@ -110,10 +110,6 @@ export const repositoryQuerySchema = z.object({
repoDisplayName: z.string().optional(), repoDisplayName: z.string().optional(),
repoCloneUrl: z.string(), repoCloneUrl: z.string(),
webUrl: z.string().optional(), webUrl: z.string().optional(),
linkedConnections: z.array(z.object({
id: z.number(),
name: z.string(),
})),
imageUrl: z.string().optional(), imageUrl: z.string().optional(),
indexedAt: z.coerce.date().optional(), indexedAt: z.coerce.date().optional(),
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus), repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),

View file

@ -654,13 +654,6 @@ export const getRepos = async (filter: { status?: RepoIndexingStatus[], connecti
} }
} }
} : {}), } : {}),
},
include: {
connections: {
include: {
connection: true,
}
}
} }
}); });
@ -671,10 +664,6 @@ export const getRepos = async (filter: { status?: RepoIndexingStatus[], connecti
repoDisplayName: repo.displayName ?? undefined, repoDisplayName: repo.displayName ?? undefined,
repoCloneUrl: repo.cloneUrl, repoCloneUrl: repo.cloneUrl,
webUrl: repo.webUrl ?? undefined, webUrl: repo.webUrl ?? undefined,
linkedConnections: repo.connections.map(({ connection }) => ({
id: connection.id,
name: connection.name,
})),
imageUrl: repo.imageUrl ?? undefined, imageUrl: repo.imageUrl ?? undefined,
indexedAt: repo.indexedAt ?? undefined, indexedAt: repo.indexedAt ?? undefined,
repoIndexingStatus: repo.repoIndexingStatus, repoIndexingStatus: repo.repoIndexingStatus,

View file

@ -106,11 +106,8 @@ export const ErrorNavIndicator = () => {
<TooltipProvider> <TooltipProvider>
{repos {repos
.slice(0, 10) .slice(0, 10)
.filter(item => item.linkedConnections.length > 0) // edge case: don't show repos that are orphaned and awaiting gc.
.map(repo => ( .map(repo => (
// Link to the first connection for the repo <div key={repo.repoId} className="flex items-center gap-2 px-3 py-2 bg-red-50 dark:bg-red-900/20
<Link key={repo.repoId} href={`/${domain}/connections/${repo.linkedConnections[0].id}`} onClick={() => captureEvent('wa_error_nav_job_pressed', {})}>
<div className="flex items-center gap-2 px-3 py-2 bg-red-50 dark:bg-red-900/20
rounded-md text-sm text-red-700 dark:text-red-300 rounded-md text-sm text-red-700 dark:text-red-300
border border-red-200/50 dark:border-red-800/50 border border-red-200/50 dark:border-red-800/50
hover:bg-red-100 dark:hover:bg-red-900/30 transition-colors"> hover:bg-red-100 dark:hover:bg-red-900/30 transition-colors">
@ -123,7 +120,6 @@ export const ErrorNavIndicator = () => {
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</div> </div>
</Link>
))} ))}
</TooltipProvider> </TooltipProvider>
{repos.length > 10 && ( {repos.length > 10 && (

View file

@ -50,17 +50,13 @@ export const ProgressNavIndicator = () => {
<div className="flex flex-col gap-2 pl-4"> <div className="flex flex-col gap-2 pl-4">
{ {
inProgressRepos.slice(0, 10) inProgressRepos.slice(0, 10)
.filter(item => item.linkedConnections.length > 0) // edge case: don't show repos that are orphaned and awaiting gc.
.map(item => ( .map(item => (
// Link to the first connection for the repo <div key={item.repoId} className="flex items-center gap-2 px-3 py-2 bg-green-50 dark:bg-green-900/20
<Link key={item.repoId} href={`/${domain}/connections/${item.linkedConnections[0].id}`} onClick={() => captureEvent('wa_progress_nav_job_pressed', {})}>
<div className="flex items-center gap-2 px-3 py-2 bg-green-50 dark:bg-green-900/20
rounded-md text-sm text-green-700 dark:text-green-300 rounded-md text-sm text-green-700 dark:text-green-300
border border-green-200/50 dark:border-green-800/50 border border-green-200/50 dark:border-green-800/50
hover:bg-green-100 dark:hover:bg-green-900/30 transition-colors"> hover:bg-green-100 dark:hover:bg-green-900/30 transition-colors">
<span className="font-medium truncate">{item.repoName}</span> <span className="font-medium truncate">{item.repoName}</span>
</div> </div>
</Link>
) )
)} )}
{inProgressRepos.length > 10 && ( {inProgressRepos.length > 10 && (

View file

@ -4,7 +4,6 @@ import { Button } from "@/components/ui/button"
import type { ColumnDef } from "@tanstack/react-table" import type { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, ExternalLink, Clock, Loader2, CheckCircle2, XCircle, Trash2, Check, ListFilter } from "lucide-react" import { ArrowUpDown, ExternalLink, Clock, Loader2, CheckCircle2, XCircle, Trash2, Check, ListFilter } from "lucide-react"
import Image from "next/image" import Image from "next/image"
import { Badge } from "@/components/ui/badge"
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
import { cn, getRepoImageSrc } from "@/lib/utils" import { cn, getRepoImageSrc } from "@/lib/utils"
import { RepoIndexingStatus } from "@sourcebot/db"; import { RepoIndexingStatus } from "@sourcebot/db";
@ -14,10 +13,6 @@ export type RepositoryColumnInfo = {
repoId: number repoId: number
name: string name: string
imageUrl?: string imageUrl?: string
connections: {
id: number
name: string
}[]
repoIndexingStatus: RepoIndexingStatus repoIndexingStatus: RepoIndexingStatus
lastIndexed: string lastIndexed: string
url: string url: string
@ -136,35 +131,6 @@ export const columns = (domain: string): ColumnDef<RepositoryColumnInfo>[] => [
) )
}, },
}, },
{
accessorKey: "connections",
header: () => <div className="w-[200px]">Connections</div>,
cell: ({ row }) => {
const connections = row.original.connections
if (!connections || connections.length === 0) {
return <div className="text-muted-foreground text-sm"></div>
}
return (
<div className="flex flex-wrap gap-1.5">
{connections.map((connection) => (
<Badge
key={connection.id}
variant="outline"
className="text-xs px-2 py-0.5 hover:bg-muted cursor-pointer group flex items-center gap-1"
onClick={() => {
window.location.href = `/${domain}/connections/${connection.id}`
}}
>
{connection.name}
<ExternalLink className="h-3 w-3 text-muted-foreground opacity-50 group-hover:opacity-100 transition-opacity" />
</Badge>
))}
</div>
)
},
},
{ {
accessorKey: "repoIndexingStatus", accessorKey: "repoIndexingStatus",
header: ({ column }) => { header: ({ column }) => {

View file

@ -38,7 +38,6 @@ export const RepositoryTable = ({
if (reposLoading) return Array(4).fill(null).map(() => ({ if (reposLoading) return Array(4).fill(null).map(() => ({
repoId: 0, repoId: 0,
name: "", name: "",
connections: [],
repoIndexingStatus: RepoIndexingStatus.NEW, repoIndexingStatus: RepoIndexingStatus.NEW,
lastIndexed: "", lastIndexed: "",
url: "", url: "",
@ -50,7 +49,6 @@ export const RepositoryTable = ({
repoId: repo.repoId, repoId: repo.repoId,
name: repo.repoDisplayName ?? repo.repoName, name: repo.repoDisplayName ?? repo.repoName,
imageUrl: repo.imageUrl, imageUrl: repo.imageUrl,
connections: repo.linkedConnections,
repoIndexingStatus: repo.repoIndexingStatus as RepoIndexingStatus, repoIndexingStatus: repo.repoIndexingStatus as RepoIndexingStatus,
lastIndexed: repo.indexedAt?.toISOString() ?? "", lastIndexed: repo.indexedAt?.toISOString() ?? "",
url: repo.webUrl ?? repo.repoCloneUrl, url: repo.webUrl ?? repo.repoCloneUrl,

View file

@ -20,10 +20,6 @@ export const repositoryQuerySchema = z.object({
repoDisplayName: z.string().optional(), repoDisplayName: z.string().optional(),
repoCloneUrl: z.string(), repoCloneUrl: z.string(),
webUrl: z.string().optional(), webUrl: z.string().optional(),
linkedConnections: z.array(z.object({
id: z.number(),
name: z.string(),
})),
imageUrl: z.string().optional(), imageUrl: z.string().optional(),
indexedAt: z.coerce.date().optional(), indexedAt: z.coerce.date().optional(),
repoIndexingStatus: z.nativeEnum(RepoIndexingStatus), repoIndexingStatus: z.nativeEnum(RepoIndexingStatus),