teichmann@5829: package org.dive4elements.river.importer; sascha@497: sascha@497: import java.util.Iterator; sascha@497: import java.util.Map; sascha@503: import java.util.TreeMap; sascha@497: sascha@497: import java.math.BigDecimal; sascha@497: sascha@497: import org.hibernate.SessionFactory; sascha@497: import org.hibernate.Session; sascha@497: import org.hibernate.Query; sascha@499: import org.hibernate.FlushMode; sascha@497: teichmann@5829: import org.dive4elements.river.backend.SessionFactoryProvider; sascha@497: teichmann@5829: import org.dive4elements.river.model.WstColumnValue; teichmann@5829: import org.dive4elements.river.model.WstColumn; teichmann@5829: import org.dive4elements.river.model.DischargeTableValue; teichmann@5829: import org.dive4elements.river.model.DischargeTable; teichmann@5829: import org.dive4elements.river.model.Range; teichmann@5829: import org.dive4elements.river.model.River; sascha@500: sascha@500: import org.apache.log4j.Logger; sascha@497: teichmann@5829: import org.dive4elements.artifacts.common.utils.LRUCache; sascha@1227: sascha@497: public class ImporterSession sascha@497: { sascha@500: private static Logger log = Logger.getLogger(ImporterSession.class); sascha@500: sascha@497: private static final ThreadLocal SESSION = sascha@497: new ThreadLocal() { sascha@497: @Override sascha@497: protected ImporterSession initialValue() { sascha@497: return new ImporterSession(); sascha@497: } sascha@497: }; sascha@497: sascha@497: protected Session databaseSession; sascha@497: sascha@1227: protected LRUCache> sascha@503: wstColumnValues; sascha@498: sascha@1227: protected LRUCache> sascha@501: dischargeTableValues; sascha@497: sascha@1227: protected LRUCache> sascha@503: ranges; sascha@500: sascha@497: public static ImporterSession getInstance() { sascha@497: return SESSION.get(); sascha@497: } sascha@497: sascha@497: public ImporterSession() { sascha@497: SessionFactory sessionFactory = sascha@497: SessionFactoryProvider.createSessionFactory(); sascha@497: databaseSession = sessionFactory.openSession(); sascha@502: //databaseSession.setFlushMode(FlushMode.MANUAL); sascha@501: sascha@501: wstColumnValues = sascha@1227: new LRUCache>(); sascha@501: sascha@501: dischargeTableValues = sascha@1227: new LRUCache>(); sascha@503: sascha@1227: ranges = new LRUCache>(); sascha@497: } sascha@497: sascha@497: public Session getDatabaseSession() { sascha@497: return databaseSession; sascha@497: } sascha@497: sascha@497: public WstColumnValue getWstColumnValue( sascha@497: WstColumn column, sascha@497: BigDecimal position, sascha@497: BigDecimal w sascha@497: ) { sascha@501: Integer c = column.getId(); sascha@501: sascha@501: Map map = wstColumnValues.get(c); sascha@501: sascha@501: if (map == null) { sascha@503: map = new TreeMap( sascha@503: ValueKey.EPSILON_COMPARATOR); sascha@501: wstColumnValues.put(c, map); sascha@501: Query query = databaseSession.createQuery( sascha@501: "from WstColumnValue where wstColumn.id=:cid"); sascha@501: query.setParameter("cid", c); sascha@501: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@501: WstColumnValue wcv = (WstColumnValue)iter.next(); sascha@501: map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv); sascha@501: } sascha@497: } sascha@497: sascha@501: ValueKey key = new ValueKey(position, w); sascha@497: sascha@501: WstColumnValue wcv = map.get(key); sascha@497: sascha@497: if (wcv != null) { sascha@497: return wcv; sascha@497: } sascha@497: sascha@497: wcv = new WstColumnValue(column, position, w); sascha@497: sascha@497: databaseSession.save(wcv); sascha@497: sascha@501: map.put(key, wcv); sascha@497: sascha@497: return wcv; sascha@497: } sascha@497: sascha@498: public DischargeTableValue getDischargeTableValue( sascha@498: DischargeTable table, sascha@498: BigDecimal q, sascha@498: BigDecimal w sascha@498: ) { sascha@501: Integer t = table.getId(); sascha@498: sascha@501: Map map = sascha@501: dischargeTableValues.get(t); sascha@498: sascha@501: if (map == null) { sascha@503: map = new TreeMap( sascha@503: ValueKey.EPSILON_COMPARATOR); sascha@501: dischargeTableValues.put(t, map); sascha@501: Query query = databaseSession.createQuery( sascha@501: "from DischargeTableValue where dischargeTable.id=:tid"); sascha@501: query.setParameter("tid", t); sascha@501: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@501: DischargeTableValue dctv = (DischargeTableValue)iter.next(); sascha@503: map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv); sascha@501: } sascha@498: } sascha@498: sascha@501: ValueKey key = new ValueKey(q, w); sascha@498: sascha@501: DischargeTableValue dctv = map.get(key); sascha@498: sascha@501: if (dctv != null) { sascha@501: return dctv; sascha@501: } sascha@498: sascha@501: dctv = new DischargeTableValue(table, q, w); sascha@501: sascha@501: databaseSession.save(dctv); sascha@501: sascha@501: map.put(key, dctv); sascha@501: sascha@501: return dctv; sascha@500: } sascha@500: sascha@500: public Range getRange(River river, BigDecimal a, BigDecimal b) { sascha@503: Integer r = river.getId(); sascha@500: sascha@503: Map map = ranges.get(r); sascha@503: sascha@503: if (map == null) { sascha@503: map = new TreeMap( sascha@503: ValueKey.EPSILON_COMPARATOR); sascha@503: ranges.put(r, map); sascha@503: Query query = databaseSession.createQuery( sascha@503: "from Range where river.id=:rid"); sascha@503: query.setParameter("rid", r); sascha@503: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@503: Range range = (Range)iter.next(); sascha@503: map.put(new ValueKey(range.getA(), range.getB()), range); sascha@503: } sascha@500: } sascha@500: sascha@503: ValueKey key = new ValueKey(a, b); sascha@500: sascha@503: Range range = map.get(key); sascha@500: sascha@502: if (range != null) { sascha@500: return range; sascha@500: } sascha@500: sascha@500: range = new Range(a, b, river); sascha@500: sascha@500: databaseSession.save(range); sascha@500: sascha@503: map.put(key, range); sascha@500: sascha@500: return range; sascha@500: } sascha@497: } sascha@497: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :