From 7c05e9485b6675187102925a7f8e0190f06ead1b Mon Sep 17 00:00:00 2001 From: Nikhil Singhal Date: Sat, 4 Jul 2026 11:52:50 -0700 Subject: [PATCH] Fix swapped non-numeric >= and <= fallbacks in the filter DSL The non-numeric branch of >= returned le() and <= returned ge(), so any string or date ordered comparison silently selected the opposite rows. Adds truth-table tests for string dates including > and < as already-correct controls. --- openavmkit/filters.py | 4 ++-- tests/test_filters.py | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/openavmkit/filters.py b/openavmkit/filters.py index a1c8c146..fcf6e06c 100644 --- a/openavmkit/filters.py +++ b/openavmkit/filters.py @@ -190,12 +190,12 @@ def resolve_filter(df: pd.DataFrame, f: list, rename_map: dict = None) -> pd.Ser if is_column_of_type(df, field, "number"): return df[field].fillna(0).ge(value) else: - return df[field].le(value) + return df[field].ge(value) if operator == "<=": if is_column_of_type(df, field, "number"): return df[field].fillna(0).le(value) else: - return df[field].ge(value) + return df[field].le(value) if operator == "==": return df[field].eq(value) if operator == "!=": diff --git a/tests/test_filters.py b/tests/test_filters.py index 0830035b..697f4a11 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -643,3 +643,23 @@ def test_filter_debug(): assert lists_are_equal(results_sf_select_improved, ['165177']) assert lists_are_equal(results_sf_select_vacant, []) + + +def test_string_ordered_comparisons(): + import pandas as pd + from openavmkit.filters import resolve_filter + + df = pd.DataFrame({"sale_date": ["2019-06-01", "2020-01-01", "2021-03-15"]}) + + ge = resolve_filter(df, [">=", "sale_date", "str:2020-01-01"]) + assert list(df[ge]["sale_date"]) == ["2020-01-01", "2021-03-15"] + + le = resolve_filter(df, ["<=", "sale_date", "str:2020-01-01"]) + assert list(df[le]["sale_date"]) == ["2019-06-01", "2020-01-01"] + + # > and < were already correct; control cases + gt = resolve_filter(df, [">", "sale_date", "str:2020-01-01"]) + assert list(df[gt]["sale_date"]) == ["2021-03-15"] + + lt = resolve_filter(df, ["<", "sale_date", "str:2020-01-01"]) + assert list(df[lt]["sale_date"]) == ["2019-06-01"]