Skip to content

Commit 54cea1b

Browse files
committed
Support 'calendar_interval' and 'fixed_interval' in DateHistogramFacet
1 parent e7f8a90 commit 54cea1b

File tree

3 files changed

+79
-8
lines changed

3 files changed

+79
-8
lines changed

elasticsearch_dsl/faceted_search.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,34 @@ def get_value_filter(self, filter_value):
168168
)
169169

170170

171+
def _date_interval_month(d):
172+
return (d + timedelta(days=32)).replace(day=1)
173+
174+
175+
def _date_interval_week(d):
176+
return d + timedelta(days=7)
177+
178+
179+
def _date_interval_day(d):
180+
return d + timedelta(days=1)
181+
182+
183+
def _date_interval_hour(d):
184+
return d + timedelta(hours=1)
185+
186+
171187
class DateHistogramFacet(Facet):
172188
agg_type = "date_histogram"
173189

174190
DATE_INTERVALS = {
175-
"month": lambda d: (d + timedelta(days=32)).replace(day=1),
176-
"week": lambda d: d + timedelta(days=7),
177-
"day": lambda d: d + timedelta(days=1),
178-
"hour": lambda d: d + timedelta(hours=1),
191+
"month": _date_interval_month,
192+
"1M": _date_interval_month,
193+
"week": _date_interval_week,
194+
"1w": _date_interval_week,
195+
"day": _date_interval_day,
196+
"1d": _date_interval_day,
197+
"hour": _date_interval_hour,
198+
"1h": _date_interval_hour,
179199
}
180200

181201
def __init__(self, **kwargs):
@@ -194,12 +214,20 @@ def get_value(self, bucket):
194214
return bucket["key"]
195215

196216
def get_value_filter(self, filter_value):
217+
for interval_type in ("calendar_interval", "fixed_interval"):
218+
if interval_type in self._params:
219+
break
220+
else:
221+
interval_type = "interval"
222+
197223
return Range(
198224
_expand__to_dot=False,
199225
**{
200226
self._params["field"]: {
201227
"gte": filter_value,
202-
"lt": self.DATE_INTERVALS[self._params["interval"]](filter_value),
228+
"lt": self.DATE_INTERVALS[self._params[interval_type]](
229+
filter_value
230+
),
203231
}
204232
}
205233
)

tests/test_faceted_search.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
from datetime import datetime
1919

20+
import pytest
21+
2022
from elasticsearch_dsl.faceted_search import (
2123
DateHistogramFacet,
2224
FacetedSearch,
@@ -144,3 +146,45 @@ def test_date_histogram_facet_with_1970_01_01_date():
144146
dhf = DateHistogramFacet()
145147
assert dhf.get_value({"key": None}) == datetime(1970, 1, 1, 0, 0)
146148
assert dhf.get_value({"key": 0}) == datetime(1970, 1, 1, 0, 0)
149+
150+
151+
@pytest.mark.parametrize(
152+
["interval_type", "interval"],
153+
[
154+
("interval", "month"),
155+
("calendar_interval", "month"),
156+
("interval", "week"),
157+
("calendar_interval", "week"),
158+
("interval", "day"),
159+
("calendar_interval", "day"),
160+
("fixed_interval", "day"),
161+
("interval", "hour"),
162+
("fixed_interval", "hour"),
163+
("interval", "1M"),
164+
("calendar_interval", "1M"),
165+
("interval", "1w"),
166+
("calendar_interval", "1w"),
167+
("interval", "1d"),
168+
("calendar_interval", "1d"),
169+
("fixed_interval", "1d"),
170+
("interval", "1h"),
171+
("fixed_interval", "1h"),
172+
],
173+
)
174+
def test_date_histogram_interval_types(interval_type, interval):
175+
dhf = DateHistogramFacet(field="@timestamp", **{interval_type: interval})
176+
assert dhf.get_aggregation().to_dict() == {
177+
"date_histogram": {
178+
"field": "@timestamp",
179+
interval_type: interval,
180+
"min_doc_count": 0,
181+
}
182+
}
183+
dhf.get_value_filter(datetime.now())
184+
185+
186+
def test_date_histogram_no_interval_keyerror():
187+
dhf = DateHistogramFacet(field="@timestamp")
188+
with pytest.raises(KeyError) as e:
189+
dhf.get_value_filter(datetime.now())
190+
assert str(e.value) == "'interval'"

tests/test_integration/test_faceted_search.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class CommitSearch(FacetedSearch):
3939
facets = {
4040
"files": TermsFacet(field="files"),
4141
"frequency": DateHistogramFacet(
42-
field="authored_date", interval="day", min_doc_count=1
42+
field="authored_date", fixed_interval="1d", min_doc_count=1
4343
),
4444
"deletions": RangeFacet(
4545
field="stats.deletions",
@@ -69,7 +69,7 @@ class RepoSearch(FacetedSearch):
6969
doc_types = [Repos]
7070
facets = {
7171
"public": TermsFacet(field="is_public"),
72-
"created": DateHistogramFacet(field="created_at", interval="month"),
72+
"created": DateHistogramFacet(field="created_at", calendar_interval="month"),
7373
}
7474

7575
def search(self):
@@ -146,7 +146,6 @@ def test_boolean_facet(data_client):
146146

147147
def test_empty_search_finds_everything(data_client):
148148
cs = CommitSearch()
149-
150149
r = cs.execute()
151150

152151
assert r.hits.total.value == 52

0 commit comments

Comments
 (0)