Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/FloodDurationProcessor.java @ 9205:3dae6b78e1da
inundationDuration/floodDuration multiple columns+chartLines refactoring
author | gernotbelger |
---|---|
date | Mon, 02 Jul 2018 19:01:09 +0200 |
parents | 9831f6c60473 |
children | 53cc5b496692 |
comparison
equal
deleted
inserted
replaced
9204:4f411c6ee3ae | 9205:3dae6b78e1da |
---|---|
8 * documentation coming with Dive4Elements River for details. | 8 * documentation coming with Dive4Elements River for details. |
9 */ | 9 */ |
10 | 10 |
11 package org.dive4elements.river.artifacts.sinfo.common; | 11 package org.dive4elements.river.artifacts.sinfo.common; |
12 | 12 |
13 import java.util.Collection; | |
13 import java.util.HashSet; | 14 import java.util.HashSet; |
15 import java.util.List; | |
14 import java.util.Set; | 16 import java.util.Set; |
17 import java.util.function.Function; | |
15 | 18 |
16 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; | 19 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; |
17 import org.dive4elements.artifactdatabase.state.Facet; | 20 import org.dive4elements.artifactdatabase.state.Facet; |
18 import org.dive4elements.artifacts.CallContext; | 21 import org.dive4elements.artifacts.CallContext; |
19 import org.dive4elements.river.artifacts.common.AbstractCalculationResult; | 22 import org.dive4elements.river.artifacts.common.AbstractCalculationResult; |
23 import org.dive4elements.river.artifacts.common.GeneralResultType; | |
24 import org.dive4elements.river.artifacts.common.ResultRow; | |
20 import org.dive4elements.river.artifacts.resources.Resources; | 25 import org.dive4elements.river.artifacts.resources.Resources; |
26 import org.dive4elements.river.artifacts.sinfo.flood_duration.DurationWaterlevel; | |
21 import org.dive4elements.river.artifacts.sinfo.flood_duration.FloodDurationCalculationResult; | 27 import org.dive4elements.river.artifacts.sinfo.flood_duration.FloodDurationCalculationResult; |
22 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; | 28 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; |
23 import org.dive4elements.river.exports.DiagramGenerator; | 29 import org.dive4elements.river.exports.DiagramGenerator; |
24 import org.dive4elements.river.themes.ThemeDocument; | 30 import org.dive4elements.river.themes.ThemeDocument; |
31 | |
32 import gnu.trove.TDoubleArrayList; | |
25 | 33 |
26 /** | 34 /** |
27 * Processor to generate the facet and data series of infrastructure flood durations | 35 * Processor to generate the facet and data series of infrastructure flood durations |
28 * | 36 * |
29 * @author Matthias Schäfer | 37 * @author Matthias Schäfer |
30 * | 38 * |
31 */ | 39 */ |
32 public final class FloodDurationProcessor extends AbstractSInfoProcessor { | 40 public final class FloodDurationProcessor extends AbstractSInfoProcessor { |
33 | 41 |
34 public static final String FACET_FLOOD_DURATION = "sinfo_facet_flood_duration"; | 42 private static final String FACET_FLOOD_DURATION = "sinfo_facet_flood_duration"; |
35 | 43 |
36 public static final String FACET_FLOOD_DURATION_DESCRIPTION = "sinfo_facet_flood_duration.description"; | 44 private static final String FACET_FLOOD_DURATION_DESCRIPTION = "sinfo_facet_flood_duration.description"; |
37 | 45 |
38 public static final String FACET_MAIN_VALUE_1_DURATION = "mainvalue.1.duration"; | 46 private static final String FACET_MAIN_VALUE_DURATION = "mainvalue.duration"; |
39 | 47 |
40 public static final String FACET_MAIN_VALUE_2_DURATION = "mainvalue.2.duration"; | 48 private static final String FACET_MAIN_VALUE_DURATION_DESCRIPTION = "mainvalue.duration.description"; |
41 | |
42 public static final String FACET_MAIN_VALUE_3_DURATION = "mainvalue.3.duration"; | |
43 | |
44 public static final String FACET_MAIN_VALUE_DURATION_DESCRIPTION = "mainvalue.duration.description"; | |
45 | 49 |
46 private static final String I18N_AXIS_LABEL = "sinfo.chart.flood_duration.section.yaxis.label"; | 50 private static final String I18N_AXIS_LABEL = "sinfo.chart.flood_duration.section.yaxis.label"; |
47 | 51 |
48 private static final Set<String> HANDLED_FACET_TYPES = new HashSet<>(); | 52 private static final Set<String> HANDLED_FACET_TYPES = new HashSet<>(); |
49 | 53 |
50 static { | 54 static { |
51 HANDLED_FACET_TYPES.add(FACET_FLOOD_DURATION); | 55 HANDLED_FACET_TYPES.add(FACET_FLOOD_DURATION); |
52 HANDLED_FACET_TYPES.add(FACET_MAIN_VALUE_1_DURATION); | 56 HANDLED_FACET_TYPES.add(FACET_MAIN_VALUE_DURATION); |
53 HANDLED_FACET_TYPES.add(FACET_MAIN_VALUE_2_DURATION); | 57 |
54 HANDLED_FACET_TYPES.add(FACET_MAIN_VALUE_3_DURATION); | |
55 } | 58 } |
56 | 59 |
57 public FloodDurationProcessor() { | 60 public FloodDurationProcessor() { |
58 super(I18N_AXIS_LABEL, HANDLED_FACET_TYPES); | 61 super(I18N_AXIS_LABEL, HANDLED_FACET_TYPES); |
59 } | 62 } |
60 | 63 |
61 // @Override TODO: REMOVE (has been replaced by doGetType | 64 public static Facet createFloodDurationFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, |
62 // protected double[][] doGetPoints(final AbstractCalculationResult data, final String facetName) { | 65 final int resultIndex) { |
63 // | |
64 // if (FACET_FLOOD_DURATION.contentEquals(facetName)) | |
65 // return ((FloodDurationCalculationResult) data).fetchInfrastructurePoints(SInfoResultType.floodDuration); | |
66 // | |
67 // if (FACET_MAIN_VALUE_1_DURATION.contentEquals(facetName)) | |
68 // return ((FloodDurationCalculationResult) data).fetchMainValuePoints(SInfoResultType.mainValue1Duration); | |
69 // | |
70 // if (FACET_MAIN_VALUE_2_DURATION.contentEquals(facetName)) | |
71 // return ((FloodDurationCalculationResult) data).fetchMainValuePoints(SInfoResultType.mainValue2Duration); | |
72 // | |
73 // if (FACET_MAIN_VALUE_3_DURATION.contentEquals(facetName)) | |
74 // return ((FloodDurationCalculationResult) data).fetchMainValuePoints(SInfoResultType.mainValue3Duration); | |
75 // | |
76 // final String error = String.format("Unknown facet name: %s", facetName); | |
77 // throw new UnsupportedOperationException(error); | |
78 // } | |
79 | 66 |
80 public static Facet createFloodDurationFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, | 67 return AbstractSInfoProcessor.createFacet(context, hash, id, result, resultIndex, -1, I18N_AXIS_LABEL, FACET_FLOOD_DURATION, |
81 final int index) { | 68 FACET_FLOOD_DURATION_DESCRIPTION); |
82 | |
83 return AbstractSInfoProcessor.createFacet(context, hash, id, result, index, I18N_AXIS_LABEL, FACET_FLOOD_DURATION, FACET_FLOOD_DURATION_DESCRIPTION); | |
84 } | |
85 | |
86 private SInfoResultType doGetType(final String facetName) { | |
87 | |
88 if (FACET_FLOOD_DURATION.contentEquals(facetName)) | |
89 return SInfoResultType.floodDuration; | |
90 | |
91 if (FACET_MAIN_VALUE_1_DURATION.contentEquals(facetName)) | |
92 return SInfoResultType.mainValue1Duration; | |
93 | |
94 if (FACET_MAIN_VALUE_2_DURATION.contentEquals(facetName)) | |
95 return SInfoResultType.mainValue2Duration; | |
96 | |
97 if (FACET_MAIN_VALUE_3_DURATION.contentEquals(facetName)) | |
98 return SInfoResultType.mainValue3Duration; | |
99 | |
100 final String error = String.format("Unknown facet name: %s", facetName); | |
101 throw new UnsupportedOperationException(error); | |
102 | |
103 } | 69 } |
104 | 70 |
105 public static Facet createMainValueDurationFacet(final CallContext context, final String hash, final String id, final FloodDurationCalculationResult result, | 71 public static Facet createMainValueDurationFacet(final CallContext context, final String hash, final String id, final FloodDurationCalculationResult result, |
106 final int index) { | 72 final int facetIndex, final int resultIndex, final int dataIndex) { |
107 | 73 |
108 final String description = Resources.getMsg(context.getMeta(), FACET_MAIN_VALUE_DURATION_DESCRIPTION, FACET_MAIN_VALUE_DURATION_DESCRIPTION, | 74 final String description = Resources.getMsg(context.getMeta(), FACET_MAIN_VALUE_DURATION_DESCRIPTION, FACET_MAIN_VALUE_DURATION_DESCRIPTION, |
109 result.getMainValueLabel(index)); | 75 result.getMainValueLabel(resultIndex)); |
110 assert ((index >= 0) && (index <= 2)); | 76 |
111 final String facetName = new String[] { FACET_MAIN_VALUE_1_DURATION, FACET_MAIN_VALUE_2_DURATION, FACET_MAIN_VALUE_3_DURATION }[index]; | 77 return new SInfoResultFacet(facetIndex, resultIndex, dataIndex, FACET_MAIN_VALUE_DURATION, description, I18N_AXIS_LABEL, ComputeType.ADVANCE, id, hash); |
112 return new SInfoResultFacet(0, facetName, description, I18N_AXIS_LABEL, ComputeType.ADVANCE, id, hash); | |
113 } | 78 } |
114 | 79 |
115 @Override | 80 @Override |
116 protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { | 81 protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { |
82 final String facetName = bundle.getFacetName(); | |
117 | 83 |
118 return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), GAP_DISTANCE); | 84 if (FACET_FLOOD_DURATION.contentEquals(facetName)) |
85 return buildSeriesForType(generator, bundle, theme, visible, SInfoResultType.floodDuration, null); | |
86 | |
87 if (FACET_MAIN_VALUE_DURATION.contentEquals(facetName)) { | |
88 | |
89 final Function<DurationWaterlevel, Double> valueGetter = new Function<DurationWaterlevel, Double>() { | |
90 @Override | |
91 public Double apply(final DurationWaterlevel waterlevel) { | |
92 return (double) waterlevel.getFloodDurDaysPerYear(); | |
93 } | |
94 }; | |
95 | |
96 // FIXME: instead (see CollisionXXProcessor) delegate to result | |
97 final double[][] points = getMainValueDurationPoints(generator, bundle, valueGetter); | |
98 | |
99 return buildSeriesForType(points, generator, bundle, theme, visible, null); | |
100 } | |
101 | |
102 final String error = String.format("Unknown facet name: %s", facetName); | |
103 throw new UnsupportedOperationException(error); | |
104 } | |
105 | |
106 public static final double[][] getMainValueDurationPoints(final DiagramGenerator generator, final ArtifactAndFacet bundle, | |
107 final Function<DurationWaterlevel, Double> valueGetter) { | |
108 | |
109 final AbstractCalculationResult data = getResult(generator, bundle); | |
110 | |
111 final int index = getDataIndex(bundle); | |
112 | |
113 ((SInfoResultFacet) bundle.getFacet()).getDataIndex(); | |
114 | |
115 final Collection<ResultRow> rows = data.getRows(); | |
116 | |
117 final TDoubleArrayList xPoints = new TDoubleArrayList(rows.size()); | |
118 final TDoubleArrayList yPoints = new TDoubleArrayList(rows.size()); | |
119 | |
120 for (final ResultRow row : rows) { | |
121 | |
122 final double station = row.getDoubleValue(GeneralResultType.station); | |
123 | |
124 final List<DurationWaterlevel> waterlevels = (List<DurationWaterlevel>) row.getValue(SInfoResultType.customMultiRowColWaterlevel); | |
125 final DurationWaterlevel waterlevel = waterlevels.get(index); | |
126 | |
127 final Double value = valueGetter.apply(waterlevel); | |
128 | |
129 xPoints.add(station); | |
130 yPoints.add(value); | |
131 } | |
132 | |
133 return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() }; | |
119 } | 134 } |
120 } | 135 } |