Skip to content

Commit b15d2e1

Browse files
Move result writer creation into the regional analysis
1 parent 0111a20 commit b15d2e1

File tree

2 files changed

+63
-53
lines changed

2 files changed

+63
-53
lines changed

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

+1-51
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,8 @@
1111
import com.conveyal.analysis.models.OpportunityDataset;
1212
import com.conveyal.analysis.models.RegionalAnalysis;
1313
import com.conveyal.analysis.persistence.Persistence;
14-
import com.conveyal.analysis.results.AccessCsvResultWriter;
1514
import com.conveyal.analysis.results.CsvResultType;
16-
import com.conveyal.analysis.results.GridResultWriter;
1715
import com.conveyal.analysis.results.MultiOriginAssembler;
18-
import com.conveyal.analysis.results.PathCsvResultWriter;
19-
import com.conveyal.analysis.results.RegionalResultWriter;
20-
import com.conveyal.analysis.results.TemporalDensityCsvResultWriter;
21-
import com.conveyal.analysis.results.TimeCsvResultWriter;
2216
import com.conveyal.analysis.util.JsonUtil;
2317
import com.conveyal.file.FileStorage;
2418
import com.conveyal.file.FileStorageFormat;
@@ -54,7 +48,6 @@
5448
import static com.conveyal.analysis.util.JsonUtil.toJson;
5549
import static com.conveyal.file.FileCategory.BUNDLES;
5650
import static com.conveyal.file.FileCategory.RESULTS;
57-
import static com.conveyal.r5.common.Util.notNullOrEmpty;
5851
import static com.conveyal.r5.transit.TransportNetworkCache.getScenarioFilename;
5952
import static com.google.common.base.Preconditions.checkArgument;
6053
import static com.google.common.base.Preconditions.checkNotNull;
@@ -521,51 +514,8 @@ private RegionalAnalysis createRegionalAnalysis (Request req, Response res) thro
521514
// Create the regional job
522515
var regionalJob = new Job(task, WorkerTags.fromRegionalAnalysis(regionalAnalysis));
523516

524-
// Create the result writers. Store their result file paths in the database.
525-
var resultWriters = new ArrayList<RegionalResultWriter>();
526-
if (!task.makeTauiSite) {
527-
if (task.recordAccessibility) {
528-
if (task.originPointSet != null) {
529-
// Freeform origins - create CSV regional analysis results
530-
var accessWriter = new AccessCsvResultWriter(task);
531-
resultWriters.add(accessWriter);
532-
regionalAnalysis.resultStorage.put(accessWriter.resultType(), accessWriter.getFileName());
533-
} else {
534-
// Gridded origins - create gridded regional analysis results
535-
resultWriters.addAll(GridResultWriter.createWritersFromTask(regionalAnalysis, task));
536-
}
537-
}
538-
539-
if (task.recordTimes) {
540-
var timesWriter = new TimeCsvResultWriter(task);
541-
resultWriters.add(timesWriter);
542-
regionalAnalysis.resultStorage.put(timesWriter.resultType(), timesWriter.getFileName());
543-
}
544-
545-
if (task.includePathResults) {
546-
var pathsWriter = new PathCsvResultWriter(task);
547-
resultWriters.add(pathsWriter);
548-
regionalAnalysis.resultStorage.put(pathsWriter.resultType(), pathsWriter.getFileName());
549-
}
550-
551-
if (task.includeTemporalDensity) {
552-
if (task.originPointSet == null) {
553-
// Gridded origins. The full temporal density information is probably too voluminous to be useful.
554-
// We might want to record a grid of dual accessibility values, but this will require some serious
555-
// refactoring of the GridResultWriter.
556-
// if (job.templateTask.dualAccessibilityThreshold > 0) { ... }
557-
throw AnalysisServerException.badRequest("Temporal density of opportunities cannot be recorded for gridded origin points.");
558-
} else {
559-
var tDensityWriter = new TemporalDensityCsvResultWriter(task);
560-
resultWriters.add(tDensityWriter);
561-
regionalAnalysis.resultStorage.put(tDensityWriter.resultType(), tDensityWriter.getFileName());
562-
}
563-
}
564-
checkArgument(notNullOrEmpty(resultWriters), "A regional analysis should always create at least one grid or CSV file.");
565-
}
566-
567517
// Create the multi-origin assembler with the writers.
568-
var assembler = new MultiOriginAssembler(regionalJob, resultWriters);
518+
var assembler = new MultiOriginAssembler(regionalJob, regionalAnalysis.createResultWriters(task));
569519

