@Override public Timestamp next() { if (!hasNext()) { throw new NoSuchElementException(); } try { return m_current; } finally { m_current = m_reversed ? m_current.minus(m_interval) : m_current.plus(m_interval); } }
@Override public Results<Sample> select(Context context, Resource resource, Optional<Timestamp> start, Optional<Timestamp> end) { Timer.Context timer = m_sampleSelectTimer.time(); validateSelect(start, end); Timestamp upper = end.isPresent() ? end.get() : Timestamp.now(); Timestamp lower = start.isPresent() ? start.get() : upper.minus(Duration.seconds(86400)); LOG.debug("Querying database for resource {}, from {} to {}", resource, lower, upper); Results<Sample> samples = new Results<>(); DriverAdapter driverAdapter = new DriverAdapter(cassandraSelect(context, resource, lower, upper)); for (Row<Sample> row : driverAdapter) { samples.addRow(row); } LOG.debug("{} results returned from database", driverAdapter.getResultCount()); m_samplesSelected.mark(driverAdapter.getResultCount()); try { return samples; } finally { timer.stop(); } }
public Iterable<Results.Row<Sample>> select(Context context, Resource resource, Timestamp start, Timestamp end, ResultDescriptor descriptor, Duration step) { return new DriverAdapter(cassandraSelect(context, resource, start.minus(step), end), descriptor.getSourceNames()); }
Aggregation(Resource resource, Timestamp start, Timestamp end, ResultDescriptor resultDescriptor, Duration resolution, Iterator<Row<Measurement>> input) { m_resultDescriptor = checkNotNull(resultDescriptor, "result descriptor argument"); m_resource = checkNotNull(resource, "resource argument"); checkNotNull(start, "start argument"); checkNotNull(end, "end argument"); m_resolution = checkNotNull(resolution, "resolution argument"); m_input = checkNotNull(input, "input argument"); Duration interval = resultDescriptor.getInterval(); checkArgument(resolution.isMultiple(interval), "resolution must be a multiple of interval"); m_timestamps = new IntervalGenerator(start.stepFloor(m_resolution), end.stepCeiling(m_resolution), m_resolution); m_intervalsPer = (double) resolution.divideBy(interval); m_working = m_input.hasNext() ? m_input.next() : null; m_nextOut = m_timestamps.hasNext() ? new Row<Measurement>(m_timestamps.next(), m_resource) : null; // If the input stream contains any Samples earlier than what's relevant, iterate past them. if (m_nextOut != null) { while (m_working != null && m_working.getTimestamp().lte(m_nextOut.getTimestamp().minus(m_resolution))) { m_working = nextWorking(); } } }
Timestamp lower = start.isPresent() ? start.get() : upper.minus(Duration.seconds(86400)); Duration step; if (resolution.isPresent()) { } else { long stepMillis = upper.minus(lower).asMillis() / TARGET_NUMBER_OF_STEPS; LOG.debug("Querying database for resource {}, from {} to {}", resource, lower.minus(step), upper); DriverAdapter driverAdapter = new DriverAdapter(cassandraSelect(context, resource, lower.minus(step), upper), descriptor.getSourceNames());
private boolean inRange() { if (m_working == null || m_nextOut == null) { return false; } Timestamp rangeUpper = m_nextOut.getTimestamp(); Timestamp rangeLower = m_nextOut.getTimestamp().minus(m_resolution); return m_working.getTimestamp().lte(rangeUpper) && m_working.getTimestamp().gt(rangeLower); }
public Results<Measurement> process(Iterator<Row<Sample>> samples) { checkNotNull(samples, "samples argument"); // Build chain of iterators to process results as a stream Rate rate = new Rate(samples, m_resultDescriptor.getSourceNames()); PrimaryData primaryData = new PrimaryData(m_resource, m_start.minus(m_resolution), m_end, m_resultDescriptor, rate); Aggregation aggregation = new Aggregation(m_resource, m_start, m_end, m_resultDescriptor, m_resolution, primaryData); Compute compute = new Compute(m_resultDescriptor, aggregation); Export exports = new Export(m_resultDescriptor.getExports(), compute); Results<Measurement> measurements = new Results<>(); for (Row<Measurement> row : exports) { measurements.addRow(row); } return measurements; }
@Override void go() throws InterruptedException { createThreads(); for (Timestamp t : new IntervalGenerator(m_config.getStart(), m_config.getEnd(), m_config.getSelectLength(), true)) { for (String resource : m_config.getResources()) { m_queryQueue.put(new Query(resource, t.minus(m_config.getSelectLength()), t, m_config.getResolution())); } } shutdown(); }