bug5932: implemented TackTypeSegment data mining settings

This commit is contained in:
Axel Uhl committed 2023-12-27 16:44:58 +01:00
1 parent 3b374b06c5
commit fda1547486
7 files changed
+140 -11

No files matched your search

@@ -2444,4 +2444,9 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String tackTypeUnit();
String tackTypeTooltip();
String tackType();
String tackTypeSegments();
String errorMinimumDurationBetweenAdjacentTackTypeSegmentsMustNotBeNegative();
String errorMinimumTackTypeSegmentDurationMustNotBeNegative();
String minimumDurationBetweenAdjacentTackTypeSegmentsInSeconds();
String minimumTackTypeSegmentsDurationInSeconds();
}
@@ -2480,4 +2480,9 @@ incrementalScoreCorrectionInPoints=Incremental score correction (points)
errorObtainingCourseAreasForLeaderboard=Error obtaining course areas for leaderboard {0}: {1}
tackType=Long / short tack
tackTypeTooltip=For upwind: If the difference between COG and next waypoint direction is smaller than the one between COG and wind direction it is long tack (1.0); if it is smaller short tack (-1.0). For downwind: Similar to upwind but instead of "wind direction", one use the opposite direction. So where the wind is blowing to. For reaching: Similar to upwind but instead of comparing to "COG and wind direction", one use 10°.
tackTypeUnit=L=1.0, S=-1.0, Unknown=0.0
tackTypeUnit=L=1.0, S=-1.0, Unknown=0.0
tackTypeSegments=Tack type segments
errorMinimumDurationBetweenAdjacentTackTypeSegmentsMustNotBeNegative=Minimum duration between adjacent tack type segments must not be negative
errorMinimumTackTypeSegmentDurationMustNotBeNegative=Minimum duration of a tack type segment must not be negative
minimumDurationBetweenAdjacentTackTypeSegmentsInSeconds=Minimum duration between adjacent tack type segments (s)
minimumTackTypeSegmentsDurationInSeconds=Minimum duration of tack type segments (s)
@@ -2476,4 +2476,9 @@ incrementalScoreCorrectionInPoints=Inkrementelle Punktestrafe
errorObtainingCourseAreasForLeaderboard=Fehler beim Abfragen der Bahnkreise zur Veranstaltung der Rangliste {0}: {1}
tackType=Streck-/Holebug
tackTypeTooltip=Für Amwind: Wenn der Unterschied zwischen KüG und Peilung zur nächsten Bahnmarke kleiner ist als KüG und Windrichtung, handelt es sich um Streckbug (1.0); wenn es kleiner ist Holebug (-1.0). Für Vorwind: Ähnlich wie zum Amwind, aber statt "Windrichtung" nutzt man die gegenteilige Richtung. Also die, wo der Wind hin weht. Für Halbwind: Ähnlich wie zur Kreuz, aber statt "KüG und Windrichtung" nutzt man 10°.
tackTypeUnit=S=1.0, H=-1.0, Unbekannt=0.0
tackTypeUnit=S=1.0, H=-1.0, Unbekannt=0.0
tackTypeSegments=Streck-/Holebug-Segmente
errorMinimumDurationBetweenAdjacentTackTypeSegmentsMustNotBeNegative=Minimale Dauer zwischen zwei Streck-/Holebug-Segmenten darf nicht negativ sein
errorMinimumTackTypeSegmentDurationMustNotBeNegative=Minimale Dauer eines Streck-/Holebug-Segments darf nicht negativ sein
minimumDurationBetweenAdjacentTackTypeSegmentsInSeconds=Minimaler zeitlicher Abstand zwischen benachbarten Streck-/Holebug-Segmenten (s)
minimumTackTypeSegmentsDurationInSeconds=Mindestdauer eines Streck-/Holebug-Segments (s)
@@ -8,9 +8,11 @@ import com.sap.sailing.datamining.shared.ManeuverSettings;
import com.sap.sailing.datamining.shared.ManeuverSettingsImpl;
import com.sap.sailing.datamining.shared.ManeuverSpeedDetailsSettings;
import com.sap.sailing.datamining.shared.ManeuverSpeedDetailsSettingsImpl;
import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.datamining.presentation.ManeuverSettingsDialogComponent;
import com.sap.sailing.gwt.ui.datamining.presentation.ManeuverSpeedDetailsSettingsDialogComponent;
import com.sap.sailing.gwt.ui.datamining.presentation.TackTypeSegmentsDataMiningSettingsDialogComponent;
import com.sap.sailing.gwt.ui.polarmining.FoilingSegmentsDataMiningSettingsDialogComponent;
import com.sap.sailing.gwt.ui.polarmining.PolarDataMiningSettingsDialogComponent;
import com.sap.sailing.polars.datamining.shared.PolarDataMiningSettings;
@@ -28,23 +30,21 @@ public class DataMiningSettingsInfoManagerImpl implements DataMiningSettingsInfo
public DataMiningSettingsInfoManagerImpl(StringMessages stringMessages) {
this.stringMessages = stringMessages;
infosMappedBySettingsType = new HashMap<>();
// GWT doesn't support Class.isAssignableFrom and Class.getInterfaces.
// Adding every implementation of the desired type is necessary.
PolarDataMiningSettingsInfo polarDataMiningSettingsInfo = new PolarDataMiningSettingsInfo();
infosMappedBySettingsType.put(PolarDataMiningSettings.class, polarDataMiningSettingsInfo);
infosMappedBySettingsType.put(PolarDataMiningSettingsImpl.class, polarDataMiningSettingsInfo);
ManeuverSpeedDetailsSettingsInfo maneuverSpeedDetailsSettingsInfo = new ManeuverSpeedDetailsSettingsInfo();
infosMappedBySettingsType.put(ManeuverSpeedDetailsSettings.class, maneuverSpeedDetailsSettingsInfo);
infosMappedBySettingsType.put(ManeuverSpeedDetailsSettingsImpl.class, maneuverSpeedDetailsSettingsInfo);
ManeuverSettingsInfo maneuverSettingsInfo = new ManeuverSettingsInfo();
infosMappedBySettingsType.put(ManeuverSettings.class, maneuverSettingsInfo);
infosMappedBySettingsType.put(ManeuverSettingsImpl.class, maneuverSettingsInfo);
FoilingSegmentsDataMiningSettingsInfo foilingDataMiningSettingsInfo = new FoilingSegmentsDataMiningSettingsInfo();
infosMappedBySettingsType.put(FoilingSegmentsDataMiningSettings.class, foilingDataMiningSettingsInfo);
TackTypeSegmentsDataMiningSettingsInfo tackTypeDataMiningSettingsInfo = new TackTypeSegmentsDataMiningSettingsInfo();
infosMappedBySettingsType.put(TackTypeSegmentsDataMiningSettings.class, tackTypeDataMiningSettingsInfo);
}
/*
@@ -141,4 +141,24 @@ public class DataMiningSettingsInfoManagerImpl implements DataMiningSettingsInfo
return "FoilingSegmentsDataMiningSettingsInfo";
}
}
private class TackTypeSegmentsDataMiningSettingsInfo implements DataMiningSettingsInfo {
@SuppressWarnings("unchecked")
@Override
public <SettingsType extends SerializableSettings> SettingsDialogComponent<SettingsType> createSettingsDialogComponent(
SettingsType settings) {
return (SettingsDialogComponent<SettingsType>) new TackTypeSegmentsDataMiningSettingsDialogComponent(
(TackTypeSegmentsDataMiningSettings) settings);
}
@Override
public String getLocalizedName() {
return stringMessages.tackTypeSegments();
}
@Override
public String getId() {
return "TackTypeSegmentsDataMiningSettingsInfo";
}
}
}
@@ -0,0 +1,95 @@
package com.sap.sailing.gwt.ui.datamining.presentation;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Duration;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.gwt.client.dialog.DoubleBox;
import com.sap.sse.gwt.client.shared.components.SettingsDialogComponent;
/**
* Settings dialog for maneuver settings.
*
* @author Vladislav Chumak (D069712)
*
*/
public class TackTypeSegmentsDataMiningSettingsDialogComponent implements SettingsDialogComponent<TackTypeSegmentsDataMiningSettings> {
private TackTypeSegmentsDataMiningSettings settings;
private StringMessages stringMessages;
private DoubleBox minimumDurationBetweenAdjacentTackTypeSegmentsInSecondsBox;
private DoubleBox minimumTackTypeSegmentDurationInSecondsBox;
public TackTypeSegmentsDataMiningSettingsDialogComponent(TackTypeSegmentsDataMiningSettings settings) {
this.settings = settings;
this.stringMessages = StringMessages.INSTANCE;
}
@Override
public Widget getAdditionalWidget(DataEntryDialog<?> dialog) {
VerticalPanel vp = new VerticalPanel();
Grid grid = new Grid(2, 2);
grid.setCellPadding(5);
vp.add(grid);
setupGrid(grid, dialog);
return vp;
}
private void setupGrid(Grid grid, DataEntryDialog<?> dialog) {
final Label minDurationBetweenTackTypeSegmentsLabel = dialog.createLabel(stringMessages.minimumDurationBetweenAdjacentTackTypeSegmentsInSeconds());
grid.setWidget(0, 0, minDurationBetweenTackTypeSegmentsLabel);
minimumDurationBetweenAdjacentTackTypeSegmentsInSecondsBox = dialog.createDoubleBox(
settings.getMinimumTackTypeSegmentDuration() == null ? null : settings.getMinimumDurationBetweenAdjacentTackTypeSegments().asSeconds(), 10);
grid.setWidget(0, 1, minimumDurationBetweenAdjacentTackTypeSegmentsInSecondsBox);
final Label minTackTypeSegmentsDurationLabel = dialog.createLabel(stringMessages.minimumTackTypeSegmentsDurationInSeconds());
grid.setWidget(1, 0, minTackTypeSegmentsDurationLabel);
minimumTackTypeSegmentDurationInSecondsBox = dialog.createDoubleBox(
settings.getMinimumTackTypeSegmentDuration() == null ? null : settings.getMinimumTackTypeSegmentDuration().asSeconds(), 10);
grid.setWidget(1, 1, minimumTackTypeSegmentDurationInSecondsBox);
}
@Override
public TackTypeSegmentsDataMiningSettings getResult() {
return new TackTypeSegmentsDataMiningSettings(
getDurationFromSeconds(minimumDurationBetweenAdjacentTackTypeSegmentsInSecondsBox.getValue()),
getDurationFromSeconds(minimumTackTypeSegmentDurationInSecondsBox.getValue()));
}
private Duration getDurationFromSeconds(Double seconds) {
return seconds == null ? null : new MillisecondsDurationImpl((long) (seconds * 1000));
}
@Override
public FocusWidget getFocusWidget() {
return minimumDurationBetweenAdjacentTackTypeSegmentsInSecondsBox;
}
@Override
public Validator<TackTypeSegmentsDataMiningSettings> getValidator() {
return new Validator<TackTypeSegmentsDataMiningSettings>() {
@Override
public String getErrorMessage(TackTypeSegmentsDataMiningSettings valueToValidate) {
final String result;
if (valueToValidate.getMinimumDurationBetweenAdjacentTackTypeSegments() != null &&
valueToValidate.getMinimumDurationBetweenAdjacentTackTypeSegments().compareTo(Duration.NULL) < 0) {
result = stringMessages.errorMinimumDurationBetweenAdjacentTackTypeSegmentsMustNotBeNegative();
} else if (valueToValidate.getMinimumTackTypeSegmentDuration() != null &&
valueToValidate.getMinimumTackTypeSegmentDuration().compareTo(Duration.NULL) < 0) {
result = stringMessages.errorMinimumTackTypeSegmentDurationMustNotBeNegative();
} else {
result = null;
}
return result;
}
};
}
}
@@ -388,12 +388,11 @@ public class SuggestBoxStatisticProvider extends AbstractDataMiningComponent<Com
}
private List<Component<?>> createSettingsComponentsFor(final DataRetrieverChainDefinitionDTO retrieverChain) {
List<Component<?>> settingsComponents = new ArrayList<>();
for (Entry<DataRetrieverLevelDTO, SerializableSettings> retrieverLevelSettings : settingsMap.get(retrieverChain)
.entrySet()) {
final List<Component<?>> settingsComponents = new ArrayList<>();
for (final Entry<DataRetrieverLevelDTO, SerializableSettings> retrieverLevelSettings : settingsMap.get(retrieverChain).entrySet()) {
final DataRetrieverLevelDTO retrieverLevel = retrieverLevelSettings.getKey();
final Class<?> settingsType = retrieverLevelSettings.getValue().getClass();
DataMiningSettingsInfo settingsInfo = settingsManager.getSettingsInfo(settingsType);
final DataMiningSettingsInfo settingsInfo = settingsManager.getSettingsInfo(settingsType);
settingsComponents.add(new RetrieverLevelSettingsComponent(this, getComponentContext(), retrieverLevel,
settingsInfo.getId(), settingsInfo.getLocalizedName()) {
@Override
@@ -23,7 +23,7 @@ public class NullDataMiningQueryManager implements DataMiningQueryManager {
@Override
public <ResultType> QueryResult<ResultType> runNewAndAbortPrevious(DataMiningSession session, Query<ResultType> query) {
logger.info("This query manager, doesn't manage anything. Just running the query " + query);
logger.info("This query manager doesn't manage anything. Just running the query " + query);
queries.add(query);
final QueryResult<ResultType> result = query.run();
queries.remove(query);