Skip to content

Commit

Permalink
Merge branch 'cached-results' into 'master'
Browse files Browse the repository at this point in the history
cache time independent results in geometry "userdata" field

See merge request giscience/big-data/ohsome/ohsome-api!11
  • Loading branch information
tyrasd committed Feb 15, 2019
2 parents 01eca91 + ce199bd commit aae6591
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -351,27 +351,31 @@ public static Response executeCountLengthPerimeterArea(RequestResource requestRe
if (!"post".equalsIgnoreCase(servletRequest.getMethod())) {
requestUrl = inputProcessor.getRequestUrl();
}

switch (requestResource) {
case COUNT:
result = mapRed.aggregateByTimestamp().count();
break;
case AREA:
result = mapRed.aggregateByTimestamp()
.sum((SerializableFunction<OSMEntitySnapshot, Number>) snapshot -> {
return Geo.areaOf(snapshot.getGeometry());
return ExecutionUtils.cacheInUserData(snapshot.getGeometry(),
() -> Geo.areaOf(snapshot.getGeometry()));
});
break;
case LENGTH:
result = mapRed.aggregateByTimestamp()
.sum((SerializableFunction<OSMEntitySnapshot, Number>) snapshot -> {
return Geo.lengthOf(snapshot.getGeometry());
return ExecutionUtils.cacheInUserData(snapshot.getGeometry(),
() -> Geo.lengthOf(snapshot.getGeometry()));
});
break;
case PERIMETER:
result = mapRed.aggregateByTimestamp()
.sum((SerializableFunction<OSMEntitySnapshot, Number>) snapshot -> {
if (snapshot.getGeometry() instanceof Polygonal) {
return Geo.lengthOf(snapshot.getGeometry().getBoundary());
return ExecutionUtils.cacheInUserData(snapshot.getGeometry(),
() -> Geo.lengthOf(snapshot.getGeometry().getBoundary()));
} else {
return 0.0;
}
Expand Down Expand Up @@ -1155,20 +1159,20 @@ public static <P extends Geometry & Polygonal> Response executeCountLengthPerime
break;
case LENGTH:
result = preResult.sum(geom -> {
return Geo.lengthOf(geom);
return ExecutionUtils.cacheInUserData(geom, () -> Geo.lengthOf(geom));
});
break;
case PERIMETER:
result = preResult.sum(geom -> {
if (!(geom instanceof Polygonal)) {
return 0.0;
}
return Geo.lengthOf(geom.getBoundary());
return ExecutionUtils.cacheInUserData(geom, () -> Geo.lengthOf(geom.getBoundary()));
});
break;
case AREA:
result = preResult.sum(geom -> {
return Geo.areaOf(geom);
return ExecutionUtils.cacheInUserData(geom, () -> Geo.areaOf(geom));
});
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import org.heigit.bigspatialdata.ohsome.ohsomeapi.output.rawdataresponse.DataResponse;
import org.heigit.bigspatialdata.oshdb.api.generic.OSHDBCombinedIndex;
import org.heigit.bigspatialdata.oshdb.api.generic.function.SerializableFunction;
import org.heigit.bigspatialdata.oshdb.api.generic.function.SerializableSupplier;
import org.heigit.bigspatialdata.oshdb.api.mapreducer.MapAggregator;
import org.heigit.bigspatialdata.oshdb.api.mapreducer.MapReducer;
import org.heigit.bigspatialdata.oshdb.api.object.OSMContribution;
Expand Down Expand Up @@ -327,14 +328,18 @@ public org.wololo.geojson.Feature createOSMFeature(OSMEntity entity, Geometry ge
if (!(geom instanceof Polygonal)) {
return 0.0;
}
return Geo.lengthOf(geom.getBoundary());
return cacheInUserData(geom, () -> Geo.lengthOf(geom.getBoundary()));
});
break;
case LENGTH:
result = preResult.sum(Geo::lengthOf);
result = preResult.sum(geom -> {
return cacheInUserData(geom, () -> Geo.lengthOf(geom));
});
break;
case AREA:
result = preResult.sum(Geo::areaOf);
result = preResult.sum(geom -> {
return cacheInUserData(geom, () -> Geo.areaOf(geom));
});
break;
default:
break;
Expand Down Expand Up @@ -379,20 +384,23 @@ public static <A, U, V> SortedMap<V, SortedMap<U, A>> nest(
case LENGTH:
return (SortedMap<K, V>) preResult
.sum((SerializableFunction<OSMEntitySnapshot, Number>) snapshot -> {
return Geo.lengthOf(snapshot.getGeometry());
return cacheInUserData(snapshot.getGeometry(),
() -> Geo.lengthOf(snapshot.getGeometry()));
});
case PERIMETER:
return (SortedMap<K, V>) preResult
.sum((SerializableFunction<OSMEntitySnapshot, Number>) snapshot -> {
if (snapshot.getGeometry() instanceof Polygonal) {
return Geo.lengthOf(snapshot.getGeometry().getBoundary());
return cacheInUserData(snapshot.getGeometry(),
() -> Geo.lengthOf(snapshot.getGeometry().getBoundary()));
}
return 0.0;
});
case AREA:
return (SortedMap<K, V>) preResult
.sum((SerializableFunction<OSMEntitySnapshot, Number>) snapshot -> {
return Geo.areaOf(snapshot.getGeometry());
return cacheInUserData(snapshot.getGeometry(),
() -> Geo.areaOf(snapshot.getGeometry()));
});
default:
return null;
Expand Down Expand Up @@ -517,6 +525,22 @@ public Feature[] createGeoJsonFeatures(GroupByObject[] results, GeoJsonObject[]
return features;
}

/**
* Caches the given mapper value in the user data of the <code>Geometry</code> object.
*
* @param geom <code>Geometry</code> of an OSMEntitySnapshot object
* @param arbitrary function that returns a time-independent value from a snapshot object, for
* example lenght, area, perimeter
* @return evaluated mapper function or cached value stored in the user data of the
* <code>Geometry</code> object
*/
public static Double cacheInUserData(Geometry geom, SerializableSupplier<Double> mapper) {
if (geom.getUserData() == null) {
geom.setUserData(mapper.get());
}
return (Double) geom.getUserData();
}

/** Fills the ElementsResult array with respective ElementsResult objects. */
public ElementsResult[] fillElementsResult(SortedMap<OSHDBTimestamp, ? extends Number> entryVal,
boolean isDensity, DecimalFormat df, Geometry geom) {
Expand Down

0 comments on commit aae6591

Please sign in to comment.