Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
make day for conditional tag parsing configurable (#1817)
* make day for conditional tag parsing configurable, fixes #1815

* set back to protected

* fix java command
  • Loading branch information
karussell committed Dec 5, 2019
1 parent cb1bea1 commit 46030b4
Show file tree
Hide file tree
Showing 18 changed files with 54 additions and 50 deletions.
2 changes: 2 additions & 0 deletions benchmark/benchmark.sh
Expand Up @@ -34,6 +34,7 @@ mkdir -p ${SINGLE_RESULTS_DIR}
# 1 - small map: node- and edge-based CH + slow routing
java -cp tools/target/graphhopper-tools-*-jar-with-dependencies.jar com.graphhopper.tools.Measurement \
datareader.file=${SMALL_OSM_MAP} \
datareader.date_range_parser_day=2019-11-01 \
measurement.folder=${SINGLE_RESULTS_DIR} \
measurement.clean=true \
measurement.summaryfile=${RESULTS_DIR}summary_small.dat \
Expand All @@ -52,6 +53,7 @@ measurement.count=5000
# 2 - big map: node-based CH + landmarks
java -cp tools/target/graphhopper-tools-*-jar-with-dependencies.jar com.graphhopper.tools.Measurement \
datareader.file=${BIG_OSM_MAP} \
datareader.date_range_parser_day=2019-11-01 \
measurement.folder=${SINGLE_RESULTS_DIR} \
measurement.clean=true \
measurement.summaryfile=${RESULTS_DIR}summary_big.dat \
Expand Down
2 changes: 2 additions & 0 deletions core/src/main/java/com/graphhopper/GraphHopper.java
Expand Up @@ -20,6 +20,7 @@
import com.graphhopper.json.geo.JsonFeature;
import com.graphhopper.reader.DataReader;
import com.graphhopper.reader.dem.*;
import com.graphhopper.reader.osm.conditional.DateRangeParser;
import com.graphhopper.routing.*;
import com.graphhopper.routing.ch.CHAlgoFactoryDecorator;
import com.graphhopper.routing.ch.PrepareContractionHierarchies;
Expand Down Expand Up @@ -524,6 +525,7 @@ public GraphHopper init(CmdArgs args) {
emBuilder.addAll(flagEncoderFactory, flagEncodersStr);
emBuilder.setEnableInstructions(args.getBool("datareader.instructions", true));
emBuilder.setPreferredLanguage(args.get("datareader.preferred_language", ""));
emBuilder.setDateRangeParser(DateRangeParser.createInstance(args.get("datareader.date_range_parser_day", "")));
// overwrite EncodingManager object from configuration file
setEncodingManager(emBuilder.build());
}
Expand Down
Expand Up @@ -35,14 +35,14 @@ public class ConditionalOSMTagInspector implements ConditionalTagInspector {
private final List<String> tagsToCheck;
private final ConditionalParser permitParser, restrictiveParser;
// enabling by default makes noise but could improve OSM data
private boolean enabledLogs = true;
private boolean enabledLogs;

public ConditionalOSMTagInspector(Object value, List<String> tagsToCheck,
public ConditionalOSMTagInspector(Calendar value, List<String> tagsToCheck,
Set<String> restrictiveValues, Set<String> permittedValues) {
this(tagsToCheck, Arrays.asList(new DateRangeParser((Calendar) value)), restrictiveValues, permittedValues, false);
this(Arrays.asList(new DateRangeParser(value)), tagsToCheck, restrictiveValues, permittedValues, false);
}

public ConditionalOSMTagInspector(List<String> tagsToCheck, List<? extends ConditionalValueParser> valueParsers,
public ConditionalOSMTagInspector(List<? extends ConditionalValueParser> valueParsers, List<String> tagsToCheck,
Set<String> restrictiveValues, Set<String> permittedValues, boolean enabledLogs) {
this.tagsToCheck = new ArrayList<>(tagsToCheck.size());
for (String tagToCheck : tagsToCheck) {
Expand Down
Expand Up @@ -66,7 +66,7 @@ public DateRange(ParsedCalendar from, ParsedCalendar to) {

public boolean isInRange(Calendar date) {
if (!yearless && !dayOnly)
return date.after(from) && date.before(to);
return date.after(from) && date.before(to) || date.equals(from) || date.equals(to);

if (dayOnly) {
int currentDayOfWeek = date.get(Calendar.DAY_OF_WEEK);
Expand Down
Expand Up @@ -42,9 +42,7 @@ public class DateRangeParser implements ConditionalValueParser {
private static final DateFormat MONTH_DAY2_DF = createFormatter("dd.MM");
private static final DateFormat YEAR_MONTH_DF = createFormatter("yyyy MMM");
private static final DateFormat MONTH_DF = createFormatter("MMM");
private static final List<String> DAY_NAMES = Arrays.asList(new String[]{
"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"
});
private static final List<String> DAY_NAMES = Arrays.asList("Su", "Mo", "Tu", "We", "Th", "Fr", "Sa");

private Calendar date;

Expand Down Expand Up @@ -136,4 +134,15 @@ public ConditionState checkCondition(String dateRangeString) throws ParseExcepti
else
return ConditionState.FALSE;
}

public static DateRangeParser createInstance(String day) {
Calendar calendar = createCalendar();
try {
if (!day.isEmpty())
calendar.setTime(Helper.createFormatter("yyyy-MM-dd").parse(day));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
return new DateRangeParser(calendar);
}
}
Expand Up @@ -29,10 +29,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.text.ParseException;
import java.util.*;

/**
* Abstract class which handles flag decoding and encoding. Every encoder should be registered to a
Expand Down Expand Up @@ -108,21 +106,20 @@ protected AbstractFlagEncoder(int speedBits, double speedFactor, int maxTurnCost
ferries.add("ferry");
}

// should be called as last method in constructor, move out of the flag encoder somehow
protected void init() {
protected void init(DateRangeParser dateRangeParser) {
if (conditionalTagInspector != null)
throw new IllegalStateException("You must not register a FlagEncoder (" + toString() + ") twice or for two EncodingManagers!");

registered = true;
// we should move 'OSM to object' logic into the DataReader like OSMReader, but this is a major task as we need to convert OSM format into kind of a standard/generic format
conditionalTagInspector = new ConditionalOSMTagInspector(DateRangeParser.createCalendar(), restrictions, restrictedValues, intendedValues);
conditionalTagInspector = new ConditionalOSMTagInspector(Collections.singletonList(dateRangeParser), restrictions, restrictedValues, intendedValues, false);
}

@Override
public boolean isRegistered() {
return registered;
}

public void setRegistered(boolean registered) {
this.registered = registered;
}

/**
* Should potential barriers block when no access limits are given?
*/
Expand All @@ -142,10 +139,6 @@ public ConditionalTagInspector getConditionalTagInspector() {
return conditionalTagInspector;
}

protected void setConditionalTagInspector(ConditionalTagInspector conditionalTagInspector) {
this.conditionalTagInspector = conditionalTagInspector;
}

/**
* Defines the bits for the node flags, which are currently used for barriers only.
* <p>
Expand Down
Expand Up @@ -66,8 +66,6 @@ public BikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts) {

absoluteBarriers.add("kissing_gate");
setSpecificClassBicycle("touring");

init();
}

@Override
Expand Down
Expand Up @@ -31,8 +31,6 @@ public Car4WDFlagEncoder(PMap properties) {

trackTypeSpeedMap.put("grade4", 5); // ... some hard or compressed materials
trackTypeSpeedMap.put("grade5", 5); // ... no hard materials. soil/sand/grass

init();
}

@Override
Expand Down
Expand Up @@ -142,8 +142,6 @@ public CarFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts) {
badSurfaceSpeed = 30;
maxPossibleSpeed = 140;
speedDefault = defaultSpeedMap.get("secondary");

init();
}

@Override
Expand Down
Expand Up @@ -21,6 +21,7 @@
import com.graphhopper.reader.ReaderNode;
import com.graphhopper.reader.ReaderRelation;
import com.graphhopper.reader.ReaderWay;
import com.graphhopper.reader.osm.conditional.DateRangeParser;
import com.graphhopper.routing.profiles.*;
import com.graphhopper.routing.util.parsers.*;
import com.graphhopper.routing.weighting.TurnWeighting;
Expand Down Expand Up @@ -144,11 +145,12 @@ public void releaseParsers() {

public static class Builder {
private EncodingManager em;
List<AbstractFlagEncoder> flagEncoderList = new ArrayList<>();
List<EncodedValue> encodedValueList = new ArrayList<>();
List<TagParser> tagParsers = new ArrayList<>();
List<TurnCostParser> turnCostParsers = new ArrayList<>();
List<RelationTagParser> relationTagParsers = new ArrayList<>();
private DateRangeParser dateRangeParser;
private List<AbstractFlagEncoder> flagEncoderList = new ArrayList<>();
private List<EncodedValue> encodedValueList = new ArrayList<>();
private List<TagParser> tagParsers = new ArrayList<>();
private List<TurnCostParser> turnCostParsers = new ArrayList<>();
private List<RelationTagParser> relationTagParsers = new ArrayList<>();

public Builder() {
em = new EncodingManager();
Expand Down Expand Up @@ -228,6 +230,12 @@ public Builder add(EncodedValue encodedValue) {
return this;
}

public Builder setDateRangeParser(DateRangeParser dateRangeParser) {
check();
this.dateRangeParser = dateRangeParser;
return this;
}

/**
* This method adds the specified TagParser and automatically adds EncodedValues as requested in
* createEncodedValues.
Expand Down Expand Up @@ -319,6 +327,9 @@ public EncodingManager build() {
_addEdgeTagParser(srp, false, true);
}

if (dateRangeParser == null)
dateRangeParser = new DateRangeParser(DateRangeParser.createCalendar());

for (AbstractFlagEncoder encoder : flagEncoderList) {
if (encoder instanceof BikeCommonFlagEncoder) {
if (!em.hasEncodedValue(getKey("bike", RouteNetwork.EV_SUFFIX)))
Expand All @@ -331,6 +342,7 @@ public EncodingManager build() {
_addRelationTagParser(new OSMFootNetworkTagParser());
}

encoder.init(dateRangeParser);
em.addEncoder(encoder);
}

Expand Down Expand Up @@ -437,16 +449,11 @@ private void setPreferredLanguage(String preferredLanguage) {
}

private void addEncoder(AbstractFlagEncoder encoder) {
if (encoder.isRegistered())
throw new IllegalStateException("You must not register a FlagEncoder (" + encoder.toString() + ") twice!");

for (FlagEncoder fe : edgeEncoders) {
if (fe.toString().equals(encoder.toString()))
throw new IllegalArgumentException("Cannot register edge encoder. Name already exists: " + fe.toString());
}

encoder.setRegistered(true);

int encoderCount = edgeEncoders.size();
int usedBits = encoder.defineNodeBits(encoderCount, nextNodeBit);
encoder.setNodeBitMask(usedBits - nextNodeBit, nextNodeBit);
Expand Down
Expand Up @@ -141,7 +141,6 @@ public FootFlagEncoder(int speedBits, double speedFactor) {

maxPossibleSpeed = FERRY_SPEED;
speedDefault = MEAN_SPEED;
init();
}

@Override
Expand Down
Expand Up @@ -59,8 +59,6 @@ public HikeFlagEncoder(int speedBits, double speedFactor) {
allowedSacScale.add("alpine_hiking");
allowedSacScale.add("demanding_alpine_hiking");
allowedSacScale.add("difficult_alpine_hiking");

init();
}

@Override
Expand Down
Expand Up @@ -115,8 +115,6 @@ public MotorcycleFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts
defaultSpeedMap.put("road", 20);
// forestry stuff
defaultSpeedMap.put("track", 15);

init();
}

@Override
Expand Down
Expand Up @@ -131,8 +131,6 @@ public MountainBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCos

potentialBarriers.add("kissing_gate");
setSpecificClassBicycle("mtb");

init();
}

@Override
Expand Down
Expand Up @@ -124,8 +124,6 @@ public RacingBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts

setAvoidSpeedLimit(81);
setSpecificClassBicycle("roadcycling");

init();
}

@Override
Expand Down
Expand Up @@ -102,7 +102,6 @@ public WheelchairFlagEncoder(int speedBits, double speedFactor) {
maxPossibleSpeed = FERRY_SPEED;
speedDefault = MEAN_SPEED;
speedTwoDirections = true;
init();
}

@Override
Expand Down
Expand Up @@ -39,6 +39,13 @@ public void testParseConditional() throws ParseException {
assertSameDate(1970, Calendar.DECEMBER, 1, "Dec");
}

@Test
public void testCreate() throws ParseException {
DateRangeParser dateRangeParser = DateRangeParser.createInstance("2019-10-08");
assertFalse(dateRangeParser.checkCondition("2014 Oct 8-2014 Dec 12").isCheckPassed());
assertTrue(dateRangeParser.checkCondition("2019 Oct 8-2019 Dec 12").isCheckPassed());
}

@Test
public void testToString() throws ParseException {
DateRange instance = dateRangeParser.getRange("Mar-Oct");
Expand Down
Expand Up @@ -77,7 +77,7 @@ public void testWrongEncoders() {
EncodingManager.create(foot, foot);
fail("There should have been an exception");
} catch (Exception ex) {
assertEquals("You must not register a FlagEncoder (foot) twice!", ex.getMessage());
assertEquals("You must not register a FlagEncoder (foot) twice or for two EncodingManagers!", ex.getMessage());
}
}

Expand Down

0 comments on commit 46030b4

Please sign in to comment.