diff --git a/src/documents/search/_query.py b/src/documents/search/_query.py index dbedc2973..1bd31b804 100644 --- a/src/documents/search/_query.py +++ b/src/documents/search/_query.py @@ -25,16 +25,25 @@ _REGEX_TIMEOUT: Final[float] = 1.0 _DATE_ONLY_FIELDS = frozenset({"created"}) +_TODAY: Final[str] = "today" +_YESTERDAY: Final[str] = "yesterday" +_PREVIOUS_WEEK: Final[str] = "previous week" +_THIS_MONTH: Final[str] = "this month" +_PREVIOUS_MONTH: Final[str] = "previous month" +_THIS_YEAR: Final[str] = "this year" +_PREVIOUS_YEAR: Final[str] = "previous year" +_PREVIOUS_QUARTER: Final[str] = "previous quarter" + _DATE_KEYWORDS = frozenset( { - "today", - "yesterday", - "previous week", - "this month", - "previous month", - "this year", - "previous year", - "previous quarter", + _TODAY, + _YESTERDAY, + _PREVIOUS_WEEK, + _THIS_MONTH, + _PREVIOUS_MONTH, + _THIS_YEAR, + _PREVIOUS_YEAR, + _PREVIOUS_QUARTER, }, ) @@ -86,41 +95,41 @@ def _date_only_range(keyword: str, tz: tzinfo) -> str: def _quarter_start(d: date) -> date: return date(d.year, ((d.month - 1) // 3) * 3 + 1, 1) - if keyword == "today": + if keyword == _TODAY: lo = datetime(today.year, today.month, today.day, tzinfo=UTC) return _iso_range(lo, lo + timedelta(days=1)) - if keyword == "yesterday": + if keyword == _YESTERDAY: y = today - timedelta(days=1) 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 == "previous 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 == "previous 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 == "this year": + 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": + 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": + if keyword == _PREVIOUS_QUARTER: this_quarter = _quarter_start(today) last_quarter = this_quarter - relativedelta(months=3) lo = datetime( @@ -154,40 +163,40 @@ def _datetime_range(keyword: str, tz: tzinfo) -> str: def _quarter_start(d: date) -> date: return date(d.year, ((d.month - 1) // 3) * 3 + 1, 1) - if keyword == "today": + if keyword == _TODAY: return _iso_range(_midnight(today), _midnight(today + timedelta(days=1))) - if keyword == "yesterday": + if keyword == _YESTERDAY: y = today - timedelta(days=1) return _iso_range(_midnight(y), _midnight(today)) - if keyword == "previous 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 == "previous 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 == "this year": + if keyword == _THIS_YEAR: return _iso_range( _midnight(date(today.year, 1, 1)), _midnight(date(today.year + 1, 1, 1)), ) - if keyword == "previous 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": + 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))