Changelog
v0.4.0 (2026-09-12)
Filtering multiple files without
--columnsfailed when a column wasnullin one file andint32in another. It now combines compatible column types automatically and retains all columns.Numeric types depended on the first file. For example,
uint8followed bydoublecould fail on fractional values; both orders now usedouble.A column present only in a later file was omitted from output and could not be filtered. It is now available in either file order, with nulls where absent.
Stored pandas dtypes could narrow promoted values, and a missing earlier column could round
2**53 + 1. Nullable integer widening and newly inserted nulls now preserve 64-bit integer values inpqfilt.read().Increase the minimum PyArrow version from 10 to 14 for numeric schema promotion.
v0.3.1 (2026-09-07)
Save output atomically: failures preserve existing files;
overwrite=Falsealso protects files created during the scan.Reject hard links to input files as streaming output destinations.
Expand glob patterns in source lists and accept literal filenames containing brackets. Read each file once, including repeated paths and file aliases.
Preserve Arrow’s unknown result for DataFrame comparisons against
None, including negated comparisons.Validate release versions and installed distributions before publishing. Select CI Python versions explicitly and exclude local planning files from sdists.
v0.3.0 (2026-07-14)
Critical bug fix: * Column names ending in
inwere misinterpreted as theinoperator. Fixed. * Fixed parsing of parenthesized membership lists * Fixed handling of unterminated quotes.Made
pqfilt.filter_df()match Arrow null behaviorpqfilt.filter_df(): DNF tuple validation consistent and explicit.Added
pqfilt.scan(): Arrow-native, lazily evaluated scansAdded
pqfilt.write_filtered(): One-shot writer (csv or parquet) t * The CLI now uses this streaming write path.Added public AST utilities (
pqfilt.to_ast(),pqfilt.map_leaves()) and operator utilities (pqfilt.SUPPORTED_OPERATORS,pqfilt.validate_operator()).Preserved exact integer filter literals beyond the binary64 precision limit.
Split documentation into a practical usage guide and an advanced API guide.
v0.2.2 (2026-06-19)
Critical bug in CLI:
per_fileoption was removed in 0.2.0 but CLI still referenced it, causing a crash. Fixed.
v0.2.1 (2026-06-15)
Exported
to_pyarrow_exprin the public API (previously internal).
v0.2.0 (2026-06-15)
Breaking: removed
per_fileparameter fromread().Added
is null/is not nulloperators.Added
~prefix negation (NotExpr).Fixed quoted literals (
'a|b','a&b', etc.) being split on structural characters.Fixed
in/not inlist items with commas inside quotes (desig in 'a,b', 'c').Fixed boolean column filtering:
True/Falsestrings now coerce toboolbefore pyarrow pushdown.Multi-file reads now use a single
ds.dataset(files)call (parallel I/O).Parquet output now uses
pq.write_tableto preserve Arrow type fidelity.Added
filter_df(df, filters)to apply the same filter syntax to an already-loaded DataFrame.
v0.1.6 (2026-04-29)
True/Falsestring literals (case-insensitive) are now converted to Pythonboolbefore pyarrow, preventing type-mismatch errors on boolean columns.
v0.1.5 (2026-02-23)
list/tuple:
in/not invalue lists now accept bracket/parenthesis enclosures. *"desig in [1, 2, 3]"and"desig in (1, 2, 3)"work in addition to the bare comma-separated form.Bugfix a few edge cases.
v0.1.4 (2026-02-23)
Similar fix as 0.1.3: Fixed
in/not invalue parsing *"desig in '356', '3200'"are preserved as strings.
v0.1.3 (2026-02-23)
Fixed quoted scalar values *
"name == '42'"now correctly preserves'42'as a string instead of coercing it to the integer42.
v0.1.2 (2026-02-21)
version bump only.
v0.1.1 (2026-02-21)
Added Python 3.9 support.
Fixed Sphinx documentation build warnings.
v0.1.0 (2026-02-21)
Initial release.
Core
read()function with predicate-pushdown viapyarrow.dataset.Expression parser supporting
&,|, parentheses,in/not in.Backtick quoting for column names with special characters.
Tuple and DNF filter syntax.
CLI tool (
pqfilt) with-fexpression option.Multi-file and glob support.
Output to Parquet or CSV.