package org.myeslib.util.jdbi;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.myeslib.core.data.AggregateRootHistory;
import org.myeslib.core.data.UnitOfWork;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.HandleCallback;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import com.google.common.base.Function;
import com.google.inject.Inject;
@Slf4j
public class JdbiAggregateRootHistoryReaderDao implements AggregateRootHistoryReaderDao<UUID>{
@Inject
public JdbiAggregateRootHistoryReaderDao(ArTablesMetadata tables,
DBI dbi,
Function<String, UnitOfWork> fromStringFunction) {
this.tables = tables;
this.dbi = dbi;
this.fromStringFunction = fromStringFunction;
}
private final ArTablesMetadata tables;
private final DBI dbi;
private final Function<String, UnitOfWork> fromStringFunction;
/*
* (non-Javadoc)
* @see org.myeslib.jdbi.AggregateRootHistoryReader#get(java.lang.Object)
*/
@Override
public AggregateRootHistory get(final UUID id) {
final AggregateRootHistory arh = new AggregateRootHistory();
try {
log.debug("will load {} from {}", id.toString(), tables.getAggregateRootTable());
List<UowRecord> unitsOfWork = dbi.withHandle(new HandleCallback<List<UowRecord>>() {
String sql = String.format("select id, version, uow_data, seq_number from %s where id = :id order by version", tables.getUnitOfWorkTable());
public List<UowRecord> withHandle(Handle h) {
return h.createQuery(sql)
.bind("id", id.toString())
.map(new UowRecordMapper()).list();
}
}
);
if (unitsOfWork != null) {
log.debug("found {} units of work for id {} on {}", unitsOfWork.size(), id.toString(), tables.getUnitOfWorkTable());
for (UowRecord r : unitsOfWork){
log.debug("converting to uow from {}", r.uowData);
UnitOfWork uow = fromStringFunction.apply(r.uowData);
log.debug(uow.toString());
arh.add(uow);
arh.markAsPersisted(uow);
}
} else {
log.debug("found none unit of work for id {} on {}", id.toString(), tables.getUnitOfWorkTable());
}
} catch (Exception e) {
log.error("error when loading {} from table {}", id.toString(), tables.getUnitOfWorkTable());
e.printStackTrace();
} finally {
}
return arh;
}
@AllArgsConstructor
public static class UowRecord {
String id;
Integer version;
String uowData;
Long seqNumber;
}
public static class UowRecordMapper implements ResultSetMapper<UowRecord> {
@Override
public UowRecord map(int index, ResultSet r, StatementContext ctx)
throws SQLException {
String id = r.getString("id");
Integer version = r.getBigDecimal("version").intValue();
String uowData = new ClobToStringMapper("uow_data").map(index, r, ctx);
BigDecimal bdSeqNumber = r.getBigDecimal("seq_number");
Long seqNumber = bdSeqNumber == null ? null : bdSeqNumber.longValue();
return new UowRecord(id, version, uowData, seqNumber);
}
}
}