Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/khoj/search_filter/date_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,9 @@ def get_query_date_range(self, query) -> List:

def defilter(self, query):
# remove date range filter from query
query = re.sub(rf"\s+{self.date_regex}", " ", query)
# Match the filter itself, not a required leading whitespace. Requiring whitespace before it
# skipped filters at the start of the query, or after any non-space character like ( or ,
query = re.sub(self.date_regex, " ", query)
query = re.sub(r"\s{2,}", " ", query).strip() # remove multiple spaces
return query

Expand Down
45 changes: 45 additions & 0 deletions tests/test_date_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,51 @@ def test_get_date_filter_terms():
assert dtrange_match == []


def test_defilter_removes_date_filter_mid_query():
date_filter = DateFilter()

assert date_filter.defilter('head dt:"1984-01-01" tail') == "head tail"
assert date_filter.defilter('head dt>"today" dt:"1984-01-01" tail') == "head tail"
assert date_filter.defilter('head dt<="multi word date"') == "head"
assert date_filter.defilter("head tail") == "head tail"


def test_defilter_removes_date_filter_at_start_of_query():
date_filter = DateFilter()

# A filter at the start of the query has no whitespace before it
assert date_filter.defilter('dt:"1984-01-01" tail') == "tail"
assert date_filter.defilter('dt>="1984-01-01" dt<="1984-12-31" tail') == "tail"

# A query can be nothing but a filter
assert date_filter.defilter('dt:"1984-01-01"') == ""


def test_defilter_removes_date_filter_after_non_space_character():
date_filter = DateFilter()

assert date_filter.defilter('head,dt:"1984-01-01"') == "head,"
assert date_filter.defilter('head (dt:"1984-01-01")') == "head ( )"


def test_defilter_removes_all_terms_it_reports():
"Whatever get_filter_terms finds must not survive defilter"
date_filter = DateFilter()

queries = [
'head dt:"1984-01-01" tail',
'dt:"1984-01-01" tail',
'dt:"1984-01-01"',
'head,dt:"1984-01-01"',
'head (dt:"1984-01-01")',
'dt>="1984-01-01" dt<="1984-12-31" tail',
"dt:'1984-01-01' tail",
]

for query in queries:
assert date_filter.get_filter_terms(date_filter.defilter(query)) == [], f"Filter left in query: {query}"


def test_date_extraction():
extracted_dates = DateFilter().extract_dates("")
assert extracted_dates == [], "Expected to handle empty string"
Expand Down