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 :

http://dive4elements.wald.intevation.org