From 33ee8c856ee0d95cc1e873264b1cdc9d9e84f31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20So=C3=B3s?= Date: Tue, 7 Jan 2025 09:26:10 +0100 Subject: [PATCH] Remove popularity from search index. (#8446) --- app/lib/search/mem_index.dart | 14 ++------------ app/lib/search/search_service.dart | 4 ---- app/lib/search/search_service.g.dart | 2 -- app/lib/search/top_packages.dart | 2 +- app/lib/shared/urls.dart | 2 +- app/test/frontend/golden/landing_page.html | 2 +- app/test/search/mem_index_test.dart | 13 +++++++------ app/test/search/result_combiner_test.dart | 11 ++++++----- pkg/_pub_shared/lib/search/search_form.dart | 6 +++++- 9 files changed, 23 insertions(+), 33 deletions(-) diff --git a/app/lib/search/mem_index.dart b/app/lib/search/mem_index.dart index 583b3a5d5c..756260aab5 100644 --- a/app/lib/search/mem_index.dart +++ b/app/lib/search/mem_index.dart @@ -40,7 +40,6 @@ class InMemoryPackageIndex { late final List _overallOrderedHits; late final List _createdOrderedHits; late final List _updatedOrderedHits; - late final List _popularityOrderedHits; late final List _downloadsOrderedHits; late final List _likesOrderedHits; late final List _pointsOrderedHits; @@ -116,8 +115,6 @@ class InMemoryPackageIndex { score: (doc) => doc.overallScore ?? 0.0); _createdOrderedHits = _rankWithComparator(_compareCreated); _updatedOrderedHits = _rankWithComparator(_compareUpdated); - _popularityOrderedHits = _rankWithComparator(_comparePopularity, - score: (doc) => doc.popularityScore ?? 0); _downloadsOrderedHits = _rankWithComparator(_compareDownloads, score: (doc) => doc.downloadCount.toDouble()); _likesOrderedHits = _rankWithComparator(_compareLikes, @@ -271,9 +268,8 @@ class InMemoryPackageIndex { case SearchOrder.updated: indexedHits = _updatedOrderedHits.whereInScores(packageScores); break; + // ignore: deprecated_member_use case SearchOrder.popularity: - indexedHits = _popularityOrderedHits.whereInScores(packageScores); - break; case SearchOrder.downloads: indexedHits = _downloadsOrderedHits.whereInScores(packageScores); break; @@ -315,7 +311,7 @@ class InMemoryPackageIndex { /// Update the overall score both on [PackageDocument] and in the [_adjustedOverallScores] map. void _updateOverallScores() { _adjustedOverallScores = _documents.map((doc) { - final downloadScore = doc.downloadScore ?? doc.popularityScore ?? 0.0; + final downloadScore = doc.downloadScore ?? 0.0; final likeScore = doc.likeScore ?? 0.0; final popularity = (downloadScore + likeScore) / 2; final points = doc.grantedPoints / math.max(1, doc.maxPoints); @@ -497,12 +493,6 @@ class InMemoryPackageIndex { return _compareUpdated(a, b); } - int _comparePopularity(PackageDocument a, PackageDocument b) { - final x = -(a.popularityScore ?? 0.0).compareTo(b.popularityScore ?? 0.0); - if (x != 0) return x; - return _compareUpdated(a, b); - } - int _compareDownloads(PackageDocument a, PackageDocument b) { final x = -a.downloadCount.compareTo(b.downloadCount); if (x != 0) return x; diff --git a/app/lib/search/search_service.dart b/app/lib/search/search_service.dart index 570aeeb650..11c67d1e31 100644 --- a/app/lib/search/search_service.dart +++ b/app/lib/search/search_service.dart @@ -83,9 +83,6 @@ class PackageDocument { /// The normalized score between [0.0-1.0] (1.0 being the most liked package). double? likeScore; - /// The normalized score between [0.0-1.0] (1.0 being the most popular package). - double? popularityScore; - final int grantedPoints; final int maxPoints; @@ -114,7 +111,6 @@ class PackageDocument { this.downloadScore, int? likeCount, this.likeScore, - this.popularityScore, int? grantedPoints, int? maxPoints, this.dependencies = const {}, diff --git a/app/lib/search/search_service.g.dart b/app/lib/search/search_service.g.dart index f0c2bcc70b..7002442cd6 100644 --- a/app/lib/search/search_service.g.dart +++ b/app/lib/search/search_service.g.dart @@ -23,7 +23,6 @@ PackageDocument _$PackageDocumentFromJson(Map json) => downloadScore: (json['downloadScore'] as num?)?.toDouble(), likeCount: (json['likeCount'] as num?)?.toInt(), likeScore: (json['likeScore'] as num?)?.toDouble(), - popularityScore: (json['popularityScore'] as num?)?.toDouble(), grantedPoints: (json['grantedPoints'] as num?)?.toInt(), maxPoints: (json['maxPoints'] as num?)?.toInt(), dependencies: (json['dependencies'] as Map?)?.map( @@ -55,7 +54,6 @@ Map _$PackageDocumentToJson(PackageDocument instance) => 'downloadScore': instance.downloadScore, 'likeCount': instance.likeCount, 'likeScore': instance.likeScore, - 'popularityScore': instance.popularityScore, 'grantedPoints': instance.grantedPoints, 'maxPoints': instance.maxPoints, 'overallScore': instance.overallScore, diff --git a/app/lib/search/top_packages.dart b/app/lib/search/top_packages.dart index c0da2a3a75..284fb88068 100644 --- a/app/lib/search/top_packages.dart +++ b/app/lib/search/top_packages.dart @@ -29,7 +29,7 @@ class TopPackages { query: PackageTags.isFlutterFavorite, ); final _mostPopular = - _cachedValue('top-packages-most-popular', order: SearchOrder.popularity); + _cachedValue('top-packages-most-popular', order: SearchOrder.downloads); final _topDart = _cachedValue('top-packages-top-dart', query: SdkTag.sdkDart); final _topFlutter = _cachedValue('top-packages-top-flutter', query: SdkTag.sdkFlutter); diff --git a/app/lib/shared/urls.dart b/app/lib/shared/urls.dart index 87273df6f7..231fb2ec51 100644 --- a/app/lib/shared/urls.dart +++ b/app/lib/shared/urls.dart @@ -219,7 +219,7 @@ String searchUrl({ } String listingByPopularity() => - SearchForm(order: SearchOrder.popularity).toSearchLink(); + SearchForm(order: SearchOrder.downloads).toSearchLink(); String dartSdkMainUrl(String version) { final isDev = version.contains('dev'); diff --git a/app/test/frontend/golden/landing_page.html b/app/test/frontend/golden/landing_page.html index b556afdb75..c4a31b37bf 100644 --- a/app/test/frontend/golden/landing_page.html +++ b/app/test/frontend/golden/landing_page.html @@ -176,7 +176,7 @@

oxygen

diff --git a/app/test/search/mem_index_test.dart b/app/test/search/mem_index_test.dart index 886b7e7686..5fdcb04e63 100644 --- a/app/test/search/mem_index_test.dart +++ b/app/test/search/mem_index_test.dart @@ -34,8 +34,8 @@ void main() { 'runtime:web' ], likeCount: 10, - popularityScore: 0.7, downloadScore: 0.7, + downloadCount: 70, grantedPoints: 110, maxPoints: 110, dependencies: {'async': 'direct', 'test': 'dev', 'foo': 'transitive'}, @@ -64,8 +64,8 @@ The delegating wrapper classes allow users to easily add functionality on top of grantedPoints: 10, maxPoints: 110, dependencies: {'test': 'dev'}, - popularityScore: 0.8, downloadScore: 0.8, + downloadCount: 80, ), PackageDocument( package: 'chrome_net', @@ -81,6 +81,7 @@ server.dart adds a small, prescriptive server (PicoServer) that can be configure grantedPoints: 0, maxPoints: 110, downloadScore: 0.0, + downloadCount: 0, ), ]; lastPackageUpdated = @@ -280,16 +281,16 @@ server.dart adds a small, prescriptive server (PicoServer) that can be configure }); }); - test('order by popularity', () async { + test('order by downloads', () async { final PackageSearchResult result = - index.search(ServiceSearchQuery.parse(order: SearchOrder.popularity)); + index.search(ServiceSearchQuery.parse(order: SearchOrder.downloads)); expect(json.decode(json.encode(result)), { 'timestamp': isNotNull, 'totalCount': 3, 'sdkLibraryHits': [], 'packageHits': [ - {'package': 'async', 'score': 0.8}, - {'package': 'http', 'score': 0.7}, + {'package': 'async', 'score': 80}, + {'package': 'http', 'score': 70}, {'package': 'chrome_net', 'score': 0.0}, ], }); diff --git a/app/test/search/result_combiner_test.dart b/app/test/search/result_combiner_test.dart index 5ecaf2c3cc..31fba08932 100644 --- a/app/test/search/result_combiner_test.dart +++ b/app/test/search/result_combiner_test.dart @@ -23,7 +23,8 @@ void main() { readme: 'Many useful string methods like substring.', grantedPoints: 110, maxPoints: 110, - popularityScore: 0.4, + downloadScore: 0.4, + downloadCount: 4, ), ], ); @@ -78,13 +79,13 @@ void main() { test('non-text ranking', () async { final results = combiner - .search(ServiceSearchQuery.parse(order: SearchOrder.popularity)); + .search(ServiceSearchQuery.parse(order: SearchOrder.downloads)); expect(json.decode(json.encode(results.toJson())), { 'timestamp': isNotNull, 'totalCount': 1, 'sdkLibraryHits': [], 'packageHits': [ - {'package': 'stringutils', 'score': 0.4}, + {'package': 'stringutils', 'score': 4}, ], }); }); @@ -97,7 +98,7 @@ void main() { 'totalCount': 1, 'sdkLibraryHits': [], 'packageHits': [ - {'package': 'stringutils', 'score': closeTo(1.0, 0.01)}, + {'package': 'stringutils', 'score': closeTo(0.85, 0.01)}, ], }); }); @@ -124,7 +125,7 @@ void main() { }, ], 'packageHits': [ - {'package': 'stringutils', 'score': closeTo(0.73, 0.01)} + {'package': 'stringutils', 'score': closeTo(0.67, 0.01)} ], }); }); diff --git a/pkg/_pub_shared/lib/search/search_form.dart b/pkg/_pub_shared/lib/search/search_form.dart index dbabd3cb6d..d2ea6e8992 100644 --- a/pkg/_pub_shared/lib/search/search_form.dart +++ b/pkg/_pub_shared/lib/search/search_form.dart @@ -35,7 +35,7 @@ int extractPageFromUrlParameters(Map queryParameters) { /// How search results should be ordered. enum SearchOrder { - /// Search score should be a weighted value of [text], [popularity], [points] + /// Search score should be a weighted value of [text], [downloads], [points] /// and [like], ordered decreasing. top, @@ -50,6 +50,10 @@ enum SearchOrder { updated, /// Search order should be in decreasing popularity score. + /// WARNING: The value shouldn't be used anymore. + /// + /// TODO: remove in a future release. + @Deprecated('Popularity is no longer used.') popularity, /// Search order should be in decreasing download counts.