Skip to content

Commit 949644d

Browse files
Move filename generation to instance methods
1 parent 272fcec commit 949644d

File tree

2 files changed

+46
-50
lines changed

2 files changed

+46
-50
lines changed

src/main/java/com/conveyal/analysis/controllers/RegionalAnalysisController.java

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,14 @@ private Object getAllRegionalResults (Request req, Response res) throws IOExcept
258258
for (String destinationPointSetId : analysis.destinationPointSetIds) {
259259
String destinationsName = getDestinationsName(destinationPointSetId, userPermissions);
260260
for (int percentile : analysis.travelTimePercentiles) {
261-
FileStorageKey multiKey = RegionalAnalysis.getMultiOriginAccessFileKey(regionalAnalysisId, destinationPointSetId, percentile);
261+
FileStorageKey multiKey = analysis.getMultiOriginAccessFileKey(destinationPointSetId, percentile);
262262
File multiThresholdFile = fileStorage.getFile(multiKey);
263263
for (int cutoffMinutes : analysis.cutoffsMinutes) {
264-
FileStorageKey singleCutoffKey = RegionalAnalysis.getSingleCutoffGridFileKey(regionalAnalysisId, destinationPointSetId, percentile, cutoffMinutes, FileStorageFormat.GEOTIFF);
264+
FileStorageKey singleCutoffKey = analysis.getSingleCutoffGridFileKey(destinationPointSetId, percentile, cutoffMinutes, FileStorageFormat.GEOTIFF);
265265
if (!fileStorage.exists(singleCutoffKey)) {
266266
generateSingleThresholdResultsFile(multiThresholdFile, singleCutoffKey, cutoffMinutes, FileStorageFormat.GEOTIFF);
267267
}
268-
String humanName = RegionalAnalysis.getSingleCutoffGridFileKey(analysis.humanName(), destinationsName, percentile, cutoffMinutes, FileStorageFormat.GEOTIFF).path;
268+
String humanName = analysis.getSingleCutoffGridFileKey(analysis.humanName(), destinationsName, percentile, cutoffMinutes, FileStorageFormat.GEOTIFF).path;
269269
fileKeys.put(humanName, singleCutoffKey);
270270
progressListener.increment();
271271
}
@@ -375,9 +375,9 @@ private UrlWithHumanName getRegionalResults (Request req, Response res) throws I
375375
"Dual access thresholds for this regional analysis must be taken from this list: (%s)",
376376
Ints.join(", ", thresholds)
377377
);
378-
singleThresholdKey = RegionalAnalysis.getSingleThresholdDualAccessGridFileKey(regionalAnalysisId, destinationPointSetId, percentile, threshold, format);
379-
multiKey = RegionalAnalysis.getMultiOriginDualAccessFileKey(regionalAnalysisId, destinationPointSetId, percentile);
380-
humanName = RegionalAnalysis.getSingleThresholdDualAccessGridFileKey(analysis.humanName(), destinationsName, percentile, threshold, format).path;
378+
singleThresholdKey = analysis.getSingleThresholdDualAccessGridFileKey(destinationPointSetId, percentile, threshold, format);
379+
multiKey = analysis.getMultiOriginDualAccessFileKey(destinationPointSetId, percentile);
380+
humanName = analysis.getSingleThresholdDualAccessGridFileKey(analysis.humanName(), destinationsName, percentile, threshold, format).path;
381381
} else {
382382
// The cutoff variable holds the actual cutoff in minutes, not the position in the array of cutoffs.
383383
checkState(analysis.cutoffsMinutes != null, "Regional analysis has no cutoffs.");
@@ -389,9 +389,9 @@ private UrlWithHumanName getRegionalResults (Request req, Response res) throws I
389389
"Travel time cutoff for this regional analysis must be taken from this list: (%s)",
390390
Ints.join(", ", analysis.cutoffsMinutes)
391391
);
392-
singleThresholdKey = RegionalAnalysis.getSingleCutoffGridFileKey(regionalAnalysisId, destinationPointSetId, percentile, threshold, format);
393-
multiKey = RegionalAnalysis.getMultiOriginAccessFileKey(regionalAnalysisId, destinationPointSetId, percentile);
394-
humanName = RegionalAnalysis.getSingleCutoffGridFileKey(analysis.humanName(), destinationsName, percentile, threshold, format).path;
392+
singleThresholdKey = analysis.getSingleCutoffGridFileKey(destinationPointSetId, percentile, threshold, format);
393+
multiKey = analysis.getMultiOriginAccessFileKey(destinationPointSetId, percentile);
394+
humanName = analysis.getSingleCutoffGridFileKey(analysis.humanName(), destinationsName, percentile, threshold, format).path;
395395
}
396396

