Mercurial > dive4elements > river
comparison backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoad.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 |
---|---|
6 * documentation coming with Dive4Elements River for details. | 6 * documentation coming with Dive4Elements River for details. |
7 */ | 7 */ |
8 | 8 |
9 package org.dive4elements.river.importer; | 9 package org.dive4elements.river.importer; |
10 | 10 |
11 import java.util.ArrayList; | |
11 import java.util.List; | 12 import java.util.List; |
12 import java.util.ArrayList; | |
13 | 13 |
14 import org.apache.log4j.Logger; | |
15 import org.dive4elements.river.importer.common.StoreMode; | |
14 import org.dive4elements.river.model.GrainFraction; | 16 import org.dive4elements.river.model.GrainFraction; |
15 import org.dive4elements.river.model.SedimentLoad; | 17 import org.dive4elements.river.model.SedimentLoad; |
16 import org.dive4elements.river.model.TimeInterval; | 18 import org.dive4elements.river.model.TimeInterval; |
17 import org.hibernate.Query; | 19 import org.hibernate.Query; |
18 import org.hibernate.Session; | 20 import org.hibernate.Session; |
19 | 21 |
20 public class ImportSedimentLoad | 22 public class ImportSedimentLoad |
21 { | 23 { |
24 private static Logger log = Logger.getLogger(ImportSedimentLoad.class); | |
25 | |
22 private SedimentLoad peer; | 26 private SedimentLoad peer; |
23 | 27 |
24 private ImportGrainFraction grainFraction; | 28 private ImportGrainFraction grainFraction; |
25 private ImportTimeInterval timeInterval; | 29 private ImportTimeInterval timeInterval; |
26 private ImportTimeInterval sqTimeInterval; | 30 private ImportTimeInterval sqTimeInterval; |
27 private String description; | 31 private String description; |
28 private Integer kind; | 32 private Integer kind; |
29 | 33 |
30 private List<ImportSedimentLoadValue> values; | 34 private final List<ImportSedimentLoadValue> values; |
35 | |
36 protected StoreMode storeMode; | |
31 | 37 |
32 public ImportSedimentLoad() { | 38 public ImportSedimentLoad() { |
33 this.values = new ArrayList<ImportSedimentLoadValue>(); | 39 this.values = new ArrayList<>(); |
34 } | 40 } |
35 | 41 |
36 public ImportSedimentLoad( | 42 public ImportSedimentLoad( |
37 ImportGrainFraction grainFraction, | 43 final ImportGrainFraction grainFraction, |
38 ImportTimeInterval timeInterval, | 44 final ImportTimeInterval timeInterval, |
39 ImportTimeInterval sqTimeInterval, | 45 final ImportTimeInterval sqTimeInterval, |
40 String description, | 46 final String description, |
41 Integer kind | 47 final Integer kind |
42 ) { | 48 ) { |
43 this.grainFraction = grainFraction; | 49 this.grainFraction = grainFraction; |
44 this.timeInterval = timeInterval; | 50 this.timeInterval = timeInterval; |
45 this.sqTimeInterval = sqTimeInterval; | 51 this.sqTimeInterval = sqTimeInterval; |
46 this.description = description; | 52 this.description = description; |
47 this.kind = kind; | 53 this.kind = kind; |
48 | 54 |
49 this.values = new ArrayList<ImportSedimentLoadValue>(); | 55 this.values = new ArrayList<>(); |
56 this.storeMode = StoreMode.NONE; | |
50 } | 57 } |
51 | 58 |
52 public void addValue(ImportSedimentLoadValue value) { | 59 public void addValue(final ImportSedimentLoadValue value) { |
53 values.add(value); | 60 this.values.add(value); |
54 } | 61 } |
55 | 62 |
56 public void storeDependencies() { | 63 public void storeDependencies() { |
57 grainFraction.getPeer(); | 64 log.info("store dependencies for '" + this.description + "'"); |
58 timeInterval.getPeer(); | 65 this.grainFraction.getPeer(); |
66 this.timeInterval.getPeer(); | |
59 | 67 |
60 if (sqTimeInterval != null) { | 68 if (this.sqTimeInterval != null) { |
61 sqTimeInterval.getPeer(); | 69 this.sqTimeInterval.getPeer(); |
62 } | 70 } |
63 | 71 |
64 getPeer(); | 72 getPeer(); |
65 | 73 |
66 for (ImportSedimentLoadValue value : values) { | 74 for (final ImportSedimentLoadValue value : this.values) { |
67 value.storeDependencies(peer); | 75 value.storeDependencies(this.peer, this.storeMode); |
68 } | 76 } |
69 | 77 log.info("Values processed: " + this.values.size()); |
70 } | 78 } |
71 | 79 |
72 public SedimentLoad getPeer() { | 80 public SedimentLoad getPeer() { |
73 | 81 |
74 if (peer == null) { | 82 if (this.peer == null) { |
75 Session session = ImporterSession.getInstance() | 83 final Session session = ImporterSession.getInstance() |
76 .getDatabaseSession(); | 84 .getDatabaseSession(); |
77 | 85 |
78 String sqtquery = sqTimeInterval == null | 86 final String sqtquery = this.sqTimeInterval == null |
79 ? "sq_time_interval_id is null" | 87 ? "sq_time_interval_id is null" |
80 : "sqTimeInterval = :sqTimeInterval"; | 88 : "sqTimeInterval = :sqTimeInterval"; |
81 Query query = session.createQuery( | 89 final Query query = session.createQuery( |
82 "from SedimentLoad where " + | 90 "from SedimentLoad where " + |
83 " grainFraction = :grainFraction and " + | 91 " grainFraction = :grainFraction and " + |
84 " timeInterval = :timeInterval and " + | 92 " timeInterval = :timeInterval and " + |
85 " description = :description and " + | 93 " description = :description and " + |
86 " kind = :kind and " + | 94 " kind = :kind and " + |
87 sqtquery); | 95 sqtquery); |
88 | 96 |
89 GrainFraction gf = grainFraction.getPeer(); | 97 final GrainFraction gf = this.grainFraction.getPeer(); |
90 TimeInterval ti = timeInterval.getPeer(); | 98 final TimeInterval ti = this.timeInterval.getPeer(); |
91 | 99 |
92 TimeInterval sqti = sqTimeInterval != null | 100 final TimeInterval sqti = this.sqTimeInterval != null |
93 ? sqTimeInterval.getPeer() | 101 ? this.sqTimeInterval.getPeer() |
94 : null; | 102 : null; |
95 | 103 |
96 query.setParameter("grainFraction", gf); | 104 query.setParameter("grainFraction", gf); |
97 query.setParameter("timeInterval", ti); | 105 query.setParameter("timeInterval", ti); |
98 | 106 |
99 if (sqti != null) { | 107 if (sqti != null) { |
100 query.setParameter("sqTimeInterval", sqti); | 108 query.setParameter("sqTimeInterval", sqti); |
101 } | 109 } |
102 query.setParameter("description", description); | 110 query.setParameter("description", this.description); |
103 query.setParameter("kind", kind); | 111 query.setParameter("kind", this.kind); |
104 | 112 |
105 List<SedimentLoad> loads = query.list(); | 113 final List<SedimentLoad> loads = query.list(); |
106 if (loads.isEmpty()) { | 114 if (loads.isEmpty()) { |
107 peer = new SedimentLoad(gf, ti, sqti, description, kind); | 115 this.peer = new SedimentLoad(gf, ti, sqti, this.description, this.kind); |
108 session.save(peer); | 116 session.save(this.peer); |
109 } | 117 this.storeMode = StoreMode.INSERT; |
110 else { | 118 } |
111 peer = loads.get(0); | 119 else { |
112 } | 120 this.peer = loads.get(0); |
121 this.storeMode = StoreMode.UPDATE; | |
122 } | |
113 } | 123 } |
114 | 124 |
115 return peer; | 125 return this.peer; |
116 } | 126 } |
117 } | 127 } |
118 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 128 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |