Skip to content
This repository was archived by the owner on Jan 8, 2019. It is now read-only.

Commit 185aecb

Browse files
committed
Fixes for issue #777
- Resolution of histogram now depends on time range of search, making it more reasonable
1 parent 642d3bf commit 185aecb

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

app/controllers/SearchController.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
import org.graylog2.restclient.models.*;
3838
import org.graylog2.restclient.models.api.results.DateHistogramResult;
3939
import org.graylog2.restclient.models.api.results.SearchResult;
40+
import org.joda.time.DateTime;
41+
import org.joda.time.DateTimeConstants;
42+
import org.joda.time.Minutes;
4043
import play.mvc.Result;
4144
import views.helpers.Permissions;
4245

@@ -107,17 +110,16 @@ public Result index(String q,
107110
savedSearch = null;
108111
}
109112

110-
// Histogram interval.
111-
if (interval == null || interval.isEmpty() || !SearchTools.isAllowedDateHistogramInterval(interval)) {
112-
interval = "minute";
113-
}
114-
115113
searchResult = search.search();
116114
if (searchResult.getError() != null) {
117115
return ok(views.html.search.queryerror.render(currentUser(), q, searchResult, savedSearch, fields, null));
118116
}
119117
searchResult.setAllFields(getAllFields());
120118

119+
// histogram resolution (strangely aka interval)
120+
if (interval == null || interval.isEmpty() || !SearchTools.isAllowedDateHistogramInterval(interval)) {
121+
interval = determineHistogramResolution(searchResult);
122+
}
121123
histogramResult = search.dateHistogram(interval);
122124
formattedHistogramResults = formatHistogramResults(histogramResult.getResults(), displayWidth);
123125
} catch (IOException e) {
@@ -134,6 +136,33 @@ public Result index(String q,
134136
}
135137
}
136138

139+
protected String determineHistogramResolution(final SearchResult searchResult) {
140+
final String interval;
141+
final int queryRangeInMinutes = Minutes.minutesBetween(searchResult.getFromDateTime(), searchResult.getToDateTime()).getMinutes();
142+
final int HOUR = DateTimeConstants.MINUTES_PER_HOUR;
143+
final int DAY = DateTimeConstants.MINUTES_PER_DAY;
144+
final int WEEK = DateTimeConstants.MINUTES_PER_WEEK;
145+
final int MONTH = DAY * 30;
146+
final int YEAR = MONTH * 12;
147+
148+
if (queryRangeInMinutes < DAY / 2) {
149+
interval = "minute";
150+
} else if (queryRangeInMinutes < DAY * 2) {
151+
interval = "hour";
152+
} else if (queryRangeInMinutes < MONTH) {
153+
interval = "day";
154+
} else if (queryRangeInMinutes < MONTH * 6) {
155+
interval = "week";
156+
} else if (queryRangeInMinutes < YEAR * 2) {
157+
interval = "month";
158+
} else if (queryRangeInMinutes < YEAR * 10) {
159+
interval = "quarter";
160+
} else {
161+
interval = "year";
162+
}
163+
return interval;
164+
}
165+
137166
/**
138167
* [{ x: -1893456000, y: 92228531 }, { x: -1577923200, y: 106021568 }]
139168
*

app/controllers/StreamSearchController.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,16 @@ public Result index(String streamId,
8181
savedSearch = null;
8282
}
8383

84-
// Histogram interval.
85-
if (interval == null || interval.isEmpty() || !SearchTools.isAllowedDateHistogramInterval(interval)) {
86-
interval = "minute";
87-
}
88-
8984
searchResult = search.search();
9085
if (searchResult.getError() != null) {
9186
return ok(views.html.search.queryerror.render(currentUser(), q, searchResult, savedSearch, fields, stream));
9287
}
9388
searchResult.setAllFields(getAllFields());
9489

90+
// histogram resolution (strangely aka interval)
91+
if (interval == null || interval.isEmpty() || !SearchTools.isAllowedDateHistogramInterval(interval)) {
92+
interval = determineHistogramResolution(searchResult);
93+
}
9594
histogramResult = search.dateHistogram(interval);
9695
formattedHistogramResults = formatHistogramResults(histogramResult.getResults(), displayWidth);
9796
} catch (IOException e) {

0 commit comments

Comments
 (0)