comparison backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLS.java @ 8986:392bbcd8a88b

Database inserts accelerated by suppressing unnecessary database queries for new data series
author mschaefer
date Sun, 08 Apr 2018 18:07:06 +0200
parents 5e38e2924c07
children
comparison
equal deleted inserted replaced
8985:27851cfda84a 8986:392bbcd8a88b
10 10
11 import java.util.ArrayList; 11 import java.util.ArrayList;
12 import java.util.List; 12 import java.util.List;
13 13
14 import org.apache.log4j.Logger; 14 import org.apache.log4j.Logger;
15 15 import org.dive4elements.river.importer.common.StoreMode;
16 import org.hibernate.Session;
17 import org.hibernate.Query;
18
19 import org.dive4elements.river.model.GrainFraction; 16 import org.dive4elements.river.model.GrainFraction;
20 import org.dive4elements.river.model.River; 17 import org.dive4elements.river.model.River;
21 import org.dive4elements.river.model.SedimentLoadLS; 18 import org.dive4elements.river.model.SedimentLoadLS;
22 import org.dive4elements.river.model.TimeInterval; 19 import org.dive4elements.river.model.TimeInterval;
23 import org.dive4elements.river.model.Unit; 20 import org.dive4elements.river.model.Unit;
21 import org.hibernate.Query;
22 import org.hibernate.Session;
24 23
25 24
26 public class ImportSedimentLoadLS { 25 public class ImportSedimentLoadLS {
27 26
28 private static Logger log = Logger.getLogger(ImportSedimentLoadLS.class); 27 private static Logger log = Logger.getLogger(ImportSedimentLoadLS.class);
33 32
34 private ImportTimeInterval timeInterval; 33 private ImportTimeInterval timeInterval;
35 34
36 private ImportTimeInterval sqTimeInterval; 35 private ImportTimeInterval sqTimeInterval;
37 36
38 private String description; 37 private final String description;
39 38
40 private Integer kind; 39 private Integer kind;
41 40
42 private List<ImportSedimentLoadLSValue> values; 41 private final List<ImportSedimentLoadLSValue> values;
42
43 protected StoreMode storeMode;
43 44
44 private SedimentLoadLS peer; 45 private SedimentLoadLS peer;
45 46
46 public ImportSedimentLoadLS(String description) { 47 public ImportSedimentLoadLS(final String description) {
47 this.values = new ArrayList<ImportSedimentLoadLSValue>(); 48 this.values = new ArrayList<>();
48 this.description = description; 49 this.description = description;
50 this.storeMode = StoreMode.NONE;
49 } 51 }
50 52
51 public void setTimeInterval(ImportTimeInterval timeInterval) { 53 public void setTimeInterval(final ImportTimeInterval timeInterval) {
52 this.timeInterval = timeInterval; 54 this.timeInterval = timeInterval;
53 } 55 }
54 56
55 public void setSQTimeInterval(ImportTimeInterval sqTimeInterval) { 57 public void setSQTimeInterval(final ImportTimeInterval sqTimeInterval) {
56 this.sqTimeInterval = sqTimeInterval; 58 this.sqTimeInterval = sqTimeInterval;
57 } 59 }
58 60
59 public void setUnit(ImportUnit unit) { 61 public void setUnit(final ImportUnit unit) {
60 this.unit = unit; 62 this.unit = unit;
61 } 63 }
62 64
63 public void setGrainFraction(ImportGrainFraction grainFraction) { 65 public void setGrainFraction(final ImportGrainFraction grainFraction) {
64 this.grainFraction = grainFraction; 66 this.grainFraction = grainFraction;
65 } 67 }
66 68
67 public void setKind(Integer kind) { 69 public void setKind(final Integer kind) {
68 this.kind = kind; 70 this.kind = kind;
69 } 71 }
70 72
71 public void addValue(ImportSedimentLoadLSValue value) { 73 public void addValue(final ImportSedimentLoadLSValue value) {
72 this.values.add(value); 74 this.values.add(value);
73 } 75 }
74 76
75 public void storeDependencies(River river) { 77 public void storeDependencies(final River river) {
76 log.debug("store dependencies"); 78 log.info("store dependencies for '" + this.description + "'");
77 79
78 SedimentLoadLS peer = getPeer(river); 80 final SedimentLoadLS peer = getPeer(river);
79 81
80 if (peer != null) { 82 if (peer != null) {
81 int i = 0; 83 int i = 0;
82 84
83 for (ImportSedimentLoadLSValue value : values) { 85 for (final ImportSedimentLoadLSValue value : this.values) {
84 value.storeDependencies(peer); 86 value.storeDependencies(peer, this.storeMode);
85 i++; 87 i++;
86 } 88 }
87 89
88 log.info("stored " + i + " sediment load values."); 90 log.info("stored " + i + " sediment load values.");
89 } 91 }
90 } 92 }
91 93
92 public SedimentLoadLS getPeer(River river) { 94 public SedimentLoadLS getPeer(final River river) {
93 log.debug("get peer"); 95 log.debug("get peer");
94 96
95 GrainFraction gf = grainFraction != null ? grainFraction.getPeer() 97 final GrainFraction gf = this.grainFraction != null ? this.grainFraction.getPeer()
96 : null; 98 : null;
97 99
98 Unit u = unit != null ? unit.getPeer() : null; 100 final Unit u = this.unit != null ? this.unit.getPeer() : null;
99 101
100 TimeInterval ti = timeInterval != null ? timeInterval.getPeer() : null; 102 final TimeInterval ti = (this.timeInterval != null) ? this.timeInterval.getPeer() : null;
101 TimeInterval sqti = sqTimeInterval != null 103 final TimeInterval sqti = (this.sqTimeInterval != null) ? this.sqTimeInterval.getPeer() : null;
102 ? sqTimeInterval.getPeer()
103 : null;
104 104
105 if (ti == null || u == null) { 105 if (ti == null || u == null) {
106 log.warn( 106 log.warn(
107 "Skip invalid SedimentLoadLS: time interval or unit null!"); 107 "Skip invalid SedimentLoadLS: time interval or unit null!");
108 return null; 108 return null;
109 } 109 }
110 110
111 if (peer == null) { 111 if (this.peer == null) {
112 Session session = ImporterSession.getInstance() 112 final Session session = ImporterSession.getInstance()
113 .getDatabaseSession(); 113 .getDatabaseSession();
114 114
115 String sqtquery = sqTimeInterval == null ? 115 final String sqtquery = this.sqTimeInterval == null ?
116 "sq_time_interval_id is null" : 116 "sq_time_interval_id is null" :
117 "sqTimeInterval = :sqTimeInterval"; 117 "sqTimeInterval = :sqTimeInterval";
118 Query query = session.createQuery("from SedimentLoadLS where " 118 final Query query = session.createQuery("from SedimentLoadLS where "
119 + " river=:river and " 119 + " river=:river and "
120 + " grainFraction=:grainFraction and " 120 + " grainFraction=:grainFraction and "
121 + " unit=:unit and " 121 + " unit=:unit and "
122 + " timeInterval=:timeInterval and " 122 + " timeInterval=:timeInterval and "
123 + " description=:description and " 123 + " description=:description and "
124 + " kind = :kind and " + 124 + " kind = :kind and " +
125 sqtquery); 125 sqtquery);
126 126
127 query.setParameter("river", river); 127 query.setParameter("river", river);
128 query.setParameter("grainFraction", gf); 128 query.setParameter("grainFraction", gf);
129 query.setParameter("unit", u); 129 query.setParameter("unit", u);
130 query.setParameter("timeInterval", ti); 130 query.setParameter("timeInterval", ti);
131 if (sqti != null) { 131 if (sqti != null) {
132 query.setParameter("sqTimeInterval", sqti); 132 query.setParameter("sqTimeInterval", sqti);
133 } 133 }
134 query.setParameter("description", description); 134 query.setParameter("description", this.description);
135 query.setParameter("kind", kind); 135 query.setParameter("kind", this.kind);
136 136
137 List<SedimentLoadLS> loads = query.list(); 137 final List<SedimentLoadLS> loads = query.list();
138 if (loads.isEmpty()) { 138 if (loads.isEmpty()) {
139 log.debug("create new SedimentLoadLS"); 139 log.debug("create new SedimentLoadLS");
140 140
141 peer = new SedimentLoadLS(river, u, ti, sqti, gf, description); 141 this.peer = new SedimentLoadLS(river, u, ti, sqti, gf, this.description);
142 peer.setKind(this.kind); 142 this.peer.setKind(this.kind);
143 session.save(peer); 143 session.save(this.peer);
144 this.storeMode = StoreMode.INSERT;
144 } 145 }
145 else { 146 else {
146 peer = loads.get(0); 147 this.peer = loads.get(0);
148 this.storeMode = StoreMode.UPDATE;
147 } 149 }
148 } 150 }
149 151
150 return peer; 152 return this.peer;
151 } 153 }
152 } 154 }
153 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 155 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org