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 :

http://dive4elements.wald.intevation.org