From 37134f475605f860c5010c3ede9e105ff340da5d Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 19 Apr 2026 13:28:56 -0700 Subject: [PATCH] Just drop the underscore ones, duh --- src/documents/search/_query.py | 89 +++++++++--------------- src/documents/tests/search/test_query.py | 53 ++++++-------- 2 files changed, 56 insertions(+), 86 deletions(-) diff --git a/src/documents/search/_query.py b/src/documents/search/_query.py index 0cd5b1819..b68c2d050 100644 --- a/src/documents/search/_query.py +++ b/src/documents/search/_query.py @@ -25,34 +25,21 @@ _REGEX_TIMEOUT: Final[float] = 1.0 _DATE_ONLY_FIELDS = frozenset({"created"}) -# Natural date keywords with whoosh-style aliases mapped to -# canonical forms. -_DATE_KEYWORD_ALIASES: Final[dict[str, str]] = { - "today": "today", - "yesterday": "yesterday", - "this_week": "this_week", - "this week": "this_week", - "last_week": "last_week", - "last week": "last_week", - "previous week": "last_week", - "this_month": "this_month", - "this month": "this_month", - "last_month": "last_month", - "last month": "last_month", - "previous month": "last_month", - "last_quarter": "last_quarter", - "last quarter": "last_quarter", - "previous_quarter": "last_quarter", - "previous quarter": "last_quarter", - "this_year": "this_year", - "this year": "this_year", - "last_year": "last_year", - "last year": "last_year", - "previous year": "last_year", -} -_DATE_KEYWORDS = frozenset(_DATE_KEYWORD_ALIASES.values()) +_DATE_KEYWORDS = frozenset( + { + "today", + "yesterday", + "previous week", + "this month", + "previous month", + "this year", + "previous year", + "previous quarter", + }, +) + _DATE_KEYWORD_PATTERN = "|".join( - sorted((regex.escape(k) for k in _DATE_KEYWORD_ALIASES), key=len, reverse=True), + sorted((regex.escape(k) for k in _DATE_KEYWORDS), key=len, reverse=True), ) _FIELD_DATE_RE = regex.compile( @@ -107,31 +94,33 @@ def _date_only_range(keyword: str, tz: tzinfo) -> str: lo = datetime(y.year, y.month, y.day, tzinfo=UTC) hi = datetime(today.year, today.month, today.day, tzinfo=UTC) return _iso_range(lo, hi) - if keyword == "this_week": - mon = today - timedelta(days=today.weekday()) - lo = datetime(mon.year, mon.month, mon.day, tzinfo=UTC) - return _iso_range(lo, lo + timedelta(weeks=1)) - if keyword == "last_week": + if keyword == "previous week": this_mon = today - timedelta(days=today.weekday()) last_mon = this_mon - timedelta(weeks=1) lo = datetime(last_mon.year, last_mon.month, last_mon.day, tzinfo=UTC) hi = datetime(this_mon.year, this_mon.month, this_mon.day, tzinfo=UTC) return _iso_range(lo, hi) - if keyword == "this_month": + if keyword == "this month": lo = datetime(today.year, today.month, 1, tzinfo=UTC) if today.month == 12: hi = datetime(today.year + 1, 1, 1, tzinfo=UTC) else: hi = datetime(today.year, today.month + 1, 1, tzinfo=UTC) return _iso_range(lo, hi) - if keyword == "last_month": + if keyword == "previous month": if today.month == 1: lo = datetime(today.year - 1, 12, 1, tzinfo=UTC) else: lo = datetime(today.year, today.month - 1, 1, tzinfo=UTC) hi = datetime(today.year, today.month, 1, tzinfo=UTC) return _iso_range(lo, hi) - if keyword == "last_quarter": + if keyword == "this year": + lo = datetime(today.year, 1, 1, tzinfo=UTC) + return _iso_range(lo, datetime(today.year + 1, 1, 1, tzinfo=UTC)) + if keyword == "previous year": + lo = datetime(today.year - 1, 1, 1, tzinfo=UTC) + return _iso_range(lo, datetime(today.year, 1, 1, tzinfo=UTC)) + if keyword == "previous quarter": this_quarter = _quarter_start(today) last_quarter = this_quarter - relativedelta(months=3) lo = datetime( @@ -147,12 +136,6 @@ def _date_only_range(keyword: str, tz: tzinfo) -> str: tzinfo=UTC, ) return _iso_range(lo, hi) - if keyword == "this_year": - lo = datetime(today.year, 1, 1, tzinfo=UTC) - return _iso_range(lo, datetime(today.year + 1, 1, 1, tzinfo=UTC)) - if keyword == "last_year": - lo = datetime(today.year - 1, 1, 1, tzinfo=UTC) - return _iso_range(lo, datetime(today.year, 1, 1, tzinfo=UTC)) raise ValueError(f"Unknown keyword: {keyword}") @@ -176,41 +159,38 @@ def _datetime_range(keyword: str, tz: tzinfo) -> str: if keyword == "yesterday": y = today - timedelta(days=1) return _iso_range(_midnight(y), _midnight(today)) - if keyword == "this_week": - mon = today - timedelta(days=today.weekday()) - return _iso_range(_midnight(mon), _midnight(mon + timedelta(weeks=1))) - if keyword == "last_week": + if keyword == "previous week": this_mon = today - timedelta(days=today.weekday()) last_mon = this_mon - timedelta(weeks=1) return _iso_range(_midnight(last_mon), _midnight(this_mon)) - if keyword == "this_month": + if keyword == "this month": first = today.replace(day=1) if today.month == 12: next_first = date(today.year + 1, 1, 1) else: next_first = date(today.year, today.month + 1, 1) return _iso_range(_midnight(first), _midnight(next_first)) - if keyword == "last_month": + if keyword == "previous month": this_first = today.replace(day=1) if today.month == 1: last_first = date(today.year - 1, 12, 1) else: last_first = date(today.year, today.month - 1, 1) return _iso_range(_midnight(last_first), _midnight(this_first)) - if keyword == "last_quarter": - this_quarter = _quarter_start(today) - last_quarter = this_quarter - relativedelta(months=3) - return _iso_range(_midnight(last_quarter), _midnight(this_quarter)) - if keyword == "this_year": + if keyword == "this year": return _iso_range( _midnight(date(today.year, 1, 1)), _midnight(date(today.year + 1, 1, 1)), ) - if keyword == "last_year": + if keyword == "previous year": return _iso_range( _midnight(date(today.year - 1, 1, 1)), _midnight(date(today.year, 1, 1)), ) + if keyword == "previous quarter": + this_quarter = _quarter_start(today) + last_quarter = this_quarter - relativedelta(months=3) + return _iso_range(_midnight(last_quarter), _midnight(this_quarter)) raise ValueError(f"Unknown keyword: {keyword}") @@ -375,8 +355,7 @@ def rewrite_natural_date_keywords(query: str, tz: tzinfo) -> str: def _replace(m: regex.Match[str]) -> str: field = m.group("field") - raw_keyword = m.group("quoted") or m.group("bare") - keyword = _DATE_KEYWORD_ALIASES[raw_keyword.lower()] + keyword = m.group("quoted") or m.group("bare") if field in _DATE_ONLY_FIELDS: return f"{field}:{_date_only_range(keyword, tz)}" return f"{field}:{_datetime_range(keyword, tz)}" diff --git a/src/documents/tests/search/test_query.py b/src/documents/tests/search/test_query.py index e40f6f652..fac1a9cee 100644 --- a/src/documents/tests/search/test_query.py +++ b/src/documents/tests/search/test_query.py @@ -81,45 +81,39 @@ class TestCreatedDateField: ), pytest.param( "created", - "this_week", - "2026-03-23T00:00:00Z", - "2026-03-30T00:00:00Z", - id="this_week_mon_sun", - ), - pytest.param( - "created", - "last_week", + "previous week", "2026-03-16T00:00:00Z", "2026-03-23T00:00:00Z", - id="last_week", + id="previous_week", ), pytest.param( "created", - "this_month", + "this month", "2026-03-01T00:00:00Z", "2026-04-01T00:00:00Z", id="this_month", ), pytest.param( "created", - "last_month", + "previous month", "2026-02-01T00:00:00Z", "2026-03-01T00:00:00Z", - id="last_month", + id="previous_month", ), pytest.param( "created", - "this_year", + "this year", "2026-01-01T00:00:00Z", "2027-01-01T00:00:00Z", id="this_year", ), pytest.param( "created", - "last_year", + "previous year", + "2026-03-23T00:00:00Z", "2025-01-01T00:00:00Z", "2026-01-01T00:00:00Z", - id="last_year", + id="previous_year", ), ], ) @@ -211,40 +205,34 @@ class TestDateTimeFields: id="yesterday", ), pytest.param( - "this_week", - "2026-03-23T00:00:00Z", - "2026-03-30T00:00:00Z", - id="this_week", - ), - pytest.param( - "last_week", + "previous week", "2026-03-16T00:00:00Z", "2026-03-23T00:00:00Z", - id="last_week", + id="previous_week", ), pytest.param( - "this_month", + "this month", "2026-03-01T00:00:00Z", "2026-04-01T00:00:00Z", id="this_month", ), pytest.param( - "last_month", + "previous month", "2026-02-01T00:00:00Z", "2026-03-01T00:00:00Z", - id="last_month", + id="previous_month", ), pytest.param( - "this_year", + "this year", "2026-01-01T00:00:00Z", "2027-01-01T00:00:00Z", id="this_year", ), pytest.param( - "last_year", + "previous year", "2025-01-01T00:00:00Z", "2026-01-01T00:00:00Z", - id="last_year", + id="previous_year", ), ], ) @@ -263,14 +251,17 @@ class TestDateTimeFields: @time_machine.travel(datetime(2026, 12, 15, 12, 0, tzinfo=UTC), tick=False) def test_this_month_december_wraps_to_next_year(self) -> None: # December: next month wraps to January of next year - lo, hi = _range(rewrite_natural_date_keywords("added:this_month", UTC), "added") + lo, hi = _range(rewrite_natural_date_keywords("added:this month", UTC), "added") assert lo == "2026-12-01T00:00:00Z" assert hi == "2027-01-01T00:00:00Z" @time_machine.travel(datetime(2026, 1, 15, 12, 0, tzinfo=UTC), tick=False) def test_last_month_january_wraps_to_previous_year(self) -> None: # January: last month wraps back to December of previous year - lo, hi = _range(rewrite_natural_date_keywords("added:last_month", UTC), "added") + lo, hi = _range( + rewrite_natural_date_keywords("added:previous month", UTC), + "added", + ) assert lo == "2025-12-01T00:00:00Z" assert hi == "2026-01-01T00:00:00Z"