mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
153 lines
3.1 KiB
Java
153 lines
3.1 KiB
Java
package io.ebeaninternal.server.query;
|
|
|
|
import io.ebean.meta.MetaQueryMetric;
|
|
import io.ebean.meta.MetricType;
|
|
import io.ebean.metric.TimedMetric;
|
|
import io.ebean.metric.TimedMetricStats;
|
|
|
|
/**
|
|
* Statistics for a specific query plan that can accumulate.
|
|
*/
|
|
public final class CQueryPlanStats {
|
|
|
|
private final CQueryPlan queryPlan;
|
|
|
|
private final TimedMetric timedMetric;
|
|
|
|
private boolean collected;
|
|
|
|
private long lastQueryTime;
|
|
|
|
/**
|
|
* Construct for a given query plan.
|
|
*/
|
|
CQueryPlanStats(CQueryPlan queryPlan) {
|
|
this.queryPlan = queryPlan;
|
|
this.timedMetric = queryPlan.createTimedMetric();
|
|
}
|
|
|
|
/**
|
|
* Return true if there are no statistics collected since the last reset.
|
|
*/
|
|
public boolean isEmpty() {
|
|
return timedMetric.isEmpty();
|
|
}
|
|
|
|
/**
|
|
* Add a query execution to the statistics.
|
|
*/
|
|
public void add(long timeMicros) {
|
|
timedMetric.add(timeMicros);
|
|
// not safe but should be atomic
|
|
lastQueryTime = System.currentTimeMillis();
|
|
}
|
|
|
|
/**
|
|
* Reset the internal statistics counters.
|
|
*/
|
|
public void reset() {
|
|
timedMetric.reset();
|
|
}
|
|
|
|
/**
|
|
* Return the last time this query was executed.
|
|
*/
|
|
long getLastQueryTime() {
|
|
return lastQueryTime;
|
|
}
|
|
|
|
/**
|
|
* Return a Snapshot of the query execution statistics potentially resetting the internal counters.
|
|
*/
|
|
Snapshot getSnapshot(boolean reset) {
|
|
|
|
TimedMetricStats collect = timedMetric.collect(reset);
|
|
Snapshot snapshot = new Snapshot(collected, queryPlan, collect);
|
|
collected = true;
|
|
return snapshot;
|
|
}
|
|
|
|
/**
|
|
* A snapshot of the current statistics for a query plan.
|
|
*/
|
|
static class Snapshot implements MetaQueryMetric {
|
|
|
|
private final boolean collected;
|
|
private final CQueryPlan queryPlan;
|
|
private final TimedMetricStats metrics;
|
|
|
|
Snapshot(boolean collected, CQueryPlan queryPlan, TimedMetricStats metrics) {
|
|
this.collected = collected;
|
|
this.queryPlan = queryPlan;
|
|
this.metrics = metrics;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "label:" + getLabel() + " location:" + getLocation() + " metrics:" + metrics + " sql:" + getSql();
|
|
}
|
|
|
|
@Override
|
|
public MetricType getMetricType() {
|
|
return MetricType.ORM;
|
|
}
|
|
|
|
@Override
|
|
public Class<?> getType() {
|
|
return queryPlan.getBeanType();
|
|
}
|
|
|
|
@Override
|
|
public String getLabel() {
|
|
return queryPlan.getLabel();
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return queryPlan.getName();
|
|
}
|
|
|
|
@Override
|
|
public String getLocation() {
|
|
return queryPlan.getLocation();
|
|
}
|
|
|
|
@Override
|
|
public long getCount() {
|
|
return metrics.getCount();
|
|
}
|
|
|
|
@Override
|
|
public long getTotal() {
|
|
return metrics.getTotal();
|
|
}
|
|
|
|
@Override
|
|
public long getMax() {
|
|
return metrics.getMax();
|
|
}
|
|
|
|
@Override
|
|
public long getMean() {
|
|
return metrics.getMean();
|
|
}
|
|
|
|
@Override
|
|
public String getHash() {
|
|
return queryPlan.getHash();
|
|
}
|
|
|
|
@Override
|
|
public String getSql() {
|
|
return queryPlan.getSql();
|
|
}
|
|
|
|
@Override
|
|
public boolean initialCollection() {
|
|
return !collected;
|
|
}
|
|
|
|
}
|
|
|
|
}
|