@Override protected ComputationResult compute() { try { final String filter; if (!isNullOrEmpty(streamId)) { filter = "streams:" + streamId; } else { filter = null; } // if we only need the cardinality, we can skip calculating the extended stats and vice versa boolean isCardinalityFunction = "cardinality".equals(statsFunction); final FieldStatsResult fieldStatsResult = getSearches() .fieldStats( field, query, filter, timeRange, isCardinalityFunction, isCardinalityFunction); if (trend && timeRange instanceof RelativeRange) { DateTime toPrevious = timeRange.getFrom(); DateTime fromPrevious = toPrevious.minus(Seconds.seconds(((RelativeRange) timeRange).getRange())); TimeRange previousTimeRange = new AbsoluteRange(fromPrevious, toPrevious); final FieldStatsResult previousFieldStatsResult = getSearches() .fieldStats( field, query, filter, previousTimeRange, isCardinalityFunction, isCardinalityFunction); Map<String, Object> results = Maps.newHashMap(); results.put("now", getStatisticalValue(fieldStatsResult)); results.put("previous", getStatisticalValue(previousFieldStatsResult)); long tookMs = fieldStatsResult.took().millis() + previousFieldStatsResult.took().millis(); return new ComputationResult(results, tookMs); } else { return new ComputationResult( getStatisticalValue(fieldStatsResult), fieldStatsResult.took().millis()); } } catch (Searches.FieldTypeException e) { throw new RuntimeException("Invalid field provided.", e); } }