// Copyright © 2015 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.core.domain.prediction;
import com.google.common.base.MoreObjects;
import java.util.Collection;
import java.util.stream.Stream;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toSet;
public class HubPredictionResult extends BasePredictionResult {
public long hubId;
public static HubPredictionResult fromSingle(long hubId, PredictionResult prediction) {
final HubPredictionResult hub = new HubPredictionResult();
hub.hubId = hubId;
hub.spacesAvailable = prediction.spacesAvailable;
hub.timestamp = prediction.timestamp;
hub.capacityType = prediction.capacityType;
hub.usage = prediction.usage;
return hub;
}
public static HubPredictionResult sumFrom(long hubId, PredictionResult... predictions) {
return sumFrom(hubId, asList(predictions));
}
public static HubPredictionResult sumFrom(long hubId, Collection<PredictionResult> predictions) {
// Check preconditions for summing
expectUniqueResult(predictions.stream().map(pred -> pred.capacityType));
expectUniqueResult(predictions.stream().map(pred -> pred.usage));
expectUniqueResult(predictions.stream().map(pred -> pred.timestamp));
return predictions.stream()
.map(pred -> fromSingle(hubId, pred))
.reduce((hub1, hub2) -> {
hub1.spacesAvailable = hub1.spacesAvailable + hub2.spacesAvailable;
return hub1;
})
.get();
}
private static <T> void expectUniqueResult(Stream<T> coll) {
if (coll.collect(toSet()).size() != 1) {
throw new IllegalArgumentException(String.format("Expected a collection with size of one, got <%s>", coll));
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("hubId", hubId)
.add("capacityType", capacityType)
.add("usage", usage)
.add("timestamp", timestamp)
.add("spacesAvailable", spacesAvailable)
.toString();
}
}