397397
if (!fileStorage.exists(singleThresholdKey)) {
@@ -425,7 +425,7 @@ private Object getCsvResults (Request req, Response res) {
425425
throw AnalysisServerException.notFound("This regional analysis does not contain CSV results of type " + resultType);
426426
}
427427

428-
FileStorageKey fileStorageKey = RegionalAnalysis.getCsvResultFileKey(analysis._id, resultType);
428+
FileStorageKey fileStorageKey = analysis.getCsvResultFileKey(resultType);
429429

430430
// TODO handle JSON with human name on UI side
431431
// res.type(APPLICATION_JSON.asString());
@@ -452,13 +452,6 @@ private RegionalAnalysis createRegionalAnalysis (Request req, Response res) thro
452452
analysisRequest.makeTauiSite = true;
453453
}
454454

455-
if (analysisRequest.name.contains("MULTI_CUTOFF")) {
456-
// Hidden feature: allows us to test multiple cutoffs and percentiles without modifying UI.
457-
// These arrays could also be sent in the API payload. Either way, they will override any single cutoff.
458-
analysisRequest.cutoffsMinutes = DEFAULT_CUTOFFS;
459-
analysisRequest.percentiles = DEFAULT_REGIONAL_PERCENTILES;
460-
}
461-
462455
// Create an internal RegionalTask and RegionalAnalysis from the AnalysisRequest sent by the client.
463456
// TODO now this is setting cutoffs and percentiles in the regional (template) task.
464457
// why is some stuff set in this populate method, and other things set here in the caller?
@@ -509,7 +502,6 @@ private RegionalAnalysis createRegionalAnalysis (Request req, Response res) thro
509502