570520
// Stored scenario is needed by workers. Must be done ahead of enqueueing the job.
571521
storeScenarioJson(task.graphId, task.scenario);

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

+62-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package com.conveyal.analysis.models;
22

3-
import com.conveyal.analysis.AnalysisServerException;
3+
import com.conveyal.analysis.results.AccessCsvResultWriter;
44
import com.conveyal.analysis.results.CsvResultType;
5+
import com.conveyal.analysis.results.GridResultWriter;
6+
import com.conveyal.analysis.results.PathCsvResultWriter;
7+
import com.conveyal.analysis.results.RegionalResultWriter;
8+
import com.conveyal.analysis.results.TemporalDensityCsvResultWriter;
9+
import com.conveyal.analysis.results.TimeCsvResultWriter;
510
import com.conveyal.r5.analyst.cluster.RegionalTask;
611
import org.locationtech.jts.geom.Geometry;
712

13+
import java.util.ArrayList;
814
import java.util.HashMap;
15+
import java.util.List;
916
import java.util.Map;
1017

18+
import static com.conveyal.r5.common.Util.notNullOrEmpty;
19+
import static com.google.common.base.Preconditions.checkArgument;
20+
1121
/**
1222
* Represents a single regional (multi-origin) accessibility analysis,
1323
* which may have more than one percentile and cutoff.
@@ -102,11 +112,61 @@ public class RegionalAnalysis extends Model implements Cloneable {
102112
*/
103113
public Map<CsvResultType, String> resultStorage = new HashMap<>();
104114

115+
/**
116+
* Create results writers for this regional analysis and a task. Stores the result paths that are created by the
117+
* writers.
118+
*/
119+
public List<RegionalResultWriter> createResultWriters(RegionalTask task) {
120+
// Create the result writers. Store their result file paths in the database.
121+
var resultWriters = new ArrayList<RegionalResultWriter>();
122+
if (!task.makeTauiSite) {
123+
if (task.recordAccessibility) {
124+
if (task.originPointSet != null) {
125+
// Freeform origins - create CSV regional analysis results
126+
var accessWriter = new AccessCsvResultWriter(task);
127+
resultWriters.add(accessWriter);
128+
resultStorage.put(accessWriter.resultType(), accessWriter.getFileName());
129+
} else {
130+
// Gridded origins - create gridded regional analysis results
131+
resultWriters.addAll(GridResultWriter.createWritersFromTask(this, task));
132+
}
133+
}
134+
135+
if (task.recordTimes) {
136+
var timesWriter = new TimeCsvResultWriter(task);
137+
resultWriters.add(timesWriter);
138+
resultStorage.put(timesWriter.resultType(), timesWriter.getFileName());
139+
}
140+
141+
if (task.includePathResults) {
142+
var pathsWriter = new PathCsvResultWriter(task);
143+
resultWriters.add(pathsWriter);
144+
resultStorage.put(pathsWriter.resultType(), pathsWriter.getFileName());
145+
}
146+
147+
if (task.includeTemporalDensity) {
148+
if (task.originPointSet == null) {
149+
// Gridded origins. The full temporal density information is probably too voluminous to be useful.
150+
// We might want to record a grid of dual accessibility values, but this will require some serious
151+
// refactoring of the GridResultWriter.
152+
// if (job.templateTask.dualAccessibilityThreshold > 0) { ... }
153+
throw new RuntimeException("Temporal density of opportunities cannot be recorded for gridded origin points.");
154+
} else {
155+
var tDensityWriter = new TemporalDensityCsvResultWriter(task);
156+
resultWriters.add(tDensityWriter);
157+
resultStorage.put(tDensityWriter.resultType(), tDensityWriter.getFileName());
158+
}
159+
}
160+
checkArgument(notNullOrEmpty(resultWriters), "A regional analysis should always create at least one grid or CSV file.");
161+
}
162+
return resultWriters;
163+
}
164+
105165
public RegionalAnalysis clone () {
106166
try {
107167
return (RegionalAnalysis) super.clone();
108168
} catch (CloneNotSupportedException e) {
109-
throw AnalysisServerException.unknown(e);
169+
throw new RuntimeException(e);
110170
}
111171
}
112172
}

0 commit comments

Comments
 (0)