Mercurial > dive4elements > river
comparison 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 |
comparison
equal
deleted
inserted
replaced
502:c6889097f81f | 503:bcc18293a547 |
---|---|
1 package de.intevation.flys.importer; | 1 package de.intevation.flys.importer; |
2 | 2 |
3 import java.util.Iterator; | 3 import java.util.Iterator; |
4 import java.util.Map; | 4 import java.util.Map; |
5 import java.util.HashMap; | 5 import java.util.TreeMap; |
6 import java.util.LinkedHashMap; | 6 import java.util.LinkedHashMap; |
7 | 7 |
8 import java.math.BigDecimal; | 8 import java.math.BigDecimal; |
9 | 9 |
10 import org.hibernate.SessionFactory; | 10 import org.hibernate.SessionFactory; |
25 | 25 |
26 public class ImporterSession | 26 public class ImporterSession |
27 { | 27 { |
28 private static Logger log = Logger.getLogger(ImporterSession.class); | 28 private static Logger log = Logger.getLogger(ImporterSession.class); |
29 | 29 |
30 public static final int MAX_WST_CACHE_SIZE = 20; | 30 public static final int CACHE_SIZE = 25; |
31 public static final int MAX_AT_CACHE_SIZE = 20; | 31 |
32 public static class Cache<K, V> extends LinkedHashMap<K, V> { | |
33 @Override | |
34 protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { | |
35 return size() > CACHE_SIZE; | |
36 } | |
37 }; | |
32 | 38 |
33 private static final ThreadLocal<ImporterSession> SESSION = | 39 private static final ThreadLocal<ImporterSession> SESSION = |
34 new ThreadLocal<ImporterSession>() { | 40 new ThreadLocal<ImporterSession>() { |
35 @Override | 41 @Override |
36 protected ImporterSession initialValue() { | 42 protected ImporterSession initialValue() { |
38 } | 44 } |
39 }; | 45 }; |
40 | 46 |
41 protected Session databaseSession; | 47 protected Session databaseSession; |
42 | 48 |
43 protected Map<Integer, Map<ValueKey, WstColumnValue>> wstColumnValues; | 49 protected Cache<Integer, Map<ValueKey, WstColumnValue>> |
50 wstColumnValues; | |
44 | 51 |
45 protected Map<Integer, Map<ValueKey, DischargeTableValue>> | 52 protected Cache<Integer, Map<ValueKey, DischargeTableValue>> |
46 dischargeTableValues; | 53 dischargeTableValues; |
47 | 54 |
48 protected Map<IdValueKey, Range> ranges; | 55 protected Cache<Integer, Map<ValueKey, Range>> |
56 ranges; | |
49 | 57 |
50 public static ImporterSession getInstance() { | 58 public static ImporterSession getInstance() { |
51 return SESSION.get(); | 59 return SESSION.get(); |
52 } | 60 } |
53 | 61 |
56 SessionFactoryProvider.createSessionFactory(); | 64 SessionFactoryProvider.createSessionFactory(); |
57 databaseSession = sessionFactory.openSession(); | 65 databaseSession = sessionFactory.openSession(); |
58 //databaseSession.setFlushMode(FlushMode.MANUAL); | 66 //databaseSession.setFlushMode(FlushMode.MANUAL); |
59 | 67 |
60 wstColumnValues = | 68 wstColumnValues = |
61 new LinkedHashMap<Integer, Map<ValueKey, WstColumnValue>>() { | 69 new Cache<Integer, Map<ValueKey, WstColumnValue>>(); |
62 @Override | |
63 protected boolean removeEldestEntry( | |
64 Map.Entry<Integer, Map<ValueKey, WstColumnValue>> eldest | |
65 ) { | |
66 return size() > MAX_WST_CACHE_SIZE; | |
67 } | |
68 }; | |
69 | 70 |
70 dischargeTableValues = | 71 dischargeTableValues = |
71 new LinkedHashMap<Integer, Map<ValueKey, DischargeTableValue>>() { | 72 new Cache<Integer, Map<ValueKey, DischargeTableValue>>(); |
72 @Override | 73 |
73 protected boolean removeEldestEntry( | 74 ranges = new Cache<Integer, Map<ValueKey, Range>>(); |
74 Map.Entry<Integer, Map<ValueKey, DischargeTableValue>> eldest | |
75 ) { | |
76 return size() > MAX_AT_CACHE_SIZE; | |
77 } | |
78 }; | |
79 } | 75 } |
80 | 76 |
81 public Session getDatabaseSession() { | 77 public Session getDatabaseSession() { |
82 return databaseSession; | 78 return databaseSession; |
83 } | 79 } |
90 Integer c = column.getId(); | 86 Integer c = column.getId(); |
91 | 87 |
92 Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c); | 88 Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c); |
93 | 89 |
94 if (map == null) { | 90 if (map == null) { |
95 map = new HashMap<ValueKey, WstColumnValue>(); | 91 map = new TreeMap<ValueKey, WstColumnValue>( |
92 ValueKey.EPSILON_COMPARATOR); | |
96 wstColumnValues.put(c, map); | 93 wstColumnValues.put(c, map); |
97 Query query = databaseSession.createQuery( | 94 Query query = databaseSession.createQuery( |
98 "from WstColumnValue where wstColumn.id=:cid"); | 95 "from WstColumnValue where wstColumn.id=:cid"); |
99 query.setParameter("cid", c); | 96 query.setParameter("cid", c); |
100 for (Iterator iter = query.iterate(); iter.hasNext();) { | 97 for (Iterator iter = query.iterate(); iter.hasNext();) { |
129 | 126 |
130 Map<ValueKey, DischargeTableValue> map = | 127 Map<ValueKey, DischargeTableValue> map = |
131 dischargeTableValues.get(t); | 128 dischargeTableValues.get(t); |
132 | 129 |
133 if (map == null) { | 130 if (map == null) { |
134 map = new HashMap<ValueKey, DischargeTableValue>(); | 131 map = new TreeMap<ValueKey, DischargeTableValue>( |
132 ValueKey.EPSILON_COMPARATOR); | |
135 dischargeTableValues.put(t, map); | 133 dischargeTableValues.put(t, map); |
136 Query query = databaseSession.createQuery( | 134 Query query = databaseSession.createQuery( |
137 "from DischargeTableValue where dischargeTable.id=:tid"); | 135 "from DischargeTableValue where dischargeTable.id=:tid"); |
138 query.setParameter("tid", t); | 136 query.setParameter("tid", t); |
139 for (Iterator iter = query.iterate(); iter.hasNext();) { | 137 for (Iterator iter = query.iterate(); iter.hasNext();) { |
140 DischargeTableValue dctv = (DischargeTableValue)iter.next(); | 138 DischargeTableValue dctv = (DischargeTableValue)iter.next(); |
141 map.put(new ValueKey(q, w), dctv); | 139 map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv); |
142 } | 140 } |
143 } | 141 } |
144 | 142 |
145 ValueKey key = new ValueKey(q, w); | 143 ValueKey key = new ValueKey(q, w); |
146 | 144 |
158 | 156 |
159 return dctv; | 157 return dctv; |
160 } | 158 } |
161 | 159 |
162 public Range getRange(River river, BigDecimal a, BigDecimal b) { | 160 public Range getRange(River river, BigDecimal a, BigDecimal b) { |
161 Integer r = river.getId(); | |
163 | 162 |
164 if (ranges == null) { | 163 Map<ValueKey, Range> map = ranges.get(r); |
165 loadRanges(); | 164 |
165 if (map == null) { | |
166 map = new TreeMap<ValueKey, Range>( | |
167 ValueKey.EPSILON_COMPARATOR); | |
168 ranges.put(r, map); | |
169 Query query = databaseSession.createQuery( | |
170 "from Range where river.id=:rid"); | |
171 query.setParameter("rid", r); | |
172 for (Iterator iter = query.iterate(); iter.hasNext();) { | |
173 Range range = (Range)iter.next(); | |
174 map.put(new ValueKey(range.getA(), range.getB()), range); | |
175 } | |
166 } | 176 } |
167 | 177 |
168 IdValueKey key = new IdValueKey(river.getId(), a, b); | 178 ValueKey key = new ValueKey(a, b); |
169 | 179 |
170 Range range = ranges.get(key); | 180 Range range = map.get(key); |
171 | 181 |
172 if (range != null) { | 182 if (range != null) { |
173 return range; | 183 return range; |
174 } | 184 } |
175 | 185 |
176 range = new Range(a, b, river); | 186 range = new Range(a, b, river); |
177 | 187 |
178 databaseSession.save(range); | 188 databaseSession.save(range); |
179 | 189 |
180 ranges.put(key, range); | 190 map.put(key, range); |
181 | 191 |
182 return range; | 192 return range; |
183 } | 193 } |
184 | |
185 protected void loadRanges() { | |
186 log.info("load ranges"); | |
187 ranges = new HashMap<IdValueKey, Range>(); | |
188 | |
189 Query query = databaseSession.createQuery("from Range"); | |
190 | |
191 for (Iterator iter = query.iterate(); iter.hasNext();) { | |
192 Range range = (Range)iter.next(); | |
193 ranges.put(new IdValueKey(range), range); | |
194 } | |
195 log.info(ranges.size() + " values loaded"); | |
196 } | |
197 } | 194 } |
198 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 195 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |