From a8b778146d200b4719d4a5e73a9c7fad264c1f42 Mon Sep 17 00:00:00 2001 From: RarDog Date: Thu, 3 Sep 2026 21:06:06 +0300 Subject: [PATCH] fix: adjust multi-tag search so space groups tags together and 'and' splits independent query streams --- lib/backend/providers/provider_manager.dart | 25 ++++++--------- test/backend/tag_groups_search_test.dart | 35 ++++++++++----------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/lib/backend/providers/provider_manager.dart b/lib/backend/providers/provider_manager.dart index bcb5ca0..881b235 100644 --- a/lib/backend/providers/provider_manager.dart +++ b/lib/backend/providers/provider_manager.dart @@ -165,29 +165,24 @@ class ProviderManager { static List> splitTagGroups(List rawTags) { final groups = >[]; - List currentAndGroup = []; + List currentGroup = []; - for (int i = 0; i < rawTags.length; i++) { - final token = rawTags[i].trim(); + for (final raw in rawTags) { + final token = raw.trim(); if (token.isEmpty) continue; if (token.toLowerCase() == 'and') { - continue; - } - - final prevWasAnd = i > 0 && rawTags[i - 1].trim().toLowerCase() == 'and'; - if (prevWasAnd) { - currentAndGroup.add(token); - } else { - if (currentAndGroup.isNotEmpty) { - groups.add(currentAndGroup); + if (currentGroup.isNotEmpty) { + groups.add(currentGroup); + currentGroup = []; } - currentAndGroup = [token]; + } else { + currentGroup.add(token); } } - if (currentAndGroup.isNotEmpty) { - groups.add(currentAndGroup); + if (currentGroup.isNotEmpty) { + groups.add(currentGroup); } return groups.isEmpty ? [const []] : groups; diff --git a/test/backend/tag_groups_search_test.dart b/test/backend/tag_groups_search_test.dart index 2c89b8a..c531570 100644 --- a/test/backend/tag_groups_search_test.dart +++ b/test/backend/tag_groups_search_test.dart @@ -2,49 +2,46 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gel_rule_app/backend/providers/provider_manager.dart'; void main() { - group('Tag groups splitting with local and connector', () { + group('Tag groups splitting: space groups together, and separates streams', () { test('single tag returns one group', () { final groups = ProviderManager.splitTagGroups(['cat']); expect(groups, equals([['cat']])); }); - test('multiple tags without and are split into separate independent groups', () { - final groups = ProviderManager.splitTagGroups(['cat', 'dog', 'bird']); + test('tags separated by space are grouped together in one query', () { + final groups = ProviderManager.splitTagGroups(['raiden', 'miku']); expect(groups, equals([ - ['cat'], - ['dog'], - ['bird'], + ['raiden', 'miku'], ])); }); - test('tags connected by and are merged into the same group', () { - final groups = ProviderManager.splitTagGroups(['cat', 'and', 'dog']); + test('tags separated by and are split into independent query streams', () { + final groups = ProviderManager.splitTagGroups(['raiden', 'and', 'miku']); expect(groups, equals([ - ['cat', 'dog'], + ['raiden'], + ['miku'], ])); }); - test('mixed independent tags and and-connected tags', () { + test('multiple multi-tag groups separated by and', () { final groups = ProviderManager.splitTagGroups([ 'genshin', - 'and', 'raiden', - 'miku', - 'vocaloid', 'and', - 'hatsune', + 'vocaloid', + 'miku', ]); expect(groups, equals([ ['genshin', 'raiden'], - ['miku'], - ['vocaloid', 'hatsune'], + ['vocaloid', 'miku'], ])); }); - test('case-insensitive AND handling', () { - final groups = ProviderManager.splitTagGroups(['2girls', 'AND', 'yuri']); + test('case-insensitive AND separator', () { + final groups = ProviderManager.splitTagGroups(['cat', 'AND', 'dog']); expect(groups, equals([ - ['2girls', 'yuri'], + ['cat'], + ['dog'], ])); });