package edu.sc.seis.sod.hibernate;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import edu.iris.Fissures.model.MicroSecondDate;
import edu.sc.seis.fissuresUtil.cache.CacheEvent;
import edu.sc.seis.fissuresUtil.database.NotFound;
import edu.sc.seis.fissuresUtil.flow.querier.EventFinderQuery;
import edu.sc.seis.fissuresUtil.hibernate.EventDB;
import edu.sc.seis.fissuresUtil.time.MicroSecondTimeRange;
import edu.sc.seis.sod.Stage;
import edu.sc.seis.sod.Standing;
import edu.sc.seis.sod.Status;
public class StatefulEventDB {
protected StatefulEventDB() {
trans = new EventToStatefulDBTranslater();
}
public long put(StatefulEvent event) {
return trans.put(event);
}
public List<StatefulEvent> getAll() {
ArrayList<StatefulEvent> out = new ArrayList<StatefulEvent>();
List<CacheEvent> l = trans.getAll();
for(CacheEvent e : l) {
out.add((StatefulEvent)e);
}
return out;
}
public List<StatefulEvent> getAll(Status status) {
String q = "from "+StatefulEvent.class.getName()+" e where e.status.stageInt = "+status.getStageInt()+" and e.status.standingInt = "+status.getStandingInt();
Query query = trans.getSession().createQuery(q);
return query.list();
}
public int getNumEventsOfStatus(Standing standing) {
String q = "select count(*) from " + StatefulEvent.class.getName()
+ " e where e.status.standingInt = "+standing.getVal();
Query query = getSession().createQuery(q);
query.setMaxResults(1);
List result = query.list();
if(result.size() > 0) {
return ((Number)result.get(0)).intValue();
}
return 0;
}
public StatefulEvent getEvent(int dbid) throws NotFound {
return (StatefulEvent)trans.getEvent(dbid);
}
public List<StatefulEvent> getEventInTimeRange(MicroSecondTimeRange range) {
return getEventInTimeRange(range, Status.getFromShort((short)2310));
}
public List<StatefulEvent> getEventInTimeRange(MicroSecondTimeRange range, Status status) {
String q = "from "+StatefulEvent.class.getName()+" e where ";
if (status != null) { q += " e.status.stageInt = "+status.getStageInt()+" and e.status.standingInt = "+status.getStandingInt()+" AND ";}
q += " e.preferred.originTime.time between :minTime AND :maxTime ";
Query query = trans.getSession().createQuery(q);
query.setTimestamp("minTime", range.getBeginTime().getTimestamp());
query.setTimestamp("maxTime", range.getEndTime().getTimestamp());
return query.list();
}
public List<StatefulEvent> getEventInTimeRangeRegardlessOfStatus(MicroSecondTimeRange range) {
return getEventInTimeRange(range, (Status)null);
}
public List<StatefulEvent> query(EventFinderQuery q) {
List<CacheEvent> ans = trans.query(q);
List<StatefulEvent> out = new ArrayList<StatefulEvent>(ans.size());
for(CacheEvent e : ans) {
if (((StatefulEvent)e).getStatus().equals(success)) {
out.add((StatefulEvent)e);
}
}
return out;
}
public StatefulEvent getLastEvent() throws NotFound {
return (StatefulEvent)trans.getLastEvent();
}
public StatefulEvent[] getEventsByTimeAndDepthRanges(MicroSecondDate minTime,
MicroSecondDate maxTime,
double minDepth,
double maxDepth) {
CacheEvent[] ans = trans.getEventsByTimeAndDepthRanges(minTime, maxTime, minDepth, maxDepth);
StatefulEvent[] out = new StatefulEvent[ans.length];
for(int i = 0; i < out.length; i++) {
out[i] = (StatefulEvent)ans[i];
}
return out;
}
public int getNumWaiting() {
Status status = Status.get(Stage.EVENT_CHANNEL_POPULATION, Standing.INIT);
String q = "select count(*) from "
+ StatefulEvent.class.getName()
+ " e where e.status.stageInt = "+status.getStageInt()
+ " and e.status.standingInt = "+status.getStandingInt();
Session session = trans.getSession();
Query query = session.createQuery(q);
List result = query.list();
if(result.size() > 0) {
return ((Long)result.get(0)).intValue();
}
return 0;
}
/** next successful event to process. Returns null if no more events. */
public StatefulEvent getNext(Standing standing) {
Status status = Status.get(Stage.EVENT_CHANNEL_POPULATION, standing);
String q = "from "
+ StatefulEvent.class.getName()
+ " e where e.status.stageInt = "+status.getStageInt()+" and e.status.standingInt = "+status.getStandingInt();
Session session = trans.getSession();
Query query = session.createQuery(q);
List result = query.list();
if(result.size() > 0) {
return (StatefulEvent)result.get(0);
}
return null;
}
public StatefulEvent getIdenticalEvent(CacheEvent e) {
return (StatefulEvent)trans.getIdenticalEvent(e);
}
public List get(String statii, String order, boolean ascending) {
Query q = trans.getSession().createQuery("from "+StatefulEvent.class.getName()+" e "
+" where e.status in :statii order by :order :direction");
q.setString("statii", statii);
q.setString("order", order);
q.setString("direction", ascending ? "asc" : "desc");
return q.list();
}
public void flush() {
trans.flush();
}
public void commit() {
trans.commit();
}
public void rollback() {
trans.rollback();
}
public Session getSession() {
return trans.getSession();
}
EventToStatefulDBTranslater trans;
public void restartCompletedEvents() {
Status success = Status.get(Stage.EVENT_CHANNEL_POPULATION,
Standing.SUCCESS);
Status inProg = Status.get(Stage.EVENT_CHANNEL_POPULATION,
Standing.IN_PROG);
String q = "update " + StatefulEvent.class.getName()
+ " e set e.status.standingInt = :inProg where e.status.stageInt = "+success.getStageInt()
+" and e.status.standingInt = "+success.getStandingInt();
Query query = trans.getSession().createQuery(q);
query.setShort("inProg", inProg.getAsShort());
int updates = query.executeUpdate();
logger.info("Reopen " + updates + " events");
}
public static final String TIME_ORDER = "preferred.originTime.time";
private static StatefulEventDB singleton;
public static StatefulEventDB getSingleton() {
if (singleton == null) {
singleton = new StatefulEventDB();
}
return singleton;
}
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StatefulEventDB.class);
public CacheEvent[] getByName(String name) {
String q = baseSuccessfulQuery+" AND " + "e.attr.name = :name";
Query query = trans.getSession().createQuery(q);
query.setString("name", name);
List result = query.list();
CacheEvent[] out = (CacheEvent[]) result.toArray(new CacheEvent[0]);
return out;
}
private static Status success = Status.get(Stage.EVENT_CHANNEL_POPULATION,
Standing.SUCCESS);
private static String baseSuccessfulQuery = "from "+StatefulEvent.class.getName()+" e where " +
" ( e.status.stageInt = "+success.getStageInt()+" and e.status.standingInt = "+success.getStandingInt()+" ) ";
public String[] getCatalogs() {
return trans.getCatalogs();
}
public String[] getContributors() {
return trans.getContributors();
}
public String[] getCatalogsFor(String contributor) {
return trans.getCatalogsFor(contributor);
}
}
class EventToStatefulDBTranslater extends EventDB {
protected Class getEventClass() {
return StatefulEvent.class;
}
}