/** * @return instance of {@link CubeQuery} */ private CubeQuery build() { return new CubeQuery(aggregation, startTs, endTs, resolution, limit, measurements, dimensionValues, groupByDimensions, interpolator); }
@Nullable private ImmutablePair<String, Aggregation> findAggregation(CubeQuery query) { ImmutablePair<String, Aggregation> currentBest = null; for (Map.Entry<String, ? extends Aggregation> entry : aggregations.entrySet()) { Aggregation agg = entry.getValue(); if (agg.getDimensionNames().containsAll(query.getGroupByDimensions()) && agg.getDimensionNames().containsAll(query.getDimensionValues().keySet())) { // todo: choose aggregation smarter than just by number of dimensions :) if (currentBest == null || currentBest.getSecond().getDimensionNames().size() > agg.getDimensionNames().size()) { currentBest = new ImmutablePair<>(entry.getKey(), agg); } } } return currentBest; }
private Collection<TimeSeries> convertToQueryResult(CubeQuery query, Table<Map<String, String>, String, Map<Long, Long>> resultTable) { List<TimeSeries> result = Lists.newArrayList(); // iterating each groupValue dimensions for (Map.Entry<Map<String, String>, Map<String, Map<Long, Long>>> row : resultTable.rowMap().entrySet()) { // iterating each measure for (Map.Entry<String, Map<Long, Long>> measureEntry : row.getValue().entrySet()) { // generating time series for a grouping and a measure int count = 0; List<TimeValue> timeValues = Lists.newArrayList(); for (Map.Entry<Long, Long> timeValue : measureEntry.getValue().entrySet()) { timeValues.add(new TimeValue(timeValue.getKey(), timeValue.getValue())); } Collections.sort(timeValues); PeekingIterator<TimeValue> timeValueItor = Iterators.peekingIterator( new TimeSeriesInterpolator(timeValues, query.getInterpolator(), query.getResolution()).iterator()); List<TimeValue> resultTimeValues = Lists.newArrayList(); while (timeValueItor.hasNext()) { TimeValue timeValue = timeValueItor.next(); resultTimeValues.add(new TimeValue(timeValue.getTimestamp(), timeValue.getValue())); if (++count >= query.getLimit()) { break; } } result.add(new TimeSeries(measureEntry.getKey(), row.getKey(), resultTimeValues)); } } return result; }
if (!resolutionToFactTable.containsKey(query.getResolution())) { incrementMetric("cube.query.request.failure.count", 1); throw new IllegalArgumentException("There's no data aggregated for specified resolution to satisfy the query: " + query.toString()); if (query.getAggregation() != null) { aggName = query.getAggregation(); agg = aggregations.get(query.getAggregation()); if (agg == null) { incrementMetric("cube.query.request.failure.count", 1); throw new IllegalArgumentException( String.format("Specified aggregation %s is not found in cube aggregations: %s", query.getAggregation(), aggregations.keySet().toString())); incrementMetric("cube.query.request.failure.count", 1); throw new IllegalArgumentException("There's no data aggregated for specified dimensions " + "to satisfy the query: " + query.toString()); incrementMetric("cube.query.res." + query.getResolution() + ".count", 1); dimensionValues.add(new DimensionValue(dimensionName, query.getDimensionValues().get(dimensionName))); FactScan scan = new FactScan(query.getStartTs(), query.getEndTs(), query.getMeasurements().keySet(), dimensionValues); FactTable table = resolutionToFactTable.get(query.getResolution()); FactScanner scanner = table.scan(scan); Table<Map<String, String>, String, Map<Long, Long>> resultMap = getTimeSeries(query, scanner);
for (String dimensionName : query.getGroupByDimensions()) { AggregationFunction function = query.getMeasurements().get(next.getMeasureName()); if (AggregationFunction.SUM == function) { Long value = result.get(seriesDimensions, next.getMeasureName()).get(timeValue.getTimestamp());
private void verifyCountQuery(Cube cube, String aggregation, long startTs, long endTs, int resolution, String measureName, AggregationFunction aggFunction, Map<String, String> dimValues, List<String> groupByDims, Collection<TimeSeries> expected, Interpolator interpolator) throws Exception { CubeQuery query = CubeQuery.builder() .select() .measurement(measureName, aggFunction) .from(aggregation).resolution(resolution, TimeUnit.SECONDS) .where() .dimensions(dimValues) .timeRange(startTs, endTs) .groupBy() .dimensions(groupByDims) .limit(Integer.MAX_VALUE) .interpolator(interpolator) .build(); Collection<TimeSeries> result = cube.query(query); Assert.assertEquals(String.format("expected: %s, found: %s", expected, result), expected.size(), result.size()); Assert.assertTrue(String.format("expected: %s, found: %s", expected, result), expected.containsAll(result)); }
if (!resolutionToFactTable.containsKey(query.getResolution())) { incrementMetric("cube.query.request.failure.count", 1); throw new IllegalArgumentException("There's no data aggregated for specified resolution to satisfy the query: " + query.toString()); if (query.getAggregation() != null) { aggName = query.getAggregation(); agg = aggregations.get(query.getAggregation()); if (agg == null) { incrementMetric("cube.query.request.failure.count", 1); throw new IllegalArgumentException( String.format("Specified aggregation %s is not found in cube aggregations: %s", query.getAggregation(), aggregations.keySet().toString())); incrementMetric("cube.query.request.failure.count", 1); throw new IllegalArgumentException("There's no data aggregated for specified dimensions " + "to satisfy the query: " + query.toString()); incrementMetric("cube.query.res." + query.getResolution() + ".count", 1); dimensionValues.add(new DimensionValue(dimensionName, query.getDimensionValues().get(dimensionName))); FactScan scan = new FactScan(query.getStartTs(), query.getEndTs(), query.getMeasurements().keySet(), dimensionValues); FactTable table = resolutionToFactTable.get(query.getResolution()); FactScanner scanner = table.scan(scan); Table<Map<String, String>, String, Map<Long, Long>> resultMap = getTimeSeries(query, scanner);
for (String dimensionName : query.getGroupByDimensions()) { AggregationFunction function = query.getMeasurements().get(next.getMeasureName()); if (AggregationFunction.SUM == function) { Long value = result.get(seriesDimensions, next.getMeasureName()).get(timeValue.getTimestamp());
private CubeQuery buildCubeQuery(MetricDataQuery query) { return new CubeQuery(null, query.getStartTs(), query.getEndTs(), query.getResolution(), query.getLimit(), query.getMetrics(), query.getSliceByTags(), query.getGroupByTags(), query.getInterpolator()); }
private Collection<TimeSeries> convertToQueryResult(CubeQuery query, Table<Map<String, String>, String, Map<Long, Long>> resultTable) { List<TimeSeries> result = Lists.newArrayList(); // iterating each groupValue dimensions for (Map.Entry<Map<String, String>, Map<String, Map<Long, Long>>> row : resultTable.rowMap().entrySet()) { // iterating each measure for (Map.Entry<String, Map<Long, Long>> measureEntry : row.getValue().entrySet()) { // generating time series for a grouping and a measure int count = 0; List<TimeValue> timeValues = Lists.newArrayList(); for (Map.Entry<Long, Long> timeValue : measureEntry.getValue().entrySet()) { timeValues.add(new TimeValue(timeValue.getKey(), timeValue.getValue())); } Collections.sort(timeValues); PeekingIterator<TimeValue> timeValueItor = Iterators.peekingIterator( new TimeSeriesInterpolator(timeValues, query.getInterpolator(), query.getResolution()).iterator()); List<TimeValue> resultTimeValues = Lists.newArrayList(); while (timeValueItor.hasNext()) { TimeValue timeValue = timeValueItor.next(); resultTimeValues.add(new TimeValue(timeValue.getTimestamp(), timeValue.getValue())); if (++count >= query.getLimit()) { break; } } result.add(new TimeSeries(measureEntry.getKey(), row.getKey(), resultTimeValues)); } } return result; }
@Nullable private ImmutablePair<String, Aggregation> findAggregation(CubeQuery query) { ImmutablePair<String, Aggregation> currentBest = null; for (Map.Entry<String, ? extends Aggregation> entry : aggregations.entrySet()) { Aggregation agg = entry.getValue(); if (agg.getDimensionNames().containsAll(query.getGroupByDimensions()) && agg.getDimensionNames().containsAll(query.getDimensionValues().keySet())) { // todo: choose aggregation smarter than just by number of dimensions :) if (currentBest == null || currentBest.getSecond().getDimensionNames().size() > agg.getDimensionNames().size()) { currentBest = new ImmutablePair<>(entry.getKey(), agg); } } } return currentBest; }
private CubeQuery buildCubeQuery(MetricDataQuery query) { String aggregation = getAggregation(query); return new CubeQuery(aggregation, query.getStartTs(), query.getEndTs(), query.getResolution(), query.getLimit(), query.getMetrics(), query.getSliceByTags(), query.getGroupByTags(), query.getInterpolator()); }