コード例 #1
0
  @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);
    }
  }