Mercurial > dive4elements > river
diff flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java @ 503:bcc18293a547
Importer: Added unsharp lookup to avoid numerical problems.
flys-backend/trunk@1859 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 09 May 2011 10:04:23 +0000 |
parents | c6889097f81f |
children | cdb35d96ca09 |
line wrap: on
line diff
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java Mon May 09 00:38:13 2011 +0000 +++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java Mon May 09 10:04:23 2011 +0000 @@ -2,7 +2,7 @@ import java.util.Iterator; import java.util.Map; -import java.util.HashMap; +import java.util.TreeMap; import java.util.LinkedHashMap; import java.math.BigDecimal; @@ -27,8 +27,14 @@ { private static Logger log = Logger.getLogger(ImporterSession.class); - public static final int MAX_WST_CACHE_SIZE = 20; - public static final int MAX_AT_CACHE_SIZE = 20; + public static final int CACHE_SIZE = 25; + + public static class Cache<K, V> extends LinkedHashMap<K, V> { + @Override + protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { + return size() > CACHE_SIZE; + } + }; private static final ThreadLocal<ImporterSession> SESSION = new ThreadLocal<ImporterSession>() { @@ -40,12 +46,14 @@ protected Session databaseSession; - protected Map<Integer, Map<ValueKey, WstColumnValue>> wstColumnValues; + protected Cache<Integer, Map<ValueKey, WstColumnValue>> + wstColumnValues; - protected Map<Integer, Map<ValueKey, DischargeTableValue>> + protected Cache<Integer, Map<ValueKey, DischargeTableValue>> dischargeTableValues; - protected Map<IdValueKey, Range> ranges; + protected Cache<Integer, Map<ValueKey, Range>> + ranges; public static ImporterSession getInstance() { return SESSION.get(); @@ -58,24 +66,12 @@ //databaseSession.setFlushMode(FlushMode.MANUAL); wstColumnValues = - new LinkedHashMap<Integer, Map<ValueKey, WstColumnValue>>() { - @Override - protected boolean removeEldestEntry( - Map.Entry<Integer, Map<ValueKey, WstColumnValue>> eldest - ) { - return size() > MAX_WST_CACHE_SIZE; - } - }; + new Cache<Integer, Map<ValueKey, WstColumnValue>>(); dischargeTableValues = - new LinkedHashMap<Integer, Map<ValueKey, DischargeTableValue>>() { - @Override - protected boolean removeEldestEntry( - Map.Entry<Integer, Map<ValueKey, DischargeTableValue>> eldest - ) { - return size() > MAX_AT_CACHE_SIZE; - } - }; + new Cache<Integer, Map<ValueKey, DischargeTableValue>>(); + + ranges = new Cache<Integer, Map<ValueKey, Range>>(); } public Session getDatabaseSession() { @@ -92,7 +88,8 @@ Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c); if (map == null) { - map = new HashMap<ValueKey, WstColumnValue>(); + map = new TreeMap<ValueKey, WstColumnValue>( + ValueKey.EPSILON_COMPARATOR); wstColumnValues.put(c, map); Query query = databaseSession.createQuery( "from WstColumnValue where wstColumn.id=:cid"); @@ -131,14 +128,15 @@ dischargeTableValues.get(t); if (map == null) { - map = new HashMap<ValueKey, DischargeTableValue>(); + map = new TreeMap<ValueKey, DischargeTableValue>( + ValueKey.EPSILON_COMPARATOR); dischargeTableValues.put(t, map); Query query = databaseSession.createQuery( "from DischargeTableValue where dischargeTable.id=:tid"); query.setParameter("tid", t); for (Iterator iter = query.iterate(); iter.hasNext();) { DischargeTableValue dctv = (DischargeTableValue)iter.next(); - map.put(new ValueKey(q, w), dctv); + map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv); } } @@ -160,14 +158,26 @@ } public Range getRange(River river, BigDecimal a, BigDecimal b) { + Integer r = river.getId(); - if (ranges == null) { - loadRanges(); + Map<ValueKey, Range> map = ranges.get(r); + + if (map == null) { + map = new TreeMap<ValueKey, Range>( + ValueKey.EPSILON_COMPARATOR); + ranges.put(r, map); + Query query = databaseSession.createQuery( + "from Range where river.id=:rid"); + query.setParameter("rid", r); + for (Iterator iter = query.iterate(); iter.hasNext();) { + Range range = (Range)iter.next(); + map.put(new ValueKey(range.getA(), range.getB()), range); + } } - IdValueKey key = new IdValueKey(river.getId(), a, b); + ValueKey key = new ValueKey(a, b); - Range range = ranges.get(key); + Range range = map.get(key); if (range != null) { return range; @@ -177,22 +187,9 @@ databaseSession.save(range); - ranges.put(key, range); + map.put(key, range); return range; } - - protected void loadRanges() { - log.info("load ranges"); - ranges = new HashMap<IdValueKey, Range>(); - - Query query = databaseSession.createQuery("from Range"); - - for (Iterator iter = query.iterate(); iter.hasNext();) { - Range range = (Range)iter.next(); - ranges.put(new IdValueKey(range), range); - } - log.info(ranges.size() + " values loaded"); - } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :