3737import org .graylog2 .restclient .models .*;
3838import org .graylog2 .restclient .models .api .results .DateHistogramResult ;
3939import 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 ;
4043import play .mvc .Result ;
4144import 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 *
0 commit comments