comparison backend/src/main/java/org/dive4elements/river/importer/ImportPorosity.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 d9d2bd78eff6
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 import org.dive4elements.river.importer.common.StoreMode;
16 import org.dive4elements.river.model.Porosity;
17 import org.dive4elements.river.model.River;
15 import org.hibernate.Query; 18 import org.hibernate.Query;
16 import org.hibernate.Session; 19 import org.hibernate.Session;
17
18 import org.dive4elements.river.model.River;
19 import org.dive4elements.river.model.Porosity;
20 20
21 21
22 public class ImportPorosity { 22 public class ImportPorosity {
23 23
24 private static Logger log = Logger.getLogger(ImportPorosity.class); 24 private static Logger log = Logger.getLogger(ImportPorosity.class);
31 31
32 protected ImportTimeInterval timeInterval; 32 protected ImportTimeInterval timeInterval;
33 33
34 protected List<ImportPorosityValue> values; 34 protected List<ImportPorosityValue> values;
35 35
36 public ImportPorosity(String description) { 36 protected StoreMode storeMode;
37
38 public ImportPorosity(final String description) {
37 this.description = description; 39 this.description = description;
38 this.values = new ArrayList<ImportPorosityValue>(); 40 this.values = new ArrayList<>();
41 this.storeMode = StoreMode.NONE;
39 } 42 }
40 43
41 public String getDescription() { 44 public String getDescription() {
42 return description; 45 return this.description;
43 } 46 }
44 47
45 public void setDepth(ImportDepth depth) { 48 public void setDepth(final ImportDepth depth) {
46 this.depth = depth; 49 this.depth = depth;
47 } 50 }
48 51
49 public void setTimeInterval(ImportTimeInterval importTimeInterval) { 52 public void setTimeInterval(final ImportTimeInterval importTimeInterval) {
50 this.timeInterval = importTimeInterval; 53 this.timeInterval = importTimeInterval;
51 } 54 }
52 55
53 public void addValue(ImportPorosityValue value) { 56 public void addValue(final ImportPorosityValue value) {
54 values.add(value); 57 this.values.add(value);
55 } 58 }
56 59
57 public void storeDependencies(River river) { 60 public void storeDependencies(final River river) {
58 log.info("store dependencies"); 61 log.info("store dependencies for '" + getDescription() + "'");
59 62
60 if (depth != null) { 63 if (this.depth != null) {
61 depth.storeDependencies(); 64 this.depth.storeDependencies();
62 } 65 }
63 66
64 Porosity peer = getPeer(river); 67 final Porosity peer = getPeer(river);
65 68
66 if (peer != null) { 69 if (peer != null) {
67 log.info("store porosity values."); 70 // log.info("store porosity values.");
68 for (ImportPorosityValue value : values) { 71 for (final ImportPorosityValue value : this.values) {
69 value.storeDependencies(peer); 72 value.storeDependencies(peer, this.storeMode);
70 } 73 }
74 log.info("Porosity values processed: " + this.values.size());
71 } 75 }
72 } 76 }
73 77
74 public Porosity getPeer(River river) { 78 public Porosity getPeer(final River river) {
75 log.info("get peer"); 79 // log.info("get peer");
76 80
77 if (depth == null) { 81 if (this.depth == null) {
78 log.warn("cannot store porosity '" + description 82 log.warn("cannot store porosity '" + this.description
79 + "': no depth"); 83 + "': no depth");
80 return null; 84 return null;
81 } 85 }
82 86
83 if (peer == null) { 87 if (this.peer == null) {
84 Session session = ImporterSession.getInstance() 88 final Session session = ImporterSession.getInstance()
85 .getDatabaseSession(); 89 .getDatabaseSession();
86 90
87 Query query = session.createQuery("from Porosity where " 91 final Query query = session.createQuery("from Porosity where "
88 + " river=:river and " 92 + " river=:river and "
89 + " depth=:depth and " 93 + " depth=:depth and "
90 + " description=:description"); 94 + " description=:description");
91 95
92 query.setParameter("river", river); 96 query.setParameter("river", river);
93 query.setParameter("depth", depth.getPeer()); 97 query.setParameter("depth", this.depth.getPeer());
94 query.setParameter("description", description); 98 query.setParameter("description", this.description);
95 99
96 List<Porosity> porosity = query.list(); 100 final List<Porosity> porosity = query.list();
97 101
98 if (porosity.isEmpty()) { 102 if (porosity.isEmpty()) {
99 log.debug("Create new Porosity DB instance."); 103 log.debug("Create new Porosity DB instance.");
100 104
101 peer = new Porosity(river, depth.getPeer(), 105 this.peer = new Porosity(river, this.depth.getPeer(),
102 description, timeInterval.getPeer()); 106 this.description, this.timeInterval.getPeer());
103 107
104 session.save(peer); 108 session.save(this.peer);
109 this.storeMode = StoreMode.INSERT;
105 } 110 }
106 else { 111 else {
107 peer = porosity.get(0); 112 this.peer = porosity.get(0);
113 this.storeMode = StoreMode.UPDATE;
108 } 114 }
109 } 115 }
110 116
111 return peer; 117 return this.peer;
112 } 118 }
113 } 119 }
114 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 120 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org