package com.netflix.astyanax.cql; import java.net.InetAddress; import java.util.concurrent.TimeUnit; import com.datastax.driver.core.ExecutionInfo; import com.datastax.driver.core.QueryTrace; import com.datastax.driver.core.ResultSet; import com.netflix.astyanax.connectionpool.Host; import com.netflix.astyanax.connectionpool.OperationResult; /** * Simple impl of {@link OperationResult} that tracks some basic info for every operation execution, such as * 1. The host that was used for the operation * 2. The operation attempt count * 3. The encapsulated result * 4. The overall latency for the operation. * * @author poberai * * @param <R> */ public class CqlOperationResultImpl<R> implements OperationResult<R> { private Host host; private R result; private int attemptCount = 0; private long durationMicros = 0L; public CqlOperationResultImpl(ResultSet rs, R result) { this.host = parseHostInfo(rs); this.result = result; this.durationMicros = parseDuration(rs); } private Host parseHostInfo(ResultSet rs) { if (rs == null) { return null; } com.datastax.driver.core.Host fromHost = rs.getExecutionInfo().getQueriedHost(); InetAddress add = fromHost.getAddress(); Host toHost = new Host(add.getHostAddress(), -1); toHost.setRack(fromHost.getRack()); return toHost; } private long parseDuration(ResultSet rs) { if (rs != null) { ExecutionInfo info = rs.getExecutionInfo(); if (info !=null) { QueryTrace qt = info.getQueryTrace(); if (qt != null) { return qt.getDurationMicros(); } } } return 0L; } @Override public Host getHost() { return host; } @Override public R getResult() { return result; } @Override public long getLatency() { return durationMicros; } @Override public long getLatency(TimeUnit units) { return units.convert(durationMicros, TimeUnit.MICROSECONDS); } @Override public int getAttemptsCount() { return attemptCount; } @Override public void setAttemptsCount(int count) { attemptCount = count; } }