// This file is part of OpenTSDB.
// Copyright (C) 2010-2012 The OpenTSDB Authors.
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2.1 of the License, or (at your
// option) any later version. This program is distributed in the hope that it
// will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
// General Public License for more details. You should have received a copy
// of the GNU Lesser General Public License along with this program. If not,
// see <http://www.gnu.org/licenses/>.
package net.opentsdb.core;
import java.util.Map;
import org.hbase.async.HBaseException;
import net.opentsdb.uid.NoSuchUniqueName;
/**
* A query to retreive data from the TSDB.
*/
public interface Query {
/**
* Sets the start time of the graph.
* @param timestamp The start time, all the data points returned will have a
* timestamp greater than or equal to this one.
* @throws IllegalArgumentException if timestamp is less than or equal to 0,
* or if it can't fit on 32 bits.
* @throws IllegalArgumentException if
* {@code timestamp >= }{@link #getEndTime getEndTime}.
*/
void setStartTime(long timestamp);
/**
* Returns the start time of the graph.
* @return A strictly positive integer.
* @throws IllegalStateException if {@link #setStartTime} was never called on
* this instance before.
*/
long getStartTime();
/**
* Sets the end time of the graph.
* @param timestamp The end time, all the data points returned will have a
* timestamp less than or equal to this one.
* @throws IllegalArgumentException if timestamp is less than or equal to 0,
* or if it can't fit on 32 bits.
* @throws IllegalArgumentException if
* {@code timestamp <= }{@link #getStartTime getStartTime}.
*/
public void setEndTime(long timestamp);
/**
* Returns the end time of the graph.
* <p>
* If {@link #setEndTime} was never called before, this method will
* automatically execute
* {@link #setEndTime setEndTime}{@code (System.currentTimeMillis() / 1000)}
* to set the end time.
* @return A strictly positive integer.
*/
long getEndTime();
/**
* Sets the time series to the query.
* @param metric The metric to retreive from the TSDB.
* @param tags The set of tags of interest.
* @param function The aggregation function to use.
* @param rate If true, the rate of the series will be used instead of the
* actual values.
* @throws NoSuchUniqueName if the name of a metric, or a tag name/value
* does not exist.
*/
void setTimeSeries(String metric, Map<String, String> tags,
Aggregator function, boolean rate) throws NoSuchUniqueName;
/**
* Downsamples the results by specifying a fixed interval between points.
* <p>
* Technically, downsampling means reducing the sampling interval. Here
* the idea is similar. Instead of returning every single data point that
* matched the query, we want one data point per fixed time interval. The
* way we get this one data point is by aggregating all the data points of
* that interval together using an {@link Aggregator}. This enables you
* to compute things like the 5-minute average or 10 minute 99th percentile.
* @param interval Number of seconds wanted between each data point.
* @param downsampler Aggregation function to use to group data points
* within an interval.
*/
void downsample(int interval, Aggregator downsampler);
/**
* Runs this query.
* @return The data points matched by this query.
* <p>
* Each element in the non-{@code null} but possibly empty array returned
* corresponds to one time series for which some data points have been
* matched by the query.
* @throws HBaseException if there was a problem communicating with HBase to
* perform the search.
*/
DataPoints[] run() throws HBaseException;
}