Skip to content

Commit 6e2a909

Browse files
committed
corrected result-set iterating for Postgres, updated drivers
1 parent efb77a0 commit 6e2a909

File tree

6 files changed

+137
-55
lines changed

6 files changed

+137
-55
lines changed

core/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@
6666
<artifactId>postgresql</artifactId>
6767
</dependency>
6868
<dependency>
69-
<groupId>org.postgis</groupId>
70-
<artifactId>postgis</artifactId>
69+
<groupId>net.postgis</groupId>
70+
<artifactId>postgis-jdbc</artifactId>
7171
</dependency>
7272
<dependency>
7373
<groupId>com.h2database</groupId>

core/src/main/java/com/bc/fiduceo/db/AbstractDriver.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,14 @@ static String createSql(QueryParameter parameter) {
146146

147147
boolean hasWhereClause = hasWhereClause(parameter);
148148
if (!hasWhereClause) {
149+
sql.append(" ORDER by obs.ID ");
149150
appendLimitAndOffset(parameter, sql);
150151
return sql.toString();
151152
}
152153

153154
appendWhereClause(parameter, sql);
154155

156+
sql.append(" ORDER by obs.ID ");
155157
appendLimitAndOffset(parameter, sql);
156158
return sql.toString();
157159
}

core/src/main/java/com/bc/fiduceo/db/PostGISDriver.java

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -186,63 +186,68 @@ public List<SatelliteObservation> get() throws SQLException {
186186

187187
@Override
188188
public List<SatelliteObservation> get(QueryParameter parameter) throws SQLException {
189-
final Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
190-
final String sql = createSql(parameter);
189+
final Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
190+
String sql = createSql(parameter);
191191
final ResultSet resultSet = statement.executeQuery(sql);
192-
resultSet.last();
193-
final int numValues = resultSet.getRow();
194-
resultSet.beforeFirst();
195192

196-
final List<SatelliteObservation> resultList = new ArrayList<>(numValues);
193+
final List<SatelliteObservation> resultList = new ArrayList<>();
194+
final List<TimeAxis> timeAxesList = new ArrayList<>();
195+
int currentId = -1;
196+
SatelliteObservation currentObservation = null;
197197
while (resultSet.next()) {
198-
final SatelliteObservation observation = new SatelliteObservation();
199-
200198
final int observationId = resultSet.getInt("id");
199+
if (observationId != currentId) {
200+
if (currentObservation != null) {
201+
currentObservation.setTimeAxes(timeAxesList.toArray(new TimeAxis[0]));
202+
resultList.add(currentObservation);
203+
timeAxesList.clear();
204+
}
201205

202-
final Timestamp startDate = resultSet.getTimestamp("StartDate");
203-
observation.setStartTime(TimeUtils.toDate(startDate));
206+
currentId = observationId;
207+
currentObservation = new SatelliteObservation();
204208

205-
final Timestamp stopDate = resultSet.getTimestamp("StopDate");
206-
observation.setStopTime(TimeUtils.toDate(stopDate));
209+
final Timestamp startDate = resultSet.getTimestamp("StartDate");
210+
currentObservation.setStartTime(TimeUtils.toDate(startDate));
207211

208-
final int nodeTypeId = resultSet.getInt("NodeType");
209-
observation.setNodeType(NodeType.fromId(nodeTypeId));
212+
final Timestamp stopDate = resultSet.getTimestamp("StopDate");
213+
currentObservation.setStopTime(TimeUtils.toDate(stopDate));
210214

211-
final PGgeometry geoBounds = (PGgeometry) resultSet.getObject("GeoBounds");
212-
if (geoBounds != null) {
213-
final Geometry geometry = geometryFactory.fromStorageFormat(geoBounds.getValue().getBytes());
214-
observation.setGeoBounds(geometry);
215-
}
215+
final int nodeTypeId = resultSet.getInt("NodeType");
216+
currentObservation.setNodeType(NodeType.fromId(nodeTypeId));
216217

217-
final int sensorId = resultSet.getInt("SensorId");
218-
final Sensor sensor = getSensor(sensorId);
219-
observation.setSensor(sensor);
218+
final PGgeometry geoBounds = (PGgeometry) resultSet.getObject("GeoBounds");
219+
if (geoBounds != null) {
220+
final Geometry geometry = geometryFactory.fromStorageFormat(geoBounds.getValue().getBytes());
221+
currentObservation.setGeoBounds(geometry);
222+
}
223+
224+
final int sensorId = resultSet.getInt("SensorId");
225+
final Sensor sensor = getSensor(sensorId);
226+
currentObservation.setSensor(sensor);
220227

221-
final String version = resultSet.getString("Version");
222-
observation.setVersion(version);
228+
final String version = resultSet.getString("Version");
229+
currentObservation.setVersion(version);
223230

224-
final String dataFile = resultSet.getString("DataFile");
225-
observation.setDataFilePath(dataFile);
231+
final String dataFile = resultSet.getString("DataFile");
232+
currentObservation.setDataFilePath(dataFile);
226233

227-
final List<TimeAxis> timeAxesList = new ArrayList<>();
228-
while (observationId == resultSet.getInt("id")) {
229234
final TimeAxis timeAxis = getTimeAxis(resultSet);
230235
if (timeAxis != null) {
231236
timeAxesList.add(timeAxis);
232237
}
233-
234-
if (!resultSet.next()) {
235-
break;
238+
} else {
239+
// update current observation with TimeAxis
240+
final TimeAxis timeAxis = getTimeAxis(resultSet);
241+
if (timeAxis != null) {
242+
timeAxesList.add(timeAxis);
236243
}
237244
}
238-
resultSet.previous(); // need to rewind one result because the while loop runs one result too far tb 2016-11-29
239-
240-
//@todo 2 tb/tb writ test for this condition
241-
if (!timeAxesList.isEmpty()) {
242-
observation.setTimeAxes(timeAxesList.toArray(new TimeAxis[timeAxesList.size()]));
243-
}
245+
}
244246

245-
resultList.add(observation);
247+
if (currentObservation != null) {
248+
currentObservation.setTimeAxes(timeAxesList.toArray(new TimeAxis[0]));
249+
resultList.add(currentObservation);
250+
timeAxesList.clear();
246251
}
247252

248253
return resultList;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.bc.fiduceo;
2+
3+
import com.bc.fiduceo.core.SatelliteObservation;
4+
import com.bc.fiduceo.db.QueryParameter;
5+
import com.bc.fiduceo.db.Storage;
6+
import com.bc.fiduceo.geometry.Geometry;
7+
import com.bc.fiduceo.geometry.GeometryFactory;
8+
import com.bc.fiduceo.geometry.GeometryUtil;
9+
import com.bc.fiduceo.geometry.TimeAxis;
10+
import com.bc.fiduceo.util.TimeUtils;
11+
import org.apache.commons.dbcp2.BasicDataSource;
12+
import org.junit.Ignore;
13+
import org.junit.Test;
14+
15+
import java.nio.file.Path;
16+
import java.sql.SQLException;
17+
import java.util.List;
18+
19+
public class TestDeleteMe {
20+
21+
@Test
22+
@Ignore
23+
public void testAvhrrFRAC_fromDB() throws SQLException {
24+
final BasicDataSource dataSource = new BasicDataSource();
25+
dataSource.setDriverClassName("org.postgresql.Driver");
26+
dataSource.setUrl("jdbc:postgresql://localhost:5432/test");
27+
dataSource.setUsername("fiduceo");
28+
dataSource.setPassword("oecudif");
29+
30+
/*
31+
dataSource.setDriverClassName("org.postgresql.Driver");
32+
dataSource.setUrl("jdbc:postgresql://udb1.jasmin.ac.uk:5432/fiduceo");
33+
dataSource.setUsername("fiduceo");
34+
dataSource.setPassword("rtjhYythwrtN");
35+
*/
36+
37+
final GeometryFactory geometryFactory = new GeometryFactory(GeometryFactory.Type.S2);
38+
final Storage storage = Storage.create(dataSource, geometryFactory);
39+
//storage.initialize();
40+
41+
try {
42+
final QueryParameter parameter = new QueryParameter();
43+
parameter.setSensorName("avhrr-frac-ma");
44+
// parameter.setStartTime(TimeUtils.parse("2019-09-25 00:00:00", "yyyy-MM-dd HH:mm:ss"));
45+
// parameter.setStopTime(TimeUtils.parse("2019-09-25 23:59:59", "yyyy-MM-dd HH:mm:ss"));
46+
47+
final List<SatelliteObservation> satelliteObservations = storage.get(parameter);
48+
System.out.println("num results: " + satelliteObservations.size());
49+
for (final SatelliteObservation obs : satelliteObservations) {
50+
final Path fileName = obs.getDataFilePath().getFileName();
51+
System.out.println(fileName);
52+
53+
final Geometry geoBounds = obs.getGeoBounds();
54+
final Geometry[] subGeometries = GeometryUtil.getSubGeometries(geoBounds);
55+
56+
final TimeAxis[] timeAxes = obs.getTimeAxes();
57+
if (subGeometries.length != timeAxes.length) {
58+
System.out.println("!!!!!!!! DISCREPANCY !!!!!!!!!!!!!!!!!");
59+
}
60+
61+
System.out.println("---------------------------------------------------------");
62+
}
63+
} finally {
64+
storage.close();
65+
}
66+
}
67+
}

core/src/test/java/com/bc/fiduceo/db/AbstractDriverTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class AbstractDriverTest {
3636
public void testCreateSql_noParameter() {
3737
final String sql = AbstractDriver.createSql(null);
3838

39-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId", sql);
39+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId ORDER by obs.ID ", sql);
4040
}
4141

4242
@Test
@@ -47,7 +47,7 @@ public void testCreateSql_startTime() {
4747

4848
final String sql = AbstractDriver.createSql(parameter);
4949

50-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.stopDate >= '2011-03-13 07:06:40.0'", sql);
50+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.stopDate >= '2011-03-13 07:06:40.0' ORDER by obs.ID ", sql);
5151
}
5252

5353
@Test
@@ -57,7 +57,7 @@ public void testCreateSql_stopTime() {
5757

5858
final String sql = AbstractDriver.createSql(parameter);
5959

60-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.startDate <= '2008-05-05 15:06:40.0'", sql);
60+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.startDate <= '2008-05-05 15:06:40.0' ORDER by obs.ID ", sql);
6161
}
6262

6363
@Test
@@ -68,7 +68,7 @@ public void testCreateSql_startAndStopTime() {
6868

6969
final String sql = AbstractDriver.createSql(parameter);
7070

71-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.stopDate >= '2011-10-30 18:40:00.0' AND obs.startDate <= '2012-02-23 12:26:40.0'", sql);
71+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.stopDate >= '2011-10-30 18:40:00.0' AND obs.startDate <= '2012-02-23 12:26:40.0' ORDER by obs.ID ", sql);
7272
}
7373

7474
@Test
@@ -78,7 +78,7 @@ public void testCreateSql_sensorName() {
7878

7979
final String sql = AbstractDriver.createSql(parameter);
8080

81-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE sen.Name = 'fieberthermometer'", sql);
81+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE sen.Name = 'fieberthermometer' ORDER by obs.ID ", sql);
8282
}
8383

8484
@Test
@@ -89,7 +89,7 @@ public void testCreateSql_sensorNameAndStartTime() {
8989

9090
final String sql = AbstractDriver.createSql(parameter);
9191

92-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.stopDate >= '2009-08-11 14:13:20.0' AND sen.Name = 'sensing'", sql);
92+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.stopDate >= '2009-08-11 14:13:20.0' AND sen.Name = 'sensing' ORDER by obs.ID ", sql);
9393
}
9494

9595
@Test
@@ -99,7 +99,7 @@ public void testCreateSql_productPath() {
9999

100100
final String sql = AbstractDriver.createSql(parameter);
101101

102-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.DataFile = '/whereever/i/lay/my/hat'", sql);
102+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.DataFile = '/whereever/i/lay/my/hat' ORDER by obs.ID ", sql);
103103
}
104104

105105
@Test
@@ -109,7 +109,7 @@ public void testCreateSql_version() {
109109

110110
final String sql = AbstractDriver.createSql(parameter);
111111

112-
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.Version = 'v2.0'", sql);
112+
assertEquals("SELECT * FROM SATELLITE_OBSERVATION obs INNER JOIN SENSOR sen ON obs.SensorId = sen.ID LEFT OUTER JOIN TIMEAXIS axis ON obs.ID = axis.ObservationId WHERE obs.Version = 'v2.0' ORDER by obs.ID ", sql);
113113
}
114114

115115
@Test

pom.xml

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@
8181
<dependency>
8282
<groupId>org.postgresql</groupId>
8383
<artifactId>postgresql</artifactId>
84-
<version>9.4-1206-jdbc42</version>
84+
<version>42.2.23</version>
8585
</dependency>
8686
<dependency>
87-
<groupId>org.postgis</groupId>
88-
<artifactId>postgis</artifactId>
89-
<version>1.5.2</version>
87+
<groupId>net.postgis</groupId>
88+
<artifactId>postgis-jdbc</artifactId>
89+
<version>2.5.1</version>
9090
</dependency>
9191

9292
<dependency>
@@ -196,13 +196,21 @@
196196
</build>
197197

198198
<repositories>
199+
<!-- <repository>-->
200+
<!-- <snapshots>-->
201+
<!-- <enabled>false</enabled>-->
202+
<!-- </snapshots>-->
203+
<!-- <id>bintray-jnegre-maven</id>-->
204+
<!-- <name>bintray</name>-->
205+
<!-- <url>http://dl.bintray.com/jnegre/maven</url>-->
206+
<!-- </repository>-->
199207
<repository>
200208
<snapshots>
201209
<enabled>false</enabled>
202210
</snapshots>
203-
<id>bintray-jnegre-maven</id>
204-
<name>bintray</name>
205-
<url>http://dl.bintray.com/jnegre/maven</url>
211+
<id>maven-central</id>
212+
<name>Maven central repository</name>
213+
<url>https://repo1.maven.org/maven2/</url>
206214
</repository>
207215
<repository>
208216
<id>snap-repo-public</id>

0 commit comments

Comments
 (0)