mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-18 02:00:58 +00:00
Merge branch 'master' into bug4370
This commit is contained in:
commit
35b2d6220c
12 files changed
+62
-20
No files matched your search
@@ -269,7 +269,7 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns {
|
||||
* competitor doesn't appear in any of the race column's attached tracked races. A 0.0 score is returned
|
||||
* if the competitor's result for <code>race</code> is discarded.
|
||||
*/
|
||||
Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) throws NoWindException;
|
||||
Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint);
|
||||
|
||||
/**
|
||||
* Tells whether the contribution of <code>raceColumn</code> is discarded in the current leaderboard's standings for
|
||||
@@ -588,4 +588,10 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns {
|
||||
BoatClass getBoatClass();
|
||||
|
||||
LeaderboardType getLeaderboardType();
|
||||
|
||||
/**
|
||||
* Tells if there is at least one non-{@code null} score for the given {@code competitor} in the
|
||||
* leaderboard.
|
||||
*/
|
||||
boolean hasScores(Competitor competitor, TimePoint timePoint);
|
||||
}
|
||||
+9
@@ -1148,4 +1148,13 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasScores(Competitor competitor, TimePoint timePoint) {
|
||||
for (final RaceColumn raceColumn : getRaceColumns()) {
|
||||
if (getTotalPoints(competitor, raceColumn, timePoint) != null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -425,13 +425,13 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) throws NoWindException {
|
||||
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) {
|
||||
return getNetPoints(competitor, raceColumn, getRaceColumns(), timePoint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn,
|
||||
Iterable<RaceColumn> raceColumnsToConsider, TimePoint timePoint) throws NoWindException {
|
||||
Iterable<RaceColumn> raceColumnsToConsider, TimePoint timePoint) {
|
||||
final Set<RaceColumn> discardedRaceColumns = getResultDiscardingRule()
|
||||
.getDiscardedRaceColumns(competitor, this, raceColumnsToConsider, timePoint);
|
||||
return getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns);
|
||||
|
||||
+1
-1
@@ -280,7 +280,7 @@ public class DelegatingRegattaLeaderboardWithCompetitorElimination extends Abstr
|
||||
return getFullLeaderboard().getMaxPointsReason(competitor, race, timePoint);
|
||||
}
|
||||
|
||||
public Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) throws NoWindException {
|
||||
public Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) {
|
||||
return getFullLeaderboard().getNetPoints(competitor, race, timePoint);
|
||||
}
|
||||
|
||||
|
||||
+10
-3
@@ -171,9 +171,16 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI
|
||||
|
||||
@Override
|
||||
public int getTrackedRank(Competitor competitor, RaceColumn race, TimePoint timePoint) {
|
||||
final List<Competitor> competitorsFromBestToWorst = ((MetaLeaderboardColumn) race).getLeaderboard().getCompetitorsFromBestToWorst(timePoint);
|
||||
Util.removeAll(getSuppressedCompetitors(), competitorsFromBestToWorst);
|
||||
return competitorsFromBestToWorst.indexOf(competitor)+1;
|
||||
final Leaderboard leaderboard = ((MetaLeaderboardColumn) race).getLeaderboard();
|
||||
final int result;
|
||||
if (leaderboard.hasScores(competitor, timePoint)) {
|
||||
final List<Competitor> competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(timePoint);
|
||||
Util.removeAll(getSuppressedCompetitors(), competitorsFromBestToWorst);
|
||||
result = competitorsFromBestToWorst.indexOf(competitor)+1;
|
||||
} else {
|
||||
result = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+6
@@ -18,6 +18,12 @@
|
||||
figures which are so important for any foiling boat class. Note, that this feature is also available
|
||||
on overall leaderboards, providing foiling stats across an entire season or event series.
|
||||
</li>
|
||||
<li>When a leaderboard belongs to a leaderboard group with an overall (series) leaderboard and the
|
||||
leaderboard has no scores at all yet for a competitor, that competitor won't be assigned a score
|
||||
in the overall (series) leaderboard either. This way, when an act or event has its leaderboard already
|
||||
linked to the series leaderboard group, no scores will show in the series leaderboard before the
|
||||
act/event starts producing scores for the competitors.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h5 class="articleSubheadline">October 2017</h5>
|
||||
|
||||
+7
@@ -12,6 +12,7 @@ import com.google.gwt.uibinder.client.UiHandler;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.CheckBox;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.FileUpload;
|
||||
import com.google.gwt.user.client.ui.FormPanel;
|
||||
@@ -35,6 +36,8 @@ public abstract class AbstractFileImportWidget extends Composite {
|
||||
@UiField FileUpload fileUploadUi;
|
||||
@UiField ListBox preferredImporterUi;
|
||||
@UiField Button importButtonUi;
|
||||
@UiField
|
||||
CheckBox downsampleUi;
|
||||
@UiField Image loadingImageUi;
|
||||
@UiField FormPanel formPanelUi;
|
||||
private final TrackFileImportDeviceIdentifierTableWrapper table;
|
||||
@@ -72,6 +75,10 @@ public abstract class AbstractFileImportWidget extends Composite {
|
||||
formPanelUi.submit();
|
||||
}
|
||||
|
||||
protected void setDownsampleOptionVisible(boolean visible) {
|
||||
downsampleUi.setVisible(visible);
|
||||
}
|
||||
|
||||
@UiHandler("formPanelUi")
|
||||
void onFileImportComplete(SubmitCompleteEvent event) {
|
||||
if (shouldClearListOnNewUploadComplete) {
|
||||
|
||||
+1
@@ -22,6 +22,7 @@
|
||||
<g:HTMLPanel addStyleNames="{style.formPanelContent}">
|
||||
<g:FileUpload name="file" ui:field="fileUploadUi"/>
|
||||
<g:ListBox name="preferredImporter" ui:field="preferredImporterUi" height="21px"/>
|
||||
<g:CheckBox name="downsample" checked="true" ui:field="downsampleUi">Downsample</g:CheckBox>
|
||||
<g:Button styleName="" ui:field="importButtonUi"/>
|
||||
<g:Image resource="{res.transparentGif}" addStyleNames="{style.loadingImage}" ui:field="loadingImageUi"/>
|
||||
</g:HTMLPanel>
|
||||
|
||||
+1
@@ -15,6 +15,7 @@ public class SensorDataImportWidget extends AbstractFileImportWidget implements
|
||||
super("/sailingserver/sensordata/import", stringMessages, table, sailingService, errorReporter);
|
||||
setMultipleFileUploadEnabled(true);
|
||||
setShouldClearListOnNewUploadComplete(false);
|
||||
setDownsampleOptionVisible(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
@@ -14,6 +14,7 @@ public class TrackFileImportWidget extends AbstractFileImportWidget implements I
|
||||
public TrackFileImportWidget(TrackFileImportDeviceIdentifierTableWrapper table, StringMessages stringMessages,
|
||||
final SailingServiceAsync sailingService, final ErrorReporter errorReporter) {
|
||||
super("/sailingserver/trackfiles/import", stringMessages, table, sailingService, errorReporter);
|
||||
setDownsampleOptionVisible(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-2
@@ -473,7 +473,6 @@ import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.Util.Triple;
|
||||
import com.sap.sse.common.WithID;
|
||||
import com.sap.sse.common.impl.MillisecondsDurationImpl;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sse.common.impl.TimeRangeImpl;
|
||||
import com.sap.sse.common.mail.MailException;
|
||||
@@ -3097,7 +3096,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
TimePoint newestEvent = trackedRace.getTimePointOfNewestEvent();
|
||||
final TimePoint startTime = from == null ? trackedRace.getStartOfTracking() : new MillisecondsTimePoint(from);
|
||||
final TimePoint endTime = (to == null || to.after(newestEvent.asDate())) ? newestEvent : new MillisecondsTimePoint(to);
|
||||
final long adjustedStepSizeInMillis = (long) Math.max((double) stepSizeInMillis, startTime.until(endTime).divide(new MillisecondsDurationImpl(stepSizeInMillis)));
|
||||
final long adjustedStepSizeInMillis = (long) Math.max((double) stepSizeInMillis, startTime.until(endTime).divide(SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY).asMillis());
|
||||
result = new CompetitorsRaceDataDTO(detailType, startTime==null?null:startTime.asDate(), endTime==null?null:endTime.asDate());
|
||||
final int MAX_CACHE_SIZE = SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY;
|
||||
final ConcurrentHashMap<TimePoint, WindLegTypeAndLegBearingCache> cachesByTimePoint = new ConcurrentHashMap<>();
|
||||
|
||||
+16
-11
@@ -52,14 +52,14 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
|
||||
*
|
||||
* @param files
|
||||
* the file items together with the names of the importer to use for importing the respective file's
|
||||
* contents; the importer names are matched against {@link DoubleVectorFixImporter#getType()} for
|
||||
* all importers found registered in the OSGi registry. The first matching importer is used for the
|
||||
* file. The importer is selected on a per-file basis.
|
||||
* contents; the importer names are matched against {@link DoubleVectorFixImporter#getType()} for all
|
||||
* importers found registered in the OSGi registry. The first matching importer is used for the file. The
|
||||
* importer is selected on a per-file basis.
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
private Iterable<TrackFileImportDeviceIdentifier> importFiles(Iterable<Pair<String, FileItem>> files)
|
||||
throws IOException {
|
||||
private Iterable<TrackFileImportDeviceIdentifier> importFiles(boolean enableDownsampler,
|
||||
Iterable<Pair<String, FileItem>> files) throws IOException {
|
||||
final Set<TrackFileImportDeviceIdentifier> deviceIds = new HashSet<>();
|
||||
final Map<DeviceIdentifier, TimePoint> from = new HashMap<>();
|
||||
final Map<DeviceIdentifier, TimePoint> to = new HashMap<>();
|
||||
@@ -102,7 +102,7 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
|
||||
}
|
||||
}
|
||||
}
|
||||
}, fi.getName(), requestedImporterName, /* downsample */ true);
|
||||
}, fi.getName(), requestedImporterName, enableDownsampler);
|
||||
logger.log(Level.INFO, "Successfully imported file " + requestedImporterName);
|
||||
} catch (FormatNotSupportedException e) {
|
||||
logger.log(Level.INFO, "Failed to import file " + requestedImporterName);
|
||||
@@ -119,10 +119,14 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
|
||||
protected void process(List<FileItem> fileItems, HttpServletRequest req, HttpServletResponse resp)
|
||||
throws IOException {
|
||||
String importerName = null;
|
||||
searchForPreferredImporter: for (FileItem fi : fileItems) {
|
||||
if ("preferredImporter".equalsIgnoreCase(fi.getFieldName())) {
|
||||
importerName = fi.getString();
|
||||
break searchForPreferredImporter;
|
||||
boolean enableDownsampler = false;
|
||||
for (FileItem fi : fileItems) {
|
||||
if (fi.isFormField()) {
|
||||
if ("preferredImporter".equalsIgnoreCase(fi.getFieldName())) {
|
||||
importerName = fi.getString();
|
||||
} else if ("downsample".equalsIgnoreCase(fi.getFieldName())) {
|
||||
enableDownsampler = "on".equalsIgnoreCase(fi.getString());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (importerName == null) {
|
||||
@@ -134,7 +138,8 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
|
||||
filesAndImporterNames.add(new Pair<>(importerName, fi));
|
||||
}
|
||||
}
|
||||
final Iterable<TrackFileImportDeviceIdentifier> mappingList = importFiles(filesAndImporterNames);
|
||||
final Iterable<TrackFileImportDeviceIdentifier> mappingList = importFiles(enableDownsampler,
|
||||
filesAndImporterNames);
|
||||
resp.setContentType("text/html");
|
||||
for (TrackFileImportDeviceIdentifier mapping : mappingList) {
|
||||
String stringRep = mapping.getId().toString();
|
||||
|
||||
Reference in new issue
Block a user