From ec1ec180466b5538cdf953ff33af5183526cb3c4 Mon Sep 17 00:00:00 2001 From: Martin Raifer Date: Thu, 23 Mar 2023 15:53:26 +0100 Subject: [PATCH] add lastContributionTimestamp to OSMEntitySnapshot objects --- .../api/object/OSMEntitySnapshotImpl.java | 6 ++++ .../oshdb/api/tests/TestAutoAggregation.java | 3 +- .../oshdb/util/celliterator/CellIterator.java | 11 +++++-- .../util/mappable/OSMEntitySnapshot.java | 7 +++++ .../IterateByTimestampsNodesTest.java | 31 +++++++++++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/oshdb-api/src/main/java/org/heigit/ohsome/oshdb/api/object/OSMEntitySnapshotImpl.java b/oshdb-api/src/main/java/org/heigit/ohsome/oshdb/api/object/OSMEntitySnapshotImpl.java index b148f13f9..610e375bb 100644 --- a/oshdb-api/src/main/java/org/heigit/ohsome/oshdb/api/object/OSMEntitySnapshotImpl.java +++ b/oshdb-api/src/main/java/org/heigit/ohsome/oshdb/api/object/OSMEntitySnapshotImpl.java @@ -38,6 +38,7 @@ public OSMEntitySnapshotImpl( ) { this.data = new IterateByTimestampEntry( other.getTimestamp(), + other.getLastContributionTimestamp(), other.getEntity(), other.getOSHEntity(), reclippedGeometry, @@ -50,6 +51,11 @@ public OSHDBTimestamp getTimestamp() { return data.timestamp(); } + @Override + public OSHDBTimestamp getLastContributionTimestamp() { + return data.lastModificationTimestamp(); + } + @Override public Geometry getGeometry() { return data.geometry().get(); diff --git a/oshdb-api/src/test/java/org/heigit/ohsome/oshdb/api/tests/TestAutoAggregation.java b/oshdb-api/src/test/java/org/heigit/ohsome/oshdb/api/tests/TestAutoAggregation.java index e5a3275b1..ad4fe1f55 100644 --- a/oshdb-api/src/test/java/org/heigit/ohsome/oshdb/api/tests/TestAutoAggregation.java +++ b/oshdb-api/src/test/java/org/heigit/ohsome/oshdb/api/tests/TestAutoAggregation.java @@ -194,7 +194,8 @@ protected S flatMapReduceCellsOSMEntitySnapshotGroupedById( private static OSMEntitySnapshot snapshot(OSHNode node) { var timestamp = timestamps.get().first(); - var data = new IterateByTimestampEntry(timestamp, node.getVersions().iterator().next(), node, + var data = new IterateByTimestampEntry(timestamp, null, + node.getVersions().iterator().next(), node, new LazyEvaluatedObject<>(point), new LazyEvaluatedObject<>(point)); return new OSMEntitySnapshotImpl(data); diff --git a/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/celliterator/CellIterator.java b/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/celliterator/CellIterator.java index 0ce4421a6..1d1131484 100644 --- a/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/celliterator/CellIterator.java +++ b/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/celliterator/CellIterator.java @@ -211,6 +211,7 @@ public CellIterator( * Holds the result of a single item returned by {@link #iterateByTimestamps(GridOSHEntity)}. * * @param timestamp timestamp of the snapshot + * @param lastModificationTimestamp last modification timestamp before the snapshot's timestamp * @param osmEntity the exact version of the OSM object * @param oshEntity the whole version history of the OSM object * @param geometry an object which holds the geometry of the OSM object, or a method to build it @@ -220,6 +221,7 @@ public CellIterator( */ public record IterateByTimestampEntry( OSHDBTimestamp timestamp, + OSHDBTimestamp lastModificationTimestamp, @Nonnull OSMEntity osmEntity, @Nonnull OSHEntity oshEntity, LazyEvaluatedObject geometry, @@ -281,15 +283,18 @@ public Stream iterateByTimestamps(Stream> queryTs = new TreeMap<>(); + SortedMap lastModificationTimestamps = new TreeMap<>(); if (!includeOldStyleMultipolygons) { List modTs = OSHEntityTimeUtils.getModificationTimestamps(oshEntity, osmEntityFilter); int j = 0; + OSHDBTimestamp lastModificationTimestamp = null; for (OSHDBTimestamp requestedT : timestamps) { boolean needToRequest = false; while (j < modTs.size() && modTs.get(j).getEpochSecond() <= requestedT.getEpochSecond()) { needToRequest = true; + lastModificationTimestamp = modTs.get(j); j++; } if (needToRequest) { @@ -297,6 +302,7 @@ public Stream iterateByTimestamps(Stream 0) { queryTs.get(queryTs.lastKey()).add(requestedT); } + lastModificationTimestamps.put(requestedT, lastModificationTimestamp); } } else { // todo: make this work with old style multipolygons!!?! @@ -381,16 +387,17 @@ public Stream iterateByTimestamps(Stream fullGeom = fullyInside ? geom : new LazyEvaluatedObject<>( () -> OSHDBGeometryBuilder.getGeometry(osmEntity, timestamp, tagInterpreter)); results.add(new IterateByTimestampEntry( - timestamp, osmEntity, oshEntity, geom, fullGeom) + timestamp, lastModificationTimestamp, osmEntity, oshEntity, geom, fullGeom) ); // add skipped timestamps (where nothing has changed from the last timestamp) to result for (OSHDBTimestamp additionalT : queryTs.get(timestamp)) { results.add(new IterateByTimestampEntry( - additionalT, osmEntity, oshEntity, geom, fullGeom) + additionalT, lastModificationTimestamp, osmEntity, oshEntity, geom, fullGeom) ); } } diff --git a/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/mappable/OSMEntitySnapshot.java b/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/mappable/OSMEntitySnapshot.java index 8048c0d98..b07f8c516 100644 --- a/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/mappable/OSMEntitySnapshot.java +++ b/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/mappable/OSMEntitySnapshot.java @@ -16,6 +16,13 @@ public interface OSMEntitySnapshot extends OSHDBMapReducible, Comparable result = (new CellIterator( + new OSHDBTimestamps( + "2000-06-01T00:00:00Z", + "2018-06-01T00:00:00Z", + "P1Y" + ).get(), + OSHDBBoundingBox.bboxWgs84Coordinates(-180.0, -90.0, 180.0, 90.0), + areaDecider, + oshEntity -> oshEntity.getId() == 3, + osmEntity -> true, + false + )).iterateByTimestamps( + oshdbDataGridCell + ).toList(); + assertEquals(5, result.size()); + assertEquals("2007-06-01T00:00:00", result.get(0).timestamp().toString()); + assertEquals("2007-01-01T00:00:00", result.get(0).lastModificationTimestamp().toString()); + assertEquals("2014-06-01T00:00:00", result.get(1).timestamp().toString()); + assertEquals("2014-01-01T00:00:00", result.get(1).lastModificationTimestamp().toString()); + assertEquals("2016-06-01T00:00:00", result.get(2).timestamp().toString()); + assertEquals("2016-01-01T00:00:00", result.get(2).lastModificationTimestamp().toString()); + assertEquals("2017-06-01T00:00:00", result.get(3).timestamp().toString()); + assertEquals("2016-01-01T00:00:00", result.get(3).lastModificationTimestamp().toString()); + assertEquals("2018-06-01T00:00:00", result.get(4).timestamp().toString()); + assertEquals("2016-01-01T00:00:00", result.get(4).lastModificationTimestamp().toString()); + } }