From fb31a303ff8b57a07ce7511c687257fb3e5cb4ba Mon Sep 17 00:00:00 2001 From: RarDog Date: Thu, 3 Sep 2026 21:15:01 +0300 Subject: [PATCH] fix: resolve No post yet by adapting postMatchesRequestedTags to tag groups and filtering 'and' from provider queries --- lib/backend/providers/provider_manager.dart | 7 ++++- lib/backend/services/feed_service.dart | 35 +++++++++++++-------- test/backend/feed_tag_filter_test.dart | 3 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lib/backend/providers/provider_manager.dart b/lib/backend/providers/provider_manager.dart index 881b235..dff91a7 100644 --- a/lib/backend/providers/provider_manager.dart +++ b/lib/backend/providers/provider_manager.dart @@ -257,12 +257,17 @@ class ProviderManager { required String? providerId, required TopPeriodFilter topPeriod, }) async { + final cleanTags = tags + .map((t) => t.trim()) + .where((t) => t.isNotEmpty && t.toLowerCase() != 'and') + .toList(growable: false); + final seen = {}; final providerResults = >[]; for (final provider in providers) { try { final providerPosts = await provider.searchPosts( - tags: tags, + tags: cleanTags, page: page, limit: limit, rating: rating, diff --git a/lib/backend/services/feed_service.dart b/lib/backend/services/feed_service.dart index e6dbce7..7b9e081 100644 --- a/lib/backend/services/feed_service.dart +++ b/lib/backend/services/feed_service.dart @@ -112,20 +112,29 @@ class FeedService { } bool postMatchesRequestedTags(Post post, List requestedTags) { - final requested = requestedTags - .map((tag) => tag.trim().toLowerCase()) - .where((tag) => tag.isNotEmpty && !tag.startsWith('-')) - .toList(growable: false); - if (requested.isEmpty) return true; + if (post.providerId == 'pawchive') return true; + + final groups = ProviderManager.splitTagGroups(requestedTags); + if (groups.isEmpty) return true; + final postTags = _postTagSet(post); - return requested.every( - (requestedTag) => postTags.any( - (postTag) => - postTag == requestedTag || - postTag.startsWith('${requestedTag}_') || - postTag.startsWith('$requestedTag-'), - ), - ); + if (postTags.isEmpty) return true; + + return groups.any((group) { + final cleanGroup = group + .map((tag) => tag.trim().toLowerCase()) + .where((tag) => tag.isNotEmpty && !tag.startsWith('-') && tag != 'and') + .toList(growable: false); + if (cleanGroup.isEmpty) return true; + return cleanGroup.every( + (requestedTag) => postTags.any( + (postTag) => + postTag == requestedTag || + postTag.startsWith('${requestedTag}_') || + postTag.startsWith('$requestedTag-'), + ), + ); + }); } bool postPassesTagFilters(Post post, AppSettings settings) { diff --git a/test/backend/feed_tag_filter_test.dart b/test/backend/feed_tag_filter_test.dart index df4c5f4..be6dfe0 100644 --- a/test/backend/feed_tag_filter_test.dart +++ b/test/backend/feed_tag_filter_test.dart @@ -43,11 +43,12 @@ void main() { expect(postPassesTagFilters(post, settings), isFalse); }); - test('requested search tags are all required', () { + test('requested search tags are all required unless separated by and', () { final post = _post(tags: ['touhou', 'hakurei_reimu']); expect(postMatchesRequestedTags(post, ['touhou']), isTrue); expect(postMatchesRequestedTags(post, ['touhou', 'cirno']), isFalse); + expect(postMatchesRequestedTags(post, ['touhou', 'and', 'cirno']), isTrue); }); test('requested search tags can match tag prefixes', () {