Mercurial > dive4elements > river
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 : |