comparison backend/src/main/java/org/dive4elements/river/importer/ImportHYKFormation.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 4c3ccf2b0304
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 org.dive4elements.river.model.HYKFormation; 11 import java.math.BigDecimal;
12 import org.dive4elements.river.model.HYKEntry;
13
14 import java.util.ArrayList; 12 import java.util.ArrayList;
15 import java.util.List; 13 import java.util.List;
16 14
15 import org.dive4elements.river.importer.common.StoreMode;
16 import org.dive4elements.river.model.HYKEntry;
17 import org.dive4elements.river.model.HYKFormation;
18 import org.hibernate.Query;
17 import org.hibernate.Session; 19 import org.hibernate.Session;
18 import org.hibernate.Query;
19
20 import java.math.BigDecimal;
21 20
22 public class ImportHYKFormation 21 public class ImportHYKFormation
23 { 22 {
24 protected int formationNum; 23 protected int formationNum;
25 protected ImportHYKEntry entry; 24 protected ImportHYKEntry entry;
29 protected BigDecimal distanceHF; 28 protected BigDecimal distanceHF;
30 protected BigDecimal distanceVR; 29 protected BigDecimal distanceVR;
31 30
32 protected List<ImportHYKFlowZone> zones; 31 protected List<ImportHYKFlowZone> zones;
33 32
33 protected StoreMode storeMode;
34
34 protected HYKFormation peer; 35 protected HYKFormation peer;
35 36
36 public ImportHYKFormation() { 37 public ImportHYKFormation() {
37 zones = new ArrayList<ImportHYKFlowZone>(); 38 this.zones = new ArrayList<>();
39 this.storeMode = StoreMode.NONE;
38 } 40 }
39 41
40 public ImportHYKFormation( 42 public ImportHYKFormation(
41 int formationNum, 43 final int formationNum,
42 ImportHYKEntry entry, 44 final ImportHYKEntry entry,
43 BigDecimal top, 45 final BigDecimal top,
44 BigDecimal bottom, 46 final BigDecimal bottom,
45 BigDecimal distanceVL, 47 final BigDecimal distanceVL,
46 BigDecimal distanceHF, 48 final BigDecimal distanceHF,
47 BigDecimal distanceVR 49 final BigDecimal distanceVR
48 ) { 50 ) {
49 this(); 51 this();
50 this.formationNum = formationNum; 52 this.formationNum = formationNum;
51 this.entry = entry; 53 this.entry = entry;
52 this.top = top; 54 this.top = top;
53 this.bottom = bottom; 55 this.bottom = bottom;
54 this.distanceVL = distanceVL; 56 this.distanceVL = distanceVL;
55 this.distanceHF = distanceHF; 57 this.distanceHF = distanceHF;
56 this.distanceVR = distanceVR; 58 this.distanceVR = distanceVR;
57 } 59 }
58 60
59 public void addFlowZone(ImportHYKFlowZone zone) { 61 public void addFlowZone(final ImportHYKFlowZone zone) {
60 zones.add(zone); 62 this.zones.add(zone);
61 zone.setFormation(this); 63 zone.setFormation(this);
62 } 64 }
63 65
64 public int getFormationNum() { 66 public int getFormationNum() {
65 return formationNum; 67 return this.formationNum;
66 } 68 }
67 69
68 public void setFormationNum(int formationNum) { 70 public void setFormationNum(final int formationNum) {
69 this.formationNum = formationNum; 71 this.formationNum = formationNum;
70 } 72 }
71 73
72 public ImportHYKEntry getEntry() { 74 public ImportHYKEntry getEntry() {
73 return entry; 75 return this.entry;
74 } 76 }
75 77
76 public void setEntry(ImportHYKEntry entry) { 78 public void setEntry(final ImportHYKEntry entry) {
77 this.entry = entry; 79 this.entry = entry;
78 } 80 }
79 81
80 public BigDecimal getTop() { 82 public BigDecimal getTop() {
81 return top; 83 return this.top;
82 } 84 }
83 85
84 public void setTop(BigDecimal top) { 86 public void setTop(final BigDecimal top) {
85 this.top = top; 87 this.top = top;
86 } 88 }
87 89
88 public BigDecimal getBottom() { 90 public BigDecimal getBottom() {
89 return bottom; 91 return this.bottom;
90 } 92 }
91 93
92 public void setBottom(BigDecimal bottom) { 94 public void setBottom(final BigDecimal bottom) {
93 this.bottom = bottom; 95 this.bottom = bottom;
94 } 96 }
95 97
96 public BigDecimal getDistanceVL() { 98 public BigDecimal getDistanceVL() {
97 return distanceVL; 99 return this.distanceVL;
98 } 100 }
99 101
100 public void setDistanceVL(BigDecimal distanceVL) { 102 public void setDistanceVL(final BigDecimal distanceVL) {
101 this.distanceVL = distanceVL; 103 this.distanceVL = distanceVL;
102 } 104 }
103 105
104 public BigDecimal getDistanceHF() { 106 public BigDecimal getDistanceHF() {
105 return distanceHF; 107 return this.distanceHF;
106 } 108 }
107 109
108 public void setDistanceHF(BigDecimal distanceHF) { 110 public void setDistanceHF(final BigDecimal distanceHF) {
109 this.distanceHF = distanceHF; 111 this.distanceHF = distanceHF;
110 } 112 }
111 113
112 public BigDecimal getDistanceVR() { 114 public BigDecimal getDistanceVR() {
113 return distanceVR; 115 return this.distanceVR;
114 } 116 }
115 117
116 public void setDistanceVR(BigDecimal distanceVR) { 118 public void setDistanceVR(final BigDecimal distanceVR) {
117 this.distanceVR = distanceVR; 119 this.distanceVR = distanceVR;
118 } 120 }
119 121
120 public void storeDependencies() { 122 public void storeDependencies() {
121 getPeer(); 123 getPeer();
122 for (ImportHYKFlowZone zone: zones) { 124 for (final ImportHYKFlowZone zone: this.zones) {
123 zone.storeDependencies(); 125 zone.storeDependencies();
124 } 126 }
125 } 127 }
126 128
127 public HYKFormation getPeer() { 129 public HYKFormation getPeer() {
128 if (peer == null) { 130 if (this.peer == null) {
129 HYKEntry e = entry.getPeer(); 131 final HYKEntry e = this.entry.getPeer();
130 Session session = ImporterSession.getInstance() 132 final Session session = ImporterSession.getInstance()
131 .getDatabaseSession(); 133 .getDatabaseSession();
132 Query query = session.createQuery( 134 List<HYKFormation> formations;
133 "from HYKFormation where formationNum=:formationNum " + 135 if (this.entry.storeMode == StoreMode.INSERT)
134 "and entry=:entry and top=:top and bottom=:bottom " + 136 formations = null;
135 "and distanceVL=:distanceVL and distanceHF=:distanceHF " + 137 else {
136 "and distanceVR=:distanceVR"); 138 final Query query = session.createQuery(
137 query.setParameter("formationNum", formationNum); 139 "from HYKFormation where formationNum=:formationNum " +
138 query.setParameter("entry", e); 140 "and entry=:entry and top=:top and bottom=:bottom " +
139 query.setParameter("top", top); 141 "and distanceVL=:distanceVL and distanceHF=:distanceHF " +
140 query.setParameter("bottom", bottom); 142 "and distanceVR=:distanceVR");
141 query.setParameter("distanceVL", distanceVL); 143 query.setParameter("formationNum", this.formationNum);
142 query.setParameter("distanceHF", distanceHF); 144 query.setParameter("entry", e);
143 query.setParameter("distanceVR", distanceVR); 145 query.setParameter("top", this.top);
144 List<HYKFormation> formations = query.list(); 146 query.setParameter("bottom", this.bottom);
145 if (formations.isEmpty()) { 147 query.setParameter("distanceVL", this.distanceVL);
146 peer = new HYKFormation( 148 query.setParameter("distanceHF", this.distanceHF);
147 formationNum, e, top, bottom, 149 query.setParameter("distanceVR", this.distanceVR);
148 distanceVL, distanceHF, distanceVR); 150 formations = query.list();
149 session.save(peer); 151 }
152 if ((formations == null) || formations.isEmpty()) {
153 this.peer = new HYKFormation(
154 this.formationNum, e, this.top, this.bottom,
155 this.distanceVL, this.distanceHF, this.distanceVR);
156 session.save(this.peer);
157 this.storeMode = StoreMode.INSERT;
150 } 158 }
151 else { 159 else {
152 peer = formations.get(0); 160 this.peer = formations.get(0);
161 this.storeMode = StoreMode.UPDATE;
153 } 162 }
154 } 163 }
155 return peer; 164 return this.peer;
156 } 165 }
157 } 166 }
158 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 167 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org