@@ -6,6 +6,7 @@ import 'dart:math' as math;
66
77import 'package:_pub_shared/search/search_form.dart' ;
88import 'package:clock/clock.dart' ;
9+ import 'package:collection/collection.dart' ;
910import 'package:logging/logging.dart' ;
1011import 'package:meta/meta.dart' ;
1112import 'package:pub_dev/service/topics/models.dart' ;
@@ -30,13 +31,13 @@ class InMemoryPackageIndex {
3031 /// Adjusted score takes the overall score and transforms
3132 /// it linearly into the [0.4-1.0] range.
3233 final _adjustedOverallScores = < String , double > {};
33- late final List <PackageHit > _overallOrderedHits;
34- late final List <PackageHit > _createdOrderedHits;
35- late final List <PackageHit > _updatedOrderedHits;
36- late final List <PackageHit > _popularityOrderedHits;
37- late final List <PackageHit > _downloadsOrderedHits;
38- late final List <PackageHit > _likesOrderedHits;
39- late final List <PackageHit > _pointsOrderedHits;
34+ late final List <IndexedPackageHit > _overallOrderedHits;
35+ late final List <IndexedPackageHit > _createdOrderedHits;
36+ late final List <IndexedPackageHit > _updatedOrderedHits;
37+ late final List <IndexedPackageHit > _popularityOrderedHits;
38+ late final List <IndexedPackageHit > _downloadsOrderedHits;
39+ late final List <IndexedPackageHit > _likesOrderedHits;
40+ late final List <IndexedPackageHit > _pointsOrderedHits;
4041
4142 // Contains all of the topics the index had seen so far.
4243 // TODO: consider moving this into a separate index
@@ -185,11 +186,10 @@ class InMemoryPackageIndex {
185186 }
186187 }
187188
188- final packages = packageScores.toKeySet ();
189189 switch (query.effectiveOrder ?? SearchOrder .top) {
190190 case SearchOrder .top:
191191 if (textResults == null ) {
192- packageHits = _overallOrderedHits.whereInSet (packages );
192+ packageHits = _overallOrderedHits.whereInScores (packageScores );
193193 break ;
194194 }
195195
@@ -205,22 +205,22 @@ class InMemoryPackageIndex {
205205 packageHits = _rankWithValues (score);
206206 break ;
207207 case SearchOrder .created:
208- packageHits = _createdOrderedHits.whereInSet (packages );
208+ packageHits = _createdOrderedHits.whereInScores (packageScores );
209209 break ;
210210 case SearchOrder .updated:
211- packageHits = _updatedOrderedHits.whereInSet (packages );
211+ packageHits = _updatedOrderedHits.whereInScores (packageScores );
212212 break ;
213213 case SearchOrder .popularity:
214- packageHits = _popularityOrderedHits.whereInSet (packages );
214+ packageHits = _popularityOrderedHits.whereInScores (packageScores );
215215 break ;
216216 case SearchOrder .downloads:
217- packageHits = _downloadsOrderedHits.whereInSet (packages );
217+ packageHits = _downloadsOrderedHits.whereInScores (packageScores );
218218 break ;
219219 case SearchOrder .like:
220- packageHits = _likesOrderedHits.whereInSet (packages );
220+ packageHits = _likesOrderedHits.whereInScores (packageScores );
221221 break ;
222222 case SearchOrder .points:
223- packageHits = _pointsOrderedHits.whereInSet (packages );
223+ packageHits = _pointsOrderedHits.whereInScores (packageScores );
224224 break ;
225225 }
226226
@@ -389,16 +389,18 @@ class InMemoryPackageIndex {
389389 return list;
390390 }
391391
392- List <PackageHit > _rankWithComparator (
392+ List <IndexedPackageHit > _rankWithComparator (
393393 int Function (PackageDocument a, PackageDocument b) compare, {
394394 double Function (PackageDocument doc)? score,
395395 }) {
396- final list = _documentsByName.values
397- .map ((doc) => PackageHit (
398- package: doc.package, score: score == null ? null : score (doc)))
396+ final list = _documents
397+ .mapIndexed ((index, doc) => IndexedPackageHit (
398+ index,
399+ PackageHit (
400+ package: doc.package,
401+ score: score == null ? null : score (doc))))
399402 .toList ();
400- list.sort ((a, b) =>
401- compare (_documentsByName[a.package]! , _documentsByName[b.package]! ));
403+ list.sort ((a, b) => compare (_documents[a.index], _documents[b.index]));
402404 return list;
403405 }
404406
@@ -556,8 +558,15 @@ class _PkgNameData {
556558 _PkgNameData (this .collapsed, this .trigrams);
557559}
558560
559- extension on List <PackageHit > {
560- List <PackageHit > whereInSet ( Set < String > packages ) {
561- return where ((hit ) => packages. contains (hit.package) ).toList ();
561+ extension on List <IndexedPackageHit > {
562+ List <PackageHit > whereInScores ( IndexedScore scores ) {
563+ return where ((h ) => scores. isPositive (h.index)). map ((h) => h.hit ).toList ();
562564 }
563565}
566+
567+ class IndexedPackageHit {
568+ final int index;
569+ final PackageHit hit;
570+
571+ IndexedPackageHit (this .index, this .hit);
572+ }
0 commit comments