Skip to content

Commit 3f801de

Browse files
authored
Use IndexedScore in final ranking order. (#8247)
1 parent ee40d08 commit 3f801de

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

app/lib/search/mem_index.dart

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:math' as math;
66

77
import 'package:_pub_shared/search/search_form.dart';
88
import 'package:clock/clock.dart';
9+
import 'package:collection/collection.dart';
910
import 'package:logging/logging.dart';
1011
import 'package:meta/meta.dart';
1112
import '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+
}

app/lib/search/token_index.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,10 @@ class IndexedScore {
262262

263263
late final length = _values.length;
264264

265+
bool isPositive(int index) {
266+
return _values[index] > 0.0;
267+
}
268+
265269
bool isNotPositive(int index) {
266270
return _values[index] <= 0.0;
267271
}

0 commit comments

Comments
 (0)