Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/DefaultBedHeights.java @ 9706:299c1c61d8ef
zu 1.1. Sohlhöhen-Überlappung
author | dnt_bjoernsen <d.tironi@bjoernsen.de> |
---|---|
date | Fri, 22 Jan 2021 12:28:58 +0100 |
parents | b9c87bbff6a4 |
children | b74f817435fe |
comparison
equal
deleted
inserted
replaced
9705:bfdf98529a66 | 9706:299c1c61d8ef |
---|---|
20 import org.dive4elements.river.model.BedHeight; | 20 import org.dive4elements.river.model.BedHeight; |
21 import org.dive4elements.river.model.Range; | 21 import org.dive4elements.river.model.Range; |
22 import org.dive4elements.river.model.River; | 22 import org.dive4elements.river.model.River; |
23 | 23 |
24 /** | 24 /** |
25 * This class knows how to find the default bed levels defined for tkh and other calculations | 25 * This class knows how to find the default bed levels defined for tkh and other |
26 * calculations | |
26 * | 27 * |
27 * @author Gernot Belger | 28 * @author Gernot Belger |
28 */ | 29 */ |
29 public final class DefaultBedHeights { | 30 public final class DefaultBedHeights { |
30 | 31 |
31 private final River river; | 32 private final River river; |
32 | 33 |
33 public DefaultBedHeights(final River river) { | 34 public DefaultBedHeights(final River river) { |
34 this.river = river; | 35 this.river = river; |
35 } | 36 } |
36 | 37 |
37 public List<BedHeight> getBedHeights(final Calculation problems) { | 38 public List<BedHeight> getBedHeights(final Calculation problems) { |
38 final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); | 39 final Collection<DefaultBedHeight> defaults = DefaultBedHeightsConfig.getDefaults(this.river, problems); |
40 // check ob jede default-range irgendeine andere überlappt | |
39 | 41 |
40 final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems); | 42 for (DefaultBedHeight check : defaults) { |
41 if (defaultBedHeights.isEmpty()) { | 43 double end = check.endKm > check.startKm ? check.endKm : check.startKm; |
42 problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName()); | 44 double start = check.startKm < check.endKm ? check.startKm : check.endKm; |
43 return Collections.emptyList(); | |
44 } | |
45 | 45 |
46 /* check for overlapping ranges, N2-search, but we expect only have small numbers of bed levels */ | 46 for (DefaultBedHeight checkInner : defaults) { |
47 final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size()); | 47 if (!checkInner.description.equals(check.description) |
48 && (checkInner.startKm < end && checkInner.endKm > start)) | |
49 problems.addProblem("sinfo.bedheightsfinder.overlappingrange", check.description); | |
50 } | |
51 } | |
48 | 52 |
49 for (int i = 0; i < defaultBedHeights.size(); i++) { | 53 final List<BedHeight> defaultBedHeights = loadBedHeightsByName(this.river, defaults, problems); |
50 final BedHeight bedHeight = defaultBedHeights.get(i); | 54 if (defaultBedHeights.isEmpty()) { |
55 problems.addProblem("sinfo.bedheightsfinder.nobedheightsforriver", this.river.getName()); | |
56 return Collections.emptyList(); | |
57 } | |
51 | 58 |
52 final Range range = bedHeight.getRange(); | 59 /* |
53 final NumberRange bedRange = new NumberRange(range.getA(), range.getB()); | 60 * check for overlapping ranges, N2-search, but we expect only have small |
61 * numbers of bed levels | |
62 */ | |
63 final List<BedHeight> result = new ArrayList<>(defaultBedHeights.size()); | |
54 | 64 |
55 if (overlapsRange(bedRange, defaultBedHeights, i + 1)) | 65 for (int i = 0; i < defaultBedHeights.size(); i++) { |
56 problems.addProblem("sinfo.bedheightsfinder.overlappingrange", bedHeight.getDescription()); | |
57 else | |
58 result.add(bedHeight); | |
59 } | |
60 | 66 |
61 final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size()); | 67 final BedHeight bedHeight = defaultBedHeights.get(i); |
62 | 68 |
63 // REMARK: check for bad ranges because db schema allow for incomplete ranges, and ignore if this is the case | 69 DefaultBedHeight configuredBH = getConfiguredBedheightByDescription(problems, defaults, |
64 for (final BedHeight bedHeight : defaultBedHeights) { | 70 bedHeight.getDescription()); |
65 | 71 |
66 final Range range = bedHeight.getRange(); | 72 final double startKm = configuredBH.startKm < configuredBH.endKm ? configuredBH.startKm |
73 : configuredBH.endKm; | |
74 final double endKm = configuredBH.endKm > configuredBH.startKm ? configuredBH.endKm : configuredBH.startKm; | |
75 // final NumberRange bedRange = new NumberRange(range.getA(), range.getB()); | |
67 | 76 |
68 if (range.getA() == null || range.getB() == null) | 77 // FIXME: optional: deckt die echte Range (Datenbank) die |
69 problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription()); | 78 // konfigurierte Range ab? |
70 else | |
71 validBedHeights.add(bedHeight); | |
72 } | |
73 | 79 |
74 return result; | 80 // copy bedheight and restrict to configured ranges |
75 } | 81 BedHeight rangedBedheight = BedHeight.copyPojoFrom(bedHeight, startKm, endKm); |
82 result.add(rangedBedheight); | |
83 } | |
76 | 84 |
77 private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, final Calculation problems) { | 85 final List<BedHeight> validBedHeights = new ArrayList<>(defaultBedHeights.size()); |
78 | 86 |
79 final List<BedHeight> bedHeights = new ArrayList<>(defaults.size()); | 87 // REMARK: check for bad ranges because db schema allow for incomplete ranges, |
88 // and ignore if this is the case | |
89 for (final BedHeight bedHeight : defaultBedHeights) { | |
80 | 90 |
81 for (final DefaultBedHeight heightDefault : defaults) { | 91 final Range range = bedHeight.getRange(); |
82 | 92 |
83 final String description = heightDefault.description; | 93 if (range.getA() == null || range.getB() == null) |
84 try { | 94 problems.addProblem("sinfo.bedheightsfinder.badrange", bedHeight.getDescription()); |
95 else | |
96 validBedHeights.add(bedHeight); | |
97 } | |
85 | 98 |
86 final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, heightDefault.startKm, heightDefault.endKm); | 99 return result; |
87 if (bedHeight == null) | 100 } |
88 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); | |
89 else | |
90 bedHeights.add(bedHeight); | |
91 } | |
92 catch (final Exception e) { | |
93 e.printStackTrace(); | |
94 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); | |
95 } | |
96 } | |
97 | 101 |
98 return bedHeights; | 102 private DefaultBedHeight getConfiguredBedheightByDescription(Calculation problems, |
99 } | 103 Collection<DefaultBedHeight> defaults, String description) { |
104 for (DefaultBedHeight bh : defaults) { | |
105 if (bh.description.equals(description)) | |
106 return bh; | |
107 } | |
108 problems.addProblem("could not find the configured bedheight, which is not possible", description); | |
109 return null; | |
110 } | |
100 | 111 |
101 private static boolean overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final int startIndex) { | 112 private static List<BedHeight> loadBedHeightsByName(final River river, final Collection<DefaultBedHeight> defaults, |
113 final Calculation problems) { | |
102 | 114 |
103 for (int i = startIndex; i < result.size(); i++) { | 115 final List<BedHeight> bedHeights = new ArrayList<>(defaults.size()); |
104 | 116 |
105 final BedHeight compareBed = result.get(i); | 117 for (final DefaultBedHeight heightDefault : defaults) { |
106 final Range range = compareBed.getRange(); | |
107 final NumberRange compareRange = new NumberRange(range.getA(), range.getB()); | |
108 | 118 |
109 if (compareRange.overlapsRange(bedRange)) | 119 final String description = heightDefault.description; |
110 return true; | 120 try { |
111 } | |
112 | 121 |
113 return false; | 122 final BedHeight bedHeight = BedHeight.getBedHeightByDescription(river, description, |
114 } | 123 heightDefault.startKm, heightDefault.endKm); |
124 if (bedHeight == null) | |
125 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); | |
126 else | |
127 bedHeights.add(bedHeight); | |
128 } catch (final Exception e) { | |
129 e.printStackTrace(); | |
130 problems.addProblem("sinfo.bedheightsfinder.missingdescription", river.getName(), description); | |
131 } | |
132 } | |
133 | |
134 return bedHeights; | |
135 } | |
136 | |
137 /* | |
138 * this check is replaced by configRangeCheck private static boolean | |
139 * overlapsRange(final NumberRange bedRange, final List<BedHeight> result, final | |
140 * int startIndex) { | |
141 * | |
142 * for (int i = startIndex; i < result.size(); i++) { | |
143 * | |
144 * final BedHeight compareBed = result.get(i); final Range range = | |
145 * compareBed.getRange(); final NumberRange compareRange = new | |
146 * NumberRange(range.getA(), range.getB()); | |
147 * | |
148 * if (compareRange.overlapsRange(bedRange)) return true; } | |
149 * | |
150 * return false; } | |
151 */ | |
115 } | 152 } |