perf(editor): cache executable statement ranges for large SQL scrolling

Co-authored-by: staff <staff@qimaos-MacBook-Pro.local>
This commit is contained in:
zipgandstaff authored and GitHub committed 2026-06-30 18:05:37 +08:00
1 parent 8162a420e3
commit ccb91784b3
3 files changed
+79 -15

No files matched your search

@@ -0,0 +1,25 @@
import type { Text } from "@codemirror/state";
import type { DatabaseType } from "@/types/database";
import { executableStatementRanges, type SqlTextRange } from "@/lib/sqlStatementRanges";
export interface ExecutableStatementRangeCache {
doc: Text;
databaseType?: DatabaseType;
byStart: Map<number, SqlTextRange>;
}
export type ExecutableStatementRangeParser = (sql: string, databaseType?: DatabaseType) => SqlTextRange[];
export function executableStatementRangeCacheForDoc(cache: ExecutableStatementRangeCache | null, doc: Text, databaseType?: DatabaseType, parse: ExecutableStatementRangeParser = executableStatementRanges): ExecutableStatementRangeCache {
if (cache?.doc === doc && cache.databaseType === databaseType) return cache;
const byStart = new Map<number, SqlTextRange>();
for (const range of parse(doc.toString(), databaseType)) {
byStart.set(range.from, range);
}
return { doc, databaseType, byStart };
}
export function executableStatementRangeStartingAt(cache: ExecutableStatementRangeCache, lineFrom: number): SqlTextRange | null {
return cache.byStart.get(lineFrom) ?? null;
}