Mercurial > dive4elements > river
comparison flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java @ 500:d50cd3a632e0
Importer: Use BigDecimals in hashing to prevent numerical problems. Cache ranges globally, too.
flys-backend/trunk@1854 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 08 May 2011 22:41:07 +0000 |
parents | cce054f27dac |
children | 04d449f7f0c9 |
comparison
equal
deleted
inserted
replaced
499:cce054f27dac | 500:d50cd3a632e0 |
---|---|
15 | 15 |
16 import de.intevation.flys.model.WstColumnValue; | 16 import de.intevation.flys.model.WstColumnValue; |
17 import de.intevation.flys.model.WstColumn; | 17 import de.intevation.flys.model.WstColumn; |
18 import de.intevation.flys.model.DischargeTableValue; | 18 import de.intevation.flys.model.DischargeTableValue; |
19 import de.intevation.flys.model.DischargeTable; | 19 import de.intevation.flys.model.DischargeTable; |
20 import de.intevation.flys.model.Range; | |
21 import de.intevation.flys.model.River; | |
22 | |
23 import org.apache.log4j.Logger; | |
20 | 24 |
21 public class ImporterSession | 25 public class ImporterSession |
22 { | 26 { |
27 private static Logger log = Logger.getLogger(ImporterSession.class); | |
28 | |
23 private static final ThreadLocal<ImporterSession> SESSION = | 29 private static final ThreadLocal<ImporterSession> SESSION = |
24 new ThreadLocal<ImporterSession>() { | 30 new ThreadLocal<ImporterSession>() { |
25 @Override | 31 @Override |
26 protected ImporterSession initialValue() { | 32 protected ImporterSession initialValue() { |
27 return new ImporterSession(); | 33 return new ImporterSession(); |
31 protected Session databaseSession; | 37 protected Session databaseSession; |
32 | 38 |
33 protected Map<IdValueKey, WstColumnValue> wstColumnValues; | 39 protected Map<IdValueKey, WstColumnValue> wstColumnValues; |
34 | 40 |
35 protected Map<IdValueKey, DischargeTableValue> dischargeTableValues; | 41 protected Map<IdValueKey, DischargeTableValue> dischargeTableValues; |
42 | |
43 protected Map<IdValueKey, Range> ranges; | |
36 | 44 |
37 public static ImporterSession getInstance() { | 45 public static ImporterSession getInstance() { |
38 return SESSION.get(); | 46 return SESSION.get(); |
39 } | 47 } |
40 | 48 |
56 ) { | 64 ) { |
57 if (wstColumnValues == null) { | 65 if (wstColumnValues == null) { |
58 loadWstColumnValues(); | 66 loadWstColumnValues(); |
59 } | 67 } |
60 | 68 |
61 IdValueKey key = new IdValueKey( | 69 IdValueKey key = new IdValueKey(column.getId(), position, w); |
62 column.getId(), | |
63 position.doubleValue(), | |
64 w.doubleValue()); | |
65 | 70 |
66 WstColumnValue wcv = wstColumnValues.get(key); | 71 WstColumnValue wcv = wstColumnValues.get(key); |
67 | 72 |
68 if (wcv != null) { | 73 if (wcv != null) { |
69 return wcv; | 74 return wcv; |
77 | 82 |
78 return wcv; | 83 return wcv; |
79 } | 84 } |
80 | 85 |
81 protected void loadWstColumnValues() { | 86 protected void loadWstColumnValues() { |
87 log.info("load wst column values"); | |
82 wstColumnValues = new HashMap<IdValueKey, WstColumnValue>(); | 88 wstColumnValues = new HashMap<IdValueKey, WstColumnValue>(); |
83 | 89 |
84 Query query = databaseSession.createQuery("from WstColumnValue"); | 90 Query query = databaseSession.createQuery("from WstColumnValue"); |
85 | 91 |
86 for (Iterator iter = query.iterate(); iter.hasNext();) { | 92 for (Iterator iter = query.iterate(); iter.hasNext();) { |
87 WstColumnValue wcv = (WstColumnValue)iter.next(); | 93 WstColumnValue wcv = (WstColumnValue)iter.next(); |
88 wstColumnValues.put(new IdValueKey(wcv), wcv); | 94 wstColumnValues.put(new IdValueKey(wcv), wcv); |
89 } | 95 } |
96 log.info(wstColumnValues.size() + " values loaded"); | |
90 } | 97 } |
91 | 98 |
92 public DischargeTableValue getDischargeTableValue( | 99 public DischargeTableValue getDischargeTableValue( |
93 DischargeTable table, | 100 DischargeTable table, |
94 BigDecimal q, | 101 BigDecimal q, |
96 ) { | 103 ) { |
97 if (dischargeTableValues == null) { | 104 if (dischargeTableValues == null) { |
98 loadDischargeTableValues(); | 105 loadDischargeTableValues(); |
99 } | 106 } |
100 | 107 |
101 IdValueKey key = new IdValueKey( | 108 IdValueKey key = new IdValueKey(table.getId(), q, w); |
102 table.getId(), | |
103 q.doubleValue(), | |
104 w.doubleValue()); | |
105 | 109 |
106 DischargeTableValue dtv = dischargeTableValues.get(key); | 110 DischargeTableValue dtv = dischargeTableValues.get(key); |
107 | 111 |
108 if (dtv != null) { | 112 if (dtv != null) { |
109 return dtv; | 113 return dtv; |
117 | 121 |
118 return dtv; | 122 return dtv; |
119 } | 123 } |
120 | 124 |
121 protected void loadDischargeTableValues() { | 125 protected void loadDischargeTableValues() { |
126 log.info("load discharge table values"); | |
127 | |
122 dischargeTableValues = new HashMap<IdValueKey, DischargeTableValue>(); | 128 dischargeTableValues = new HashMap<IdValueKey, DischargeTableValue>(); |
123 | 129 |
124 Query query = databaseSession.createQuery("from DischargeTableValue"); | 130 Query query = databaseSession.createQuery("from DischargeTableValue"); |
125 | 131 |
126 for (Iterator iter = query.iterate(); iter.hasNext();) { | 132 for (Iterator iter = query.iterate(); iter.hasNext();) { |
127 DischargeTableValue dtv = (DischargeTableValue)iter.next(); | 133 DischargeTableValue dtv = (DischargeTableValue)iter.next(); |
128 dischargeTableValues.put(new IdValueKey(dtv), dtv); | 134 dischargeTableValues.put(new IdValueKey(dtv), dtv); |
129 } | 135 } |
136 log.info(dischargeTableValues.size() + " values loaded"); | |
137 } | |
138 | |
139 public Range getRange(River river, BigDecimal a, BigDecimal b) { | |
140 | |
141 if (ranges == null) { | |
142 loadRanges(); | |
143 } | |
144 | |
145 IdValueKey key = new IdValueKey(river.getId(), a, b); | |
146 | |
147 Range range = ranges.get(key); | |
148 | |
149 if (ranges != null) { | |
150 return range; | |
151 } | |
152 | |
153 range = new Range(a, b, river); | |
154 | |
155 databaseSession.save(range); | |
156 | |
157 ranges.put(key, range); | |
158 | |
159 return range; | |
160 } | |
161 | |
162 protected void loadRanges() { | |
163 log.info("load ranges"); | |
164 ranges = new HashMap<IdValueKey, Range>(); | |
165 | |
166 Query query = databaseSession.createQuery("from Range"); | |
167 | |
168 for (Iterator iter = query.iterate(); iter.hasNext();) { | |
169 Range range = (Range)iter.next(); | |
170 ranges.put(new IdValueKey(range), range); | |
171 } | |
172 log.info(ranges.size() + " values loaded"); | |
130 } | 173 } |
131 } | 174 } |
132 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 175 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |