@@ -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' ;
1112
@@ -19,15 +20,15 @@ final _logger = Logger('search.mem_index');
1920final _textSearchTimeout = Duration (milliseconds: 500 );
2021
2122class InMemoryPackageIndex {
22- final Map <String , PackageDocument > _packages = < String , PackageDocument > {};
23- final _packageNameIndex = PackageNameIndex ();
23+ final Map <String , PackageDocument > _packages = {};
24+ final PackageNameIndex _packageNameIndex = PackageNameIndex ();
2425 final TokenIndex _descrIndex = TokenIndex ();
2526 final TokenIndex _readmeIndex = TokenIndex ();
2627 final TokenIndex _apiSymbolIndex = TokenIndex ();
2728
2829 /// Adjusted score takes the overall score and transforms
2930 /// it linearly into the [0.4-1.0] range.
30- final _adjustedOverallScores = < String , double > {};
31+ final Map <String , double > _adjustedOverallScores = {};
3132 late final List <PackageHit > _overallOrderedHits;
3233 late final List <PackageHit > _createdOrderedHits;
3334 late final List <PackageHit > _updatedOrderedHits;
@@ -49,36 +50,34 @@ class InMemoryPackageIndex {
4950 }
5051 _updateOverallScores ();
5152 _lastUpdated = clock.now ().toUtc ();
52- _overallOrderedHits = _rankWithComparator (_compareOverall,
53+ _overallOrderedHits = _rankWithComparator (_packages, _compareOverall,
5354 score: (doc) => doc.overallScore ?? 0.0 );
54- _createdOrderedHits = _rankWithComparator (_compareCreated);
55- _updatedOrderedHits = _rankWithComparator (_compareUpdated);
56- _popularityOrderedHits = _rankWithComparator (_comparePopularity,
55+ _createdOrderedHits = _rankWithComparator (_packages, _compareCreated);
56+ _updatedOrderedHits = _rankWithComparator (_packages, _compareUpdated);
57+ _popularityOrderedHits = _rankWithComparator (_packages, _comparePopularity,
5758 score: (doc) => doc.popularityScore ?? 0 );
58- _likesOrderedHits = _rankWithComparator (_compareLikes,
59+ _likesOrderedHits = _rankWithComparator (_packages, _compareLikes,
5960 score: (doc) => doc.likeCount.toDouble ());
60- _pointsOrderedHits = _rankWithComparator (_comparePoints,
61+ _pointsOrderedHits = _rankWithComparator (_packages, _comparePoints,
6162 score: (doc) => doc.grantedPoints.toDouble ());
6263 }
6364
64- IndexInfo indexInfo () {
65- return IndexInfo (
66- isReady: true ,
67- packageCount: _packages.length,
68- lastUpdated: _lastUpdated,
69- );
70- }
65+ IndexInfo indexInfo () => IndexInfo (
66+ isReady: true ,
67+ packageCount: _packages.length,
68+ lastUpdated: _lastUpdated,
69+ );
7170
7271 void _addPackage (PackageDocument doc) {
7372 _packages[doc.package] = doc;
7473 _packageNameIndex.add (doc.package);
7574 _descrIndex.add (doc.package, doc.description);
7675 _readmeIndex.add (doc.package, doc.readme);
7776
78- for (ApiDocPage page in doc.apiDocPages ?? const []) {
77+ for (final page in doc.apiDocPages ?? const < ApiDocPage > []) {
7978 final pageId = _apiDocPageId (doc.package, page);
80- if (page.symbols != null && page.symbols ! .isNotEmpty) {
81- _apiSymbolIndex.add (pageId, page.symbols ! .join (' ' ));
79+ if (page.symbols case final pageSymbols ? when pageSymbols .isNotEmpty) {
80+ _apiSymbolIndex.add (pageId, pageSymbols .join (' ' ));
8281 }
8382 }
8483 }
@@ -148,9 +147,9 @@ class InMemoryPackageIndex {
148147 }
149148
150149 List <String >? nameMatches;
151- late List <PackageHit > packageHits;
152- switch (query.effectiveOrder ?? SearchOrder .top ) {
153- case SearchOrder .top:
150+ List <PackageHit > packageHits;
151+ switch (query.effectiveOrder) {
152+ case null || SearchOrder .top:
154153 if (textResults == null ) {
155154 packageHits = _overallOrderedHits.whereInSet (packages);
156155 break ;
@@ -346,59 +345,57 @@ class InMemoryPackageIndex {
346345 return list;
347346 }
348347
349- List <PackageHit > _rankWithComparator (
348+ static List <PackageHit > _rankWithComparator (
349+ Map <String , PackageDocument > packages,
350350 int Function (PackageDocument a, PackageDocument b) compare, {
351351 double Function (PackageDocument doc)? score,
352- }) {
353- final list = _packages.values
354- .map ((doc) => PackageHit (
355- package: doc.package, score: score == null ? null : score (doc)))
356- .toList ();
357- list.sort ((a, b) => compare (_packages[a.package]! , _packages[b.package]! ));
358- return list;
359- }
352+ }) =>
353+ packages.entries
354+ .sorted ((entryA, entryB) => compare (entryA.value, entryB.value))
355+ .map ((e) => PackageHit (package: e.key, score: score? .call (e.value)))
356+ .toList (growable: false );
360357
361- int _compareCreated (PackageDocument a, PackageDocument b) {
358+ static int _compareCreated (PackageDocument a, PackageDocument b) {
362359 return - a.created.compareTo (b.created);
363360 }
364361
365- int _compareUpdated (PackageDocument a, PackageDocument b) {
362+ static int _compareUpdated (PackageDocument a, PackageDocument b) {
366363 return - a.updated.compareTo (b.updated);
367364 }
368365
369- int _compareOverall (PackageDocument a, PackageDocument b) {
366+ static int _compareOverall (PackageDocument a, PackageDocument b) {
370367 final x = - (a.overallScore ?? 0.0 ).compareTo (b.overallScore ?? 0.0 );
371368 if (x != 0 ) return x;
372369 return _compareUpdated (a, b);
373370 }
374371
375- int _comparePopularity (PackageDocument a, PackageDocument b) {
372+ static int _comparePopularity (PackageDocument a, PackageDocument b) {
376373 final x = - (a.popularityScore ?? 0.0 ).compareTo (b.popularityScore ?? 0.0 );
377374 if (x != 0 ) return x;
378375 return _compareUpdated (a, b);
379376 }
380377
381- int _compareLikes (PackageDocument a, PackageDocument b) {
378+ static int _compareLikes (PackageDocument a, PackageDocument b) {
382379 final x = - a.likeCount.compareTo (b.likeCount);
383380 if (x != 0 ) return x;
384381 return _compareUpdated (a, b);
385382 }
386383
387- int _comparePoints (PackageDocument a, PackageDocument b) {
384+ static int _comparePoints (PackageDocument a, PackageDocument b) {
388385 final x = - a.grantedPoints.compareTo (b.grantedPoints);
389386 if (x != 0 ) return x;
390387 return _compareUpdated (a, b);
391388 }
392389
393- String _apiDocPageId (String package, ApiDocPage page) {
390+ static String _apiDocPageId (String package, ApiDocPage page) {
394391 return '$package ::${page .relativePath }' ;
395392 }
396393
397- String _apiDocPkg (String id) {
394+ static String _apiDocPkg (String id) {
398395 return id.split ('::' ).first;
399396 }
400397
401- String _apiDocPath (String id) {
398+ static String _apiDocPath (String id) {
402399 return id.split ('::' ).last;
403400 }
404401}
@@ -415,11 +412,6 @@ class _TextResults {
415412class PackageNameIndex {
416413 final _data = < String , _PkgNameData > {};
417414
418- /// Maps package name to a reduced form of the name:
419- /// the same character parts, but without `-` .
420- String _collapseName (String package) =>
421- package.replaceAll ('_' , '' ).toLowerCase ();
422-
423415 void addAll (Iterable <String > packages) {
424416 for (final package in packages) {
425417 add (package);
@@ -470,6 +462,11 @@ class PackageNameIndex {
470462 }
471463 return Score (values).removeLowValues (fraction: 0.5 , minValue: 0.5 );
472464 }
465+
466+ /// Maps package name to a reduced form of the name:
467+ /// the same character parts, but without `-` .
468+ static String _collapseName (String package) =>
469+ package.replaceAll ('_' , '' ).toLowerCase ();
473470}
474471
475472class _PkgNameData {
0 commit comments