Skip to content

Commit 74643a8

Browse files
committed
feat: Enhance issue deduplication in CodeAnalysisService and filter unresolved issues in FileViewService
1 parent 936ee9f commit 74643a8

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

java-ecosystem/libs/core/src/main/java/org/rostilos/codecrow/core/service/CodeAnalysisService.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,24 @@ private List<CodeAnalysisIssue> deduplicateBranchIssues(List<CodeAnalysisIssue>
987987
}
988988
}
989989

990-
return new ArrayList<>(byContentFp.values());
990+
// Pass 3: safety-net dedup for issues that survived with null fingerprints.
991+
// Group by (normalizedTitle + lineNumber) and keep only the latest version.
992+
Map<String, CodeAnalysisIssue> byTitleLine = new LinkedHashMap<>();
993+
for (CodeAnalysisIssue issue : byContentFp.values()) {
994+
String title = issue.getTitle();
995+
int line = issue.getLineNumber() != null ? issue.getLineNumber() : 0;
996+
if (title != null && !title.isBlank()) {
997+
String key = IssueFingerprint.normalizeTitle(title) + "::" + line;
998+
CodeAnalysisIssue existing = byTitleLine.get(key);
999+
if (existing == null || issue.getAnalysis().getId() > existing.getAnalysis().getId()) {
1000+
byTitleLine.put(key, issue);
1001+
}
1002+
} else {
1003+
byTitleLine.put("_id_" + issue.getId(), issue);
1004+
}
1005+
}
1006+
1007+
return new ArrayList<>(byTitleLine.values());
9911008
}
9921009

9931010
public void markIssueAsResolved(Long issueId) {

java-ecosystem/services/web-server/src/main/java/org/rostilos/codecrow/webserver/analysis/service/FileViewService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ public Optional<FileViewResponse> getPrFileView(Long projectId, Long prNumber, S
420420
List<CodeAnalysisIssue> fileIssues = codeAnalysisService.findIssuesByPrNumberAndFilePath(projectId, prNumber, filePath);
421421
List<FileViewResponse.InlineIssue> inlineIssues = fileIssues.stream()
422422
.filter(FileViewService::hasTitle)
423+
.filter(i -> !i.isResolved())
423424
.map(i -> new FileViewResponse.InlineIssue(
424425
i.getId(),
425426
correctLineNumber(i, lineHashes),
@@ -481,6 +482,7 @@ public Optional<FileSnippetResponse> getPrFileSnippet(
481482
int finalStartLine = startLine;
482483
int finalEndLine = endLine;
483484
List<FileViewResponse.InlineIssue> inlineIssues = allIssues.stream()
485+
.filter(i -> !i.isResolved())
484486
.filter(i -> {
485487
int ln = i.getLineNumber() != null ? i.getLineNumber() : 0;
486488
return ln >= finalStartLine && ln <= finalEndLine;
@@ -545,6 +547,7 @@ public Optional<FileSnippetResponse> getPrFileSnippetByRange(
545547
int finalStart = startLine;
546548
int finalEnd = endLine;
547549
List<FileViewResponse.InlineIssue> inlineIssues = allIssues.stream()
550+
.filter(i -> !i.isResolved())
548551
.filter(i -> {
549552
int ln = i.getLineNumber() != null ? i.getLineNumber() : 0;
550553
return ln >= finalStart && ln <= finalEnd;

0 commit comments

Comments
 (0)