From 0d4afd47c83c97306caa8a58d983731269c57f7c Mon Sep 17 00:00:00 2001 From: Jann Stute Date: Thu, 28 Nov 2024 12:50:12 +0100 Subject: [PATCH] fix tag search --- tagstudio/src/core/library/alchemy/enums.py | 11 +++++++++++ tagstudio/src/core/library/alchemy/library.py | 12 ++++++------ tagstudio/src/qt/modals/tag_database.py | 4 ++-- tagstudio/src/qt/modals/tag_search.py | 6 +++--- tagstudio/tests/test_library.py | 10 +++++----- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/enums.py b/tagstudio/src/core/library/alchemy/enums.py index d8ee7bb7..14e9667f 100644 --- a/tagstudio/src/core/library/alchemy/enums.py +++ b/tagstudio/src/core/library/alchemy/enums.py @@ -59,6 +59,17 @@ class ItemType(enum.Enum): TAG_GROUP = 2 +@dataclass +class TagFilterState: + search: str | None = None + page_index: int | None = 0 + page_size: int | None = 500 + + def __post_init__(self): + if self.search is not None: + self.search = self.search.strip() + + @dataclass class FilterState: """Represent a state of the Library grid view.""" diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index 17f46ff6..e5260a55 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -39,7 +39,7 @@ from ...constants import ( from ...enums import LibraryPrefs from ...media_types import MediaCategories from .db import make_tables -from .enums import FieldTypeEnum, FilterState, TagColor +from .enums import FieldTypeEnum, FilterState, TagColor, TagFilterState from .fields import ( BaseField, DatetimeField, @@ -512,7 +512,7 @@ class Library: def search_tags( self, - search: FilterState, # TODO TSQLANG move this to str + filter_state: TagFilterState, ) -> list[Tag]: """Return a list of Tag records matching the query.""" with Session(self.engine) as session: @@ -522,11 +522,11 @@ class Library: selectinload(Tag.aliases), ) - if search.tag: + if filter_state.search: query = query.where( or_( - Tag.name.icontains(search.tag), - Tag.shorthand.icontains(search.tag), + Tag.name.icontains(filter_state.search), + Tag.shorthand.icontains(filter_state.search), ) ) @@ -536,7 +536,7 @@ class Library: logger.info( "searching tags", - search=search, + search=filter_state, statement=str(query), results=len(res), ) diff --git a/tagstudio/src/qt/modals/tag_database.py b/tagstudio/src/qt/modals/tag_database.py index 9375c841..bc86b87f 100644 --- a/tagstudio/src/qt/modals/tag_database.py +++ b/tagstudio/src/qt/modals/tag_database.py @@ -12,7 +12,7 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.library import Library, Tag -from src.core.library.alchemy.enums import FilterState +from src.core.library.alchemy.enums import TagFilterState from src.qt.modals.build_tag import BuildTagPanel from src.qt.widgets.panel import PanelModal, PanelWidget from src.qt.widgets.tag import TagWidget @@ -70,7 +70,7 @@ class TagDatabasePanel(PanelWidget): while self.scroll_layout.itemAt(0): self.scroll_layout.takeAt(0).widget().deleteLater() - tags = self.lib.search_tags(FilterState(path=query, page_size=self.tag_limit)) + tags = self.lib.search_tags(TagFilterState(search=query, page_size=self.tag_limit)) for tag in tags: container = QWidget() diff --git a/tagstudio/src/qt/modals/tag_search.py b/tagstudio/src/qt/modals/tag_search.py index 1bb25731..02ce2d20 100644 --- a/tagstudio/src/qt/modals/tag_search.py +++ b/tagstudio/src/qt/modals/tag_search.py @@ -17,7 +17,7 @@ from PySide6.QtWidgets import ( QWidget, ) from src.core.library import Library -from src.core.library.alchemy.enums import FilterState +from src.core.library.alchemy.enums import TagFilterState from src.core.palette import ColorType, get_tag_color from src.qt.widgets.panel import PanelWidget from src.qt.widgets.tag import TagWidget @@ -78,8 +78,8 @@ class TagSearchPanel(PanelWidget): self.scroll_layout.takeAt(0).widget().deleteLater() found_tags = self.lib.search_tags( - FilterState( - path=name, + TagFilterState( + search=name, page_size=self.tag_limit, ) ) diff --git a/tagstudio/tests/test_library.py b/tagstudio/tests/test_library.py index 8175c496..bab51ef3 100644 --- a/tagstudio/tests/test_library.py +++ b/tagstudio/tests/test_library.py @@ -4,7 +4,7 @@ from tempfile import TemporaryDirectory import pytest from src.core.enums import DefaultEnum, LibraryPrefs from src.core.library.alchemy import Entry, Library -from src.core.library.alchemy.enums import FilterState +from src.core.library.alchemy.enums import FilterState, TagFilterState from src.core.library.alchemy.fields import TextField, _FieldID from src.core.library.alchemy.models import Tag @@ -133,17 +133,17 @@ def test_tag_search(library): tag = library.tags[0] assert library.search_tags( - FilterState(tag=tag.name.lower()), + TagFilterState(search=tag.name.lower()), ) assert library.search_tags( - FilterState(tag=tag.name.upper()), + TagFilterState(search=tag.name.upper()), ) - assert library.search_tags(FilterState(tag=tag.name[2:-2])) + assert library.search_tags(TagFilterState(search=tag.name[2:-2])) assert not library.search_tags( - FilterState(tag=tag.name * 2), + TagFilterState(search=tag.name * 2), )