Highlights
include_genotypes — named-category genotype filter
Filter by hardcall category: include_genotypes := ['het','hom_alt'] over hom_ref/het/hom_alt/missing (case-insensitive; any subset, including non-contiguous like ['hom_ref','hom_alt']; missing is first-class). genotype_range := {min,max,include_missing} remains as the numeric alias.
Fast carrier lookups at biobank scale
Listing the subjects matching a genotype at a variant is now a first-class fast path. On a 10M-sample fixture, a single-variant carrier query dropped from ~6s to ~0.85s:
orient := 'sample'+ a genotype filter emits only matching subjects (row-skip), not one row per sample.- The
.psam.parquetcompanion is now preferred when present, and its columns are read natively (no per-rowstd::stringmaterialization).
Correctness fixes
- Sample-orient
counts/statsno longer miscount out-of-range hardcalls asmissing. - Sample orient now skips non-matching rows under a genotype filter.
- Genotype-orient genotype filtering now applies regardless of column projection (previously
SELECT IID …/COUNT(*)could return unfiltered rows).
See the documentation and PR #41 for details.