@@ -22,7 +22,7 @@ internal class Warehouse
2222 private readonly TimeSpan _retryDelay = TimeSpan . FromSeconds ( 5 ) ;
2323 private readonly ILogger _logger ;
2424 private readonly ISqlConnectionFactory _statisticsDbConnectionFactory ;
25- private readonly IList < PackageDimension > _cachedPackageDimensions = new List < PackageDimension > ( ) ;
25+ private readonly IDictionary < PackageDimension , PackageDimension > _cachedPackageDimensions = new Dictionary < PackageDimension , PackageDimension > ( ) ;
2626 private readonly IList < ToolDimension > _cachedToolDimensions = new List < ToolDimension > ( ) ;
2727 private readonly IDictionary < string , int > _cachedClientDimensions = new Dictionary < string , int > ( ) ;
2828 private readonly IDictionary < string , int > _cachedPlatformDimensions = new Dictionary < string , int > ( ) ;
@@ -687,26 +687,28 @@ private async Task<IReadOnlyCollection<ToolDimension>> RetrieveToolDimensions(IR
687687
688688 private async Task < IReadOnlyCollection < PackageDimension > > RetrievePackageDimensions ( IReadOnlyCollection < PackageStatistics > sourceData , SqlConnection connection )
689689 {
690- var packages = sourceData
691- . Select ( e => new PackageDimension ( e . PackageId , e . PackageVersion ) )
692- . Distinct ( )
693- . ToList ( ) ;
694-
695690 var results = new List < PackageDimension > ( ) ;
696- if ( ! packages . Any ( ) )
697- {
698- return results ;
699- }
691+ var nonCachedPackageDimensions = new List < PackageDimension > ( ) ;
692+ var sourceDataPackages = new HashSet < PackageDimension > ( ) ;
700693
701- results . AddRange ( _cachedPackageDimensions
702- . Where ( p1 => packages
703- . FirstOrDefault ( p2 =>
704- string . Equals ( p1 . PackageId , p2 . PackageId , StringComparison . OrdinalIgnoreCase )
705- && string . Equals ( p1 . PackageVersion , p2 . PackageVersion , StringComparison . OrdinalIgnoreCase ) ) != null
706- )
707- ) ;
694+ foreach ( var sourceStatistics in sourceData )
695+ {
696+ var sourcePackage = new PackageDimension ( sourceStatistics . PackageId , sourceStatistics . PackageVersion ) ;
697+ if ( ! sourceDataPackages . Add ( sourcePackage ) )
698+ {
699+ // This package has already been seen in the sourceData
700+ continue ;
701+ }
708702
709- var nonCachedPackageDimensions = packages . Except ( results ) . ToList ( ) ;
703+ if ( _cachedPackageDimensions . TryGetValue ( sourcePackage , out var cachedPackage ) )
704+ {
705+ results . Add ( cachedPackage ) ;
706+ }
707+ else
708+ {
709+ nonCachedPackageDimensions . Add ( sourcePackage ) ;
710+ }
711+ }
710712
711713 if ( nonCachedPackageDimensions . Any ( ) )
712714 {
@@ -730,15 +732,8 @@ private async Task<IReadOnlyCollection<PackageDimension>> RetrievePackageDimensi
730732 Id = dataReader . GetInt32 ( 0 )
731733 } ;
732734
733- if ( ! results . Contains ( package ) )
734- {
735- results . Add ( package ) ;
736- }
737-
738- if ( ! _cachedPackageDimensions . Contains ( package ) )
739- {
740- _cachedPackageDimensions . Add ( package ) ;
741- }
735+ results . Add ( package ) ;
736+ _cachedPackageDimensions [ package ] = package ;
742737 }
743738 }
744739 }
0 commit comments