510503
// Set the origin pointset key if an ID is specified. Currently this will always be a freeform pointset.
511504
// Also load this freeform origin pointset instance itself, so broker can see point coordinates, ids etc.
512-
513505
if (analysisRequest.originPointSetId != null) {
514506
task.originPointSetKey = Persistence.opportunityDatasets
515507
.findByIdIfPermitted(analysisRequest.originPointSetId, userPermissions).storageLocation();
@@ -602,32 +594,25 @@ private RegionalAnalysis createRegionalAnalysis (Request req, Response res) thro
602594
regionalAnalysis.workerVersion = analysisRequest.workerVersion;
603595
regionalAnalysis.zoom = task.zoom;
604596

605-
// Store the full array of multiple cutoffs.
606-
checkNotNull(analysisRequest.cutoffsMinutes);
607-
checkArgument(analysisRequest.cutoffsMinutes.length > 0);
597+
// Store the full array of multiple cutoffs and percentiles.
608598
regionalAnalysis.cutoffsMinutes = analysisRequest.cutoffsMinutes;
609-
610-
// Same process as for cutoffsMinutes, but for percentiles.
611-
checkNotNull(analysisRequest.percentiles);
612-
checkArgument(analysisRequest.percentiles.length > 0);
613599
regionalAnalysis.travelTimePercentiles = analysisRequest.percentiles;
614600

615601
// Persist this newly created RegionalAnalysis to Mongo.
616-
// This assigns it creation/update time stamps and an ID, which is needed to name any output CSV files.
602+
// This assigns it creation/update time stamps and an ID, which is needed to name any output files.
617603
regionalAnalysis = Persistence.regionalAnalyses.create(regionalAnalysis);
618604

619605
// Set the job ID on the task, which is used by the MultiOriginAssembler and Broker.
620606
task.jobId = regionalAnalysis._id;
621607

622-
// Create the result writers
608+
// Create the result writers. The file names need the job ID.
623609
Map<FileStorageKey, BaseResultWriter> resultWriters = new HashMap<>();
624610
if (task.originPointSet == null) {
625611
WebMercatorExtents extents = task.getWebMercatorExtents();
626612
for (int destinationsIndex = 0; destinationsIndex < task.destinationPointSetKeys.length; destinationsIndex++) {
627613
for (int percentilesIndex = 0; percentilesIndex < task.percentiles.length; percentilesIndex++) {
628614
if (task.recordAccessibility) {
629-
FileStorageKey fileKey = RegionalAnalysis.getMultiOriginAccessFileKey(
630-
task.jobId,
615+
FileStorageKey fileKey = regionalAnalysis.getMultiOriginAccessFileKey(
631616
regionalAnalysis.destinationPointSetIds[destinationsIndex],
632617
task.percentiles[percentilesIndex]
633618
);
@@ -641,8 +626,7 @@ private RegionalAnalysis createRegionalAnalysis (Request req, Response res) thro
641626
}
642627

643628
if (task.includeTemporalDensity) {
644-
FileStorageKey fileKey = RegionalAnalysis.getMultiOriginDualAccessFileKey(
645-
task.jobId,
629+
FileStorageKey fileKey = regionalAnalysis.getMultiOriginDualAccessFileKey(
646630
regionalAnalysis.destinationPointSetIds[destinationsIndex],
647631
task.percentiles[percentilesIndex]
648632
);
@@ -659,26 +643,26 @@ private RegionalAnalysis createRegionalAnalysis (Request req, Response res) thro
659643
} else {
660644
if (task.recordAccessibility) {
661645
// Freeform origins - create CSV regional analysis results
662-
FileStorageKey fileKey = RegionalAnalysis.getCsvResultFileKey(task.jobId, CsvResultType.ACCESS);
646+
FileStorageKey fileKey = regionalAnalysis.getCsvResultFileKey(CsvResultType.ACCESS);
663647
resultWriters.put(fileKey, new AccessCsvResultWriter(task));
664648
regionalAnalysis.resultStorage.put(CsvResultType.ACCESS, fileKey.path);
665649
}
666650

667651
if (task.includeTemporalDensity) {
668-
FileStorageKey fileKey = RegionalAnalysis.getCsvResultFileKey(task.jobId, CsvResultType.TDENSITY);
652+
FileStorageKey fileKey = regionalAnalysis.getCsvResultFileKey(CsvResultType.TDENSITY);
669653
resultWriters.put(fileKey, new TemporalDensityCsvResultWriter(task));
670654
regionalAnalysis.resultStorage.put(CsvResultType.TDENSITY, fileKey.path);
671655
}
672656
}
673657

674658
if (task.recordTimes) {
675-
FileStorageKey fileKey = RegionalAnalysis.getCsvResultFileKey(task.jobId, CsvResultType.TIMES);
659+
FileStorageKey fileKey = regionalAnalysis.getCsvResultFileKey(CsvResultType.TIMES);
676660
resultWriters.put(fileKey, new TimeCsvResultWriter(task));
677661
regionalAnalysis.resultStorage.put(CsvResultType.TIMES, fileKey.path);
678662
}
679663

680664
if (task.includePathResults) {
681-
FileStorageKey fileKey = RegionalAnalysis.getCsvResultFileKey(task.jobId, CsvResultType.PATHS);
665+
FileStorageKey fileKey = regionalAnalysis.getCsvResultFileKey(CsvResultType.PATHS);
682666
resultWriters.put(fileKey, new PathCsvResultWriter(task));
683667
regionalAnalysis.resultStorage.put(CsvResultType.PATHS, fileKey.path);
684668
}
@@ -705,7 +689,7 @@ private RegionalAnalysis updateRegionalAnalysis (Request request, Response respo
705689
}
706690

707691
private void storeScenarioJson (RegionalAnalysis regionalAnalysis, Scenario scenario) {
708-
FileStorageKey fileStorageKey = RegionalAnalysis.getScenarioJsonFileKey(regionalAnalysis._id, scenario.id);
692+
FileStorageKey fileStorageKey = regionalAnalysis.getScenarioJsonFileKey(scenario.id);
709693
try {
710694
File localScenario = FileUtils.createScratchFile("json");
711695
JsonUtil.objectMapper.writeValue(localScenario, scenario);

src/main/java/com/conveyal/analysis/models/RegionalAnalysis.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -95,35 +95,47 @@ public RegionalAnalysis clone () {
9595
}
9696
}
9797

98-
private static String getMultiOriginFileBaseName(String analysisId, String destinations, int percentile) {
99-
return String.format("%s_%s_P%d", analysisId, destinations, percentile);
98+
private String getMultiOriginFileBaseName(String prefix, String destinations, int percentile) {
99+
return String.format("%s_%s_P%d", prefix, destinations, percentile);
100100
}
101101

102-
public static FileStorageKey getMultiOriginAccessFileKey(String analysisId, String destinations, int percentile) {
103-
return new FileStorageKey(RESULTS, getMultiOriginFileBaseName(analysisId, destinations, percentile) + ".access");
102+
private String getMultiOriginFileBaseName(String destinations, int percentile) {
103+
return getMultiOriginFileBaseName(_id, destinations, percentile);
104104
}
105105

106-
public static FileStorageKey getSingleCutoffGridFileKey(String analysisId, String destinations, int percentile, int cutoff, FileStorageFormat format) {
106+
public FileStorageKey getMultiOriginAccessFileKey(String destinations, int percentile) {
107+
return new FileStorageKey(RESULTS, getMultiOriginFileBaseName(destinations, percentile) + ".access");
108+
}
109+
110+
public FileStorageKey getSingleCutoffGridFileKey(String name, String destinations, int percentile, int cutoff, FileStorageFormat format) {
107111
String extension = format.extension.toLowerCase(Locale.ROOT);
108-
String path = String.format("%s_C%d.%s", getMultiOriginFileBaseName(analysisId, destinations, percentile), cutoff, extension);
112+
String path = String.format("%s_C%d.%s", getMultiOriginFileBaseName(name, destinations, percentile), cutoff, extension);
109113
return new FileStorageKey(RESULTS, path);
110114
}
111115

112-
public static FileStorageKey getMultiOriginDualAccessFileKey(String analysisId, String destinations, int percentile) {
113-
return new FileStorageKey(RESULTS, getMultiOriginFileBaseName(analysisId, destinations, percentile) + ".dual.access");
116+
public FileStorageKey getSingleCutoffGridFileKey(String destinations, int percentile, int cutoff, FileStorageFormat format) {
117+
return getSingleCutoffGridFileKey(_id, destinations, percentile, cutoff, format);
118+
}
119+
120+
public FileStorageKey getMultiOriginDualAccessFileKey(String destinations, int percentile) {
121+
return new FileStorageKey(RESULTS, getMultiOriginFileBaseName(destinations, percentile) + ".dual.access");
114122
}
115123

116-
public static FileStorageKey getSingleThresholdDualAccessGridFileKey(String analysisId, String destinations, int percentile, int threshold, FileStorageFormat format) {
124+
public FileStorageKey getSingleThresholdDualAccessGridFileKey(String name, String destinations, int percentile, int threshold, FileStorageFormat format) {
117125
String extension = format.extension.toLowerCase(Locale.ROOT);
118-
String path = String.format("%s_T%d.%s", getMultiOriginFileBaseName(analysisId, destinations, percentile), threshold, extension);
126+
String path = String.format("%s_T%d.%s", getMultiOriginFileBaseName(name, destinations, percentile), threshold, extension);
119127
return new FileStorageKey(RESULTS, path);
120128
}
121129

122-
public static FileStorageKey getCsvResultFileKey(String analysisId, CsvResultType resultType) {
123-
return new FileStorageKey(RESULTS, analysisId + "_" + resultType + ".csv");
130+
public FileStorageKey getSingleThresholdDualAccessGridFileKey(String destinations, int percentile, int threshold, FileStorageFormat format) {
131+
return getSingleThresholdDualAccessGridFileKey(_id, destinations, percentile, threshold, format);
132+
}
133+
134+
public FileStorageKey getCsvResultFileKey(CsvResultType resultType) {
135+
return new FileStorageKey(RESULTS, _id + "_" + resultType + ".csv");
124136
}
125137

126-
public static FileStorageKey getScenarioJsonFileKey(String analysisId, String scenarioId) {
127-
return new FileStorageKey(BUNDLES, analysisId + "_" + scenarioId + ".json");
138+
public FileStorageKey getScenarioJsonFileKey(String scenarioId) {
139+
return new FileStorageKey(BUNDLES, _id + "_" + scenarioId + ".json");
128140
}
129141
}

0 commit comments

Comments
 (0)