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 }

http://dive4elements.wald.intevation.org