11package org .hjug .git ;
22
33import java .io .IOException ;
4- import java .util .Comparator ;
5- import java .util .List ;
6- import java .util .TreeMap ;
4+ import java .util .*;
75import lombok .extern .slf4j .Slf4j ;
86import org .eclipse .jgit .api .errors .GitAPIException ;
97import org .eclipse .jgit .lib .Repository ;
1210public class ChangePronenessRanker {
1311
1412 private final TreeMap <Integer , Integer > changeCountsByTimeStamps = new TreeMap <>();
13+ private final Map <String , ScmLogInfo > cachedScmLogInfos = new HashMap <>();
1514
1615 public ChangePronenessRanker (Repository repository , GitLogReader repositoryLogReader ) {
1716 try {
@@ -24,12 +23,18 @@ public ChangePronenessRanker(Repository repository, GitLogReader repositoryLogRe
2423
2524 public void rankChangeProneness (List <ScmLogInfo > scmLogInfos ) {
2625 for (ScmLogInfo scmLogInfo : scmLogInfos ) {
27- int commitsInRepositorySinceCreation =
28- changeCountsByTimeStamps .tailMap (scmLogInfo .getEarliestCommit ()).values ().stream ()
29- .mapToInt (i -> i )
30- .sum ();
31-
32- scmLogInfo .setChangeProneness ((float ) scmLogInfo .getCommitCount () / commitsInRepositorySinceCreation );
26+ if (!cachedScmLogInfos .containsKey (scmLogInfo .getPath ())) {
27+ int commitsInRepositorySinceCreation =
28+ changeCountsByTimeStamps .tailMap (scmLogInfo .getEarliestCommit ()).values ().stream ()
29+ .mapToInt (i -> i )
30+ .sum ();
31+
32+ scmLogInfo .setChangeProneness ((float ) scmLogInfo .getCommitCount () / commitsInRepositorySinceCreation );
33+ cachedScmLogInfos .put (scmLogInfo .getPath (), scmLogInfo );
34+ } else {
35+ scmLogInfo .setChangeProneness (
36+ cachedScmLogInfos .get (scmLogInfo .getPath ()).getChangeProneness ());
37+ }
3338 }
3439
3540 scmLogInfos .sort (Comparator .comparing (ScmLogInfo ::getChangeProneness ));
0 commit comments