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 :

http://dive4elements.wald.intevation.org