package org.rhq.server.metrics.aggregation;
import java.util.ArrayList;
import java.util.List;
import com.datastax.driver.core.ResultSet;
import com.google.common.util.concurrent.AsyncFunction;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.joda.time.DateTime;
import org.rhq.server.metrics.DateTimeService;
import org.rhq.server.metrics.MetricsDAO;
import org.rhq.server.metrics.StorageResultSetFuture;
import org.rhq.server.metrics.domain.AggregateNumericMetric;
import org.rhq.server.metrics.domain.IndexBucket;
/**
* This is a utility class of functions for persisting aggregate metrics.
*
* @author John Sanda
*/
class PersistFunctions {
private MetricsDAO dao;
private DateTimeService dateTimeService;
private AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>> persist1HourMetrics;
private AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>> persist6HourMetrics;
private AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>> persist24HourMetrics;
public PersistFunctions(MetricsDAO dao, DateTimeService dateTimeService) {
this.dao = dao;
this.dateTimeService = dateTimeService;
initFunctions();
}
private void initFunctions() {
persist1HourMetrics = new AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>>() {
@Override
public ListenableFuture<List<ResultSet>> apply(List<AggregateNumericMetric> metrics) throws Exception {
List<StorageResultSetFuture> futures = new ArrayList<StorageResultSetFuture>(metrics.size());
for (AggregateNumericMetric metric : metrics) {
DateTime timeSlice = dateTimeService.get6HourTimeSlice(metric.getTimestamp());
futures.add(dao.insert1HourData(metric));
futures.add(dao.updateIndex(IndexBucket.ONE_HOUR, timeSlice.getMillis(), metric.getScheduleId()));
}
return Futures.allAsList(futures);
}
};
persist6HourMetrics = new AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>>() {
@Override
public ListenableFuture<List<ResultSet>> apply(List<AggregateNumericMetric> metrics) throws Exception {
List<StorageResultSetFuture> futures = new ArrayList<StorageResultSetFuture>(metrics.size());
for (AggregateNumericMetric metric : metrics) {
DateTime timeSlice = dateTimeService.get24HourTimeSlice(metric.getTimestamp());
futures.add(dao.insert6HourData(metric));
futures.add(dao.updateIndex(IndexBucket.SIX_HOUR, timeSlice.getMillis(), metric.getScheduleId()));
}
return Futures.allAsList(futures);
}
};
persist24HourMetrics = new AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>>() {
@Override
public ListenableFuture<List<ResultSet>> apply(List<AggregateNumericMetric> metrics) throws Exception {
List<StorageResultSetFuture> futures = new ArrayList<StorageResultSetFuture>(metrics.size());
for (AggregateNumericMetric metric : metrics) {
futures.add(dao.insert24HourData(metric));
}
return Futures.allAsList(futures);
}
};
}
public AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>> persist1HourMetrics() {
return persist1HourMetrics;
}
public AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>> persist6HourMetrics() {
return persist6HourMetrics;
}
public AsyncFunction<List<AggregateNumericMetric>, List<ResultSet>> persist24HourMetrics() {
return persist24HourMetrics;
}
}