Skip to content
Prev Previous commit
Next Next commit
refactor: switch from ext storage to enc values in hgv core edge filter
  • Loading branch information
aoles committed Oct 22, 2025
commit b35cf5fd5ff8cf3d1633f9d4a1cc1ee84960041c
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,66 @@
*/
package org.heigit.ors.routing.graphhopper.extensions.edgefilters.core;

import com.graphhopper.routing.querygraph.EdgeIteratorStateHelper;
import com.graphhopper.routing.ev.*;
import com.graphhopper.routing.util.EdgeFilter;
import com.graphhopper.routing.util.EncodingManager;
import com.graphhopper.storage.GraphHopperStorage;
import com.graphhopper.util.EdgeIteratorState;
import org.heigit.ors.routing.graphhopper.extensions.storages.GraphStorageUtils;
import org.heigit.ors.routing.graphhopper.extensions.storages.HeavyVehicleAttributesGraphStorage;

import java.util.ArrayList;
import java.util.List;


public class HeavyVehicleCoreEdgeFilter implements EdgeFilter {
private final HeavyVehicleAttributesGraphStorage storage;
private static final List<BooleanEncodedValue> accessEncodedValues = new ArrayList<>();
private static final List<DecimalEncodedValue> paramsEncodedValues = new ArrayList<>();

public HeavyVehicleCoreEdgeFilter(GraphHopperStorage graphStorage) {
storage = GraphStorageUtils.getGraphExtension(graphStorage, HeavyVehicleAttributesGraphStorage.class);
EncodingManager encodingManager = graphStorage.getEncodingManager();

// Boolean access restrictions
List.of(
AgriculturalAccess.KEY,
BusAccess.KEY,
DeliveryAccess.KEY,
ForestryAccess.KEY,
GoodsAccess.KEY,
HgvAccess.KEY,
HazmatAccess.KEY
).forEach(key -> {
if (encodingManager.hasEncodedValue(key))
accessEncodedValues.add(encodingManager.getBooleanEncodedValue(key));
});

// Decimal parameter restrictions
List.of(
MaxAxleLoad.KEY,
MaxHeight.KEY,
MaxLength.KEY,
MaxWeight.KEY,
MaxWidth.KEY
).forEach(key -> {
if (encodingManager.hasEncodedValue(key))
paramsEncodedValues.add(encodingManager.getDecimalEncodedValue(key));
});
}

@Override
public final boolean accept(EdgeIteratorState iter) {
return !storage.hasEdgeRestriction(EdgeIteratorStateHelper.getOriginalEdge(iter));

return !hasEdgeRestriction(iter);
}

private boolean hasEdgeRestriction(EdgeIteratorState iter) {
for (BooleanEncodedValue encodedValue : accessEncodedValues) {
if (iter.get(encodedValue)) {
return true;
}
}
for (DecimalEncodedValue encodedValue : paramsEncodedValues) {
if (!Double.isInfinite(iter.get(encodedValue))) {
return true;
}
}
return false;
}
}