package semtex.archery.entities.data.dao;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import semtex.archery.entities.data.entities.Target;
import semtex.archery.entities.data.entities.TargetHit;
import semtex.archery.entities.data.entities.UserVisit;
import semtex.archery.entities.data.entities.Visit;
import com.j256.ormlite.dao.BaseDaoImpl;
import com.j256.ormlite.dao.GenericRawResults;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.j256.ormlite.support.ConnectionSource;
public class TargetHitDao extends BaseDaoImpl<TargetHit, UUID> implements ITargetHitDao {
public TargetHitDao(final ConnectionSource connectionSource) throws SQLException {
super(connectionSource, TargetHit.class);
}
public Integer getLatestTargetNumber(final Visit v) throws SQLException {
final GenericRawResults<String[]> results =
queryRaw("SELECT MAX(target.target_number) FROM visit " + "LEFT JOIN user_visit uv ON uv.visit_id = visit.id "
+ "LEFT JOIN target_hit th ON th.user = uv.id " + "LEFT JOIN target ON target.id = th.target "
+ "WHERE visit.id = \"" + v.getId() + "\"");
try {
for (final String[] result : results) {
if (result[0] != null) {
return Integer.parseInt(result[0]);
}
}
} finally {
results.close();
}
return 1;
}
public Integer deleteTargetHitsFromUserVisit(final UserVisit uv) throws SQLException {
final DeleteBuilder<TargetHit, UUID> deleteBuilder = deleteBuilder();
deleteBuilder.where().eq(TargetHit.USER_VISIT, uv.getId());
return delete(deleteBuilder.prepare());
}
public TargetHit findTargetHitByUserVisitAndTarget(final UserVisit userVisit, final Target target)
throws SQLException {
final QueryBuilder<TargetHit, UUID> qb = queryBuilder();
final Where<TargetHit, UUID> where = qb.where();
where.and(where.eq(TargetHit.USER_VISIT, userVisit), where.eq(TargetHit.TARGET, target));
qb.setWhere(where);
return qb.queryForFirst();
}
public Integer calculatePointsByUser(final UserVisit userVisit) throws SQLException {
final QueryBuilder<TargetHit, UUID> queryBuilder = queryBuilder();
queryBuilder.selectRaw("SUM(points)");
queryBuilder.where().eq(TargetHit.USER_VISIT, userVisit);
final GenericRawResults<Object[]> results =
queryRaw(queryBuilder.prepareStatementString(), new DataType[] { DataType.INTEGER });
return (Integer)results.getFirstResult()[0];
}
public List<TargetHit> findTargetHitsByVisitAndTarget(final Visit currentVisit, final Target target)
throws SQLException {
final QueryBuilder<TargetHit, UUID> qb = queryBuilder();
final Where<TargetHit, UUID> where = qb.where();
where.and(where.eq(TargetHit.TARGET, target), where.in(TargetHit.USER_VISIT, currentVisit.getUserVisit()));
qb.setWhere(where);
return qb.query();
}
}