Skip to content

Commit df87cce

Browse files
committed
Scope file count aggregation to candidates (#1827)
1 parent b050bce commit df87cce

3 files changed

Lines changed: 58 additions & 30 deletions

File tree

src/CodeIndex/Database/DbReader.FilesStatus.cs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -407,20 +407,28 @@ FROM chunks c
407407
{
408408
using var cmd = _conn.CreateCommand();
409409
cmd.CommandText = $@"
410+
WITH file_match AS (
411+
SELECT f.id, f.path, f.lang, f.size, f.lines,
412+
{GetFileColumnSql("checksum")} AS checksum,
413+
{GetFileColumnSql("modified")} AS modified,
414+
{GetFileColumnSql("indexed_at")} AS indexed_at
415+
FROM files f
416+
WHERE f.path = @path
417+
)
410418
SELECT f.path, f.lang, f.size, f.lines,
411419
COALESCE(symbol_counts.symbol_count, 0) AS symbol_count,
412420
{FileReferenceCountSql} AS reference_count,
413-
{GetFileColumnSql("checksum")} AS checksum,
414-
{GetFileColumnSql("modified")} AS modified,
415-
{GetFileColumnSql("indexed_at")} AS indexed_at
416-
FROM files f
421+
f.checksum,
422+
f.modified,
423+
f.indexed_at
424+
FROM file_match f
417425
LEFT JOIN (
418-
SELECT file_id, COUNT(*) AS symbol_count
419-
FROM symbols
420-
GROUP BY file_id
426+
SELECT s.file_id, COUNT(*) AS symbol_count
427+
FROM symbols s
428+
JOIN file_match file_set ON file_set.id = s.file_id
429+
GROUP BY s.file_id
421430
) AS symbol_counts ON symbol_counts.file_id = f.id
422-
{FileReferenceCountJoinSql}
423-
WHERE f.path = @path";
431+
{BuildFileReferenceCountJoinSql("file_match")}";
424432
cmd.Parameters.AddWithValue("@path", path);
425433

426434
using var reader = cmd.ExecuteTrackedReader();

src/CodeIndex/Database/DbReader.cs

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -878,13 +878,14 @@ private HashSet<string> LoadHotspotFamilyReadyLanguages(SqliteConnection conn)
878878
}
879879
}
880880

881-
private string FileReferenceCountJoinSql =>
881+
private string BuildFileReferenceCountJoinSql(string fileSetCteName) =>
882882
_hasReferencesTable
883-
? @"
883+
? $@"
884884
LEFT JOIN (
885-
SELECT file_id, COUNT(*) AS reference_count
886-
FROM symbol_references
887-
GROUP BY file_id
885+
SELECT r.file_id, COUNT(*) AS reference_count
886+
FROM symbol_references r
887+
JOIN {fileSetCteName} file_set ON file_set.id = r.file_id
888+
GROUP BY r.file_id
888889
) AS reference_counts ON reference_counts.file_id = f.id"
889890
: string.Empty;
890891

@@ -1417,20 +1418,13 @@ public List<FileResult> ListFiles(string? query = null, int limit = 20, string?
14171418
using var cmd = _conn.CreateCommand();
14181419

14191420
var sql = $@"
1420-
SELECT f.path, f.lang, f.size, f.lines,
1421-
COALESCE(symbol_counts.symbol_count, 0) AS symbol_count,
1422-
{FileReferenceCountSql} AS reference_count,
1423-
{GetFileColumnSql("checksum")} AS checksum,
1424-
{GetFileColumnSql("modified")} AS modified,
1425-
{GetFileColumnSql("indexed_at")} AS indexed_at
1426-
FROM files f
1427-
LEFT JOIN (
1428-
SELECT file_id, COUNT(*) AS symbol_count
1429-
FROM symbols
1430-
GROUP BY file_id
1431-
) AS symbol_counts ON symbol_counts.file_id = f.id
1432-
{FileReferenceCountJoinSql}
1433-
WHERE 1=1";
1421+
WITH file_page AS (
1422+
SELECT f.id, f.path, f.lang, f.size, f.lines,
1423+
{GetFileColumnSql("checksum")} AS checksum,
1424+
{GetFileColumnSql("modified")} AS modified,
1425+
{GetFileColumnSql("indexed_at")} AS indexed_at
1426+
FROM files f
1427+
WHERE 1=1";
14341428

14351429
if (query != null)
14361430
sql += " AND f.path LIKE @query ESCAPE '\\'";
@@ -1441,6 +1435,24 @@ GROUP BY file_id
14411435
AppendPathFilters(ref sql, pathPatterns, excludePathPatterns, excludeTests);
14421436
sql += $" ORDER BY {PathBucketOrder}, f.path LIMIT @limit";
14431437

1438+
sql += $@"
1439+
)
1440+
SELECT f.path, f.lang, f.size, f.lines,
1441+
COALESCE(symbol_counts.symbol_count, 0) AS symbol_count,
1442+
{FileReferenceCountSql} AS reference_count,
1443+
f.checksum,
1444+
f.modified,
1445+
f.indexed_at
1446+
FROM file_page f
1447+
LEFT JOIN (
1448+
SELECT s.file_id, COUNT(*) AS symbol_count
1449+
FROM symbols s
1450+
JOIN file_page file_set ON file_set.id = s.file_id
1451+
GROUP BY s.file_id
1452+
) AS symbol_counts ON symbol_counts.file_id = f.id
1453+
{BuildFileReferenceCountJoinSql("file_page")}
1454+
ORDER BY {PathBucketOrder}, f.path";
1455+
14441456
cmd.CommandText = sql;
14451457
if (query != null)
14461458
cmd.Parameters.AddWithValue("@query", $"%{EscapeLikeQuery(query)}%");

tests/CodeIndex.Tests/DbReaderTests.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,11 @@ GROUP BY r.symbol_name
253253
[Fact]
254254
public void FileCountHelpers_UseGroupedReferenceCounts()
255255
{
256-
var joinSql = GetPrivateStringProperty(_reader, "FileReferenceCountJoinSql");
256+
var joinSql = InvokePrivateStringMethod(_reader, "BuildFileReferenceCountJoinSql", "file_page");
257257
var countSql = GetPrivateStringProperty(_reader, "FileReferenceCountSql");
258258

259-
Assert.Contains("GROUP BY file_id", joinSql, StringComparison.Ordinal);
259+
Assert.Contains("GROUP BY r.file_id", joinSql, StringComparison.Ordinal);
260+
Assert.Contains("JOIN file_page file_set ON file_set.id = r.file_id", joinSql, StringComparison.Ordinal);
260261
Assert.DoesNotContain("WHERE file_id = f.id", joinSql, StringComparison.OrdinalIgnoreCase);
261262
Assert.Equal("COALESCE(reference_counts.reference_count, 0)", countSql);
262263
}
@@ -451,6 +452,13 @@ private static string GetPrivateStringProperty(DbReader reader, string name)
451452
return Assert.IsType<string>(property!.GetValue(reader));
452453
}
453454

455+
private static string InvokePrivateStringMethod(DbReader reader, string name, params object[] args)
456+
{
457+
var method = typeof(DbReader).GetMethod(name, BindingFlags.Instance | BindingFlags.NonPublic);
458+
Assert.NotNull(method);
459+
return Assert.IsType<string>(method!.Invoke(reader, args));
460+
}
461+
454462
private SqliteCommand CreateSearchReferencesCommandForSql(string query)
455463
{
456464
var method = typeof(DbReader).GetMethod(

0 commit comments

Comments
 (0)