- Move query and sort construction into `ModelQuery` classmethods and parse
tokenized input once.
- Switch call sites to consume `parse_query(...).query` and
`parse_query(...).sort` instead of tuple unpacking.
- Remove legacy `dbcore` re-exports and obsolete helper functions in
`queryparse`.
- Update query/sort tests to match the new parsing behavior and simplified
query object shapes.
- Add ModelQuery in dbcore.queryparse and expose LibModel.parse_query as
the single parsing entrypoint for string and sequence query inputs.
- Route library fetch, path format matching, and plugin query parsing
through the model-level API, and deprecate
beets.library.parse_query_string and parse_query_parts.
- Update tests to cover invalid query parsing via ModelQuery and align
smartplaylist sort assertions with parsed sort behavior.
- Replace parse_query_part with a QueryTerm parser that captures negate, field,
prefix, and pattern in one pass.
- Resolve query class selection through QueryTerm so prefix and field-based
dispatch are handled consistently.
- Move implicit path query normalization into dbcore parsing, simplifying
library-level query parsing.
- Tighten plugin query typing and update dbcore tests for path behavior and
related fixture assertions.
Move sort case-sensitivity config lookup into `FieldSort` as a cached
class property instead of threading a `case_insensitive` flag through
query parsing helpers.
This centralizes sort behavior at the sort implementation boundary and
simplifies parse/orchestration call paths while preserving configurable
case-sensitive ordering.
Sorting by a field whose declared type is nullable (its null value is
`None`, e.g. `NullInteger`/`NullFloat`) raised `TypeError: '<' not
supported between instances of ...` when the field was present on some
objects but missing on others, because `FieldSort.sort` compared `None`
against real values.
Group missing values together in the sort key so they are never compared
against present ones: they are ordered first when sorting ascending and
last when descending, matching SQLite's default ordering of NULLs used by
the fast `FixedFieldSort` path.
Fixes#3461.
Co-Authored-By: Claude <noreply@anthropic.com>
- Removing the coverage omit configuration exposed unused branches, helpers, and
fixtures across the test suite.
- Delete that redundant logic and simplify affected tests while preserving their
behavior.
- Consolidate duplicate sort test coverage with parametrized cases.
- Keep missing-field and mixed-presence behavior covered while reducing repeated
assertions.
- Replace duplicate direct MultipleSort checks with parametrized query-string
cases covering single-field, multi-field, fixed, flex, and computed sort
behavior.
- Reduce test repetition while keeping the same sort behavior coverage.