mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-30 01:16:40 +00:00
avoid duplicate leaderboard traversal for statistics collection
This commit is contained in:
+69
-63
@@ -2,9 +2,11 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.NavigableSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.google.gwt.core.shared.GwtIncompatible;
|
||||
import com.google.gwt.dev.util.collect.HashSet;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.Mark;
|
||||
@@ -55,77 +57,81 @@ public class GetEventStatisticsAction implements Action<ResultWithTTL<EventStati
|
||||
Distance totalDistanceTraveled = Distance.NULL;
|
||||
Triple<Competitor, Speed, TimePoint> maxSpeed = null;
|
||||
final TimePoint now = MillisecondsTimePoint.now();
|
||||
final Set<Leaderboard> leaderboards = new HashSet<>();
|
||||
for (LeaderboardGroup lg : event.getLeaderboardGroups()) {
|
||||
for (Leaderboard leaderboard : lg.getLeaderboards()) {
|
||||
competitors += HomeServiceUtil.calculateCompetitorsCount(leaderboard);
|
||||
races += HomeServiceUtil.calculateRaceCount(leaderboard);
|
||||
trackedRaces += HomeServiceUtil.calculateTrackedRaceCount(leaderboard);
|
||||
regattas++;
|
||||
String disableStats = System.getenv("DISABLE_STATS");
|
||||
if (disableStats == null || "false".equals(disableStats)) {
|
||||
for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) {
|
||||
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
|
||||
competitorTrack.lockForRead();
|
||||
leaderboards.add(leaderboard);
|
||||
}
|
||||
}
|
||||
for (Leaderboard leaderboard : leaderboards) {
|
||||
competitors += HomeServiceUtil.calculateCompetitorsCount(leaderboard);
|
||||
races += HomeServiceUtil.calculateRaceCount(leaderboard);
|
||||
trackedRaces += HomeServiceUtil.calculateTrackedRaceCount(leaderboard);
|
||||
regattas++;
|
||||
String disableStats = System.getenv("DISABLE_STATS");
|
||||
if (disableStats == null || "false".equals(disableStats)) {
|
||||
for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) {
|
||||
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
|
||||
competitorTrack.lockForRead();
|
||||
try {
|
||||
numberOfGPSFixes += Util.size(competitorTrack.getRawFixes());
|
||||
} finally {
|
||||
competitorTrack.unlockAfterRead();
|
||||
}
|
||||
if (trackedRace.hasStarted(now)) {
|
||||
final NavigableSet<MarkPassing> competitorMarkPassings = trackedRace
|
||||
.getMarkPassings(competitor);
|
||||
MarkPassing lastMarkPassingBeforeNow = null;
|
||||
trackedRace.lockForRead(competitorMarkPassings);
|
||||
try {
|
||||
numberOfGPSFixes += Util.size(competitorTrack.getRawFixes());
|
||||
} finally {
|
||||
competitorTrack.unlockAfterRead();
|
||||
}
|
||||
if (trackedRace.hasStarted(now)) {
|
||||
final NavigableSet<MarkPassing> competitorMarkPassings = trackedRace
|
||||
.getMarkPassings(competitor);
|
||||
MarkPassing lastMarkPassingBeforeNow = null;
|
||||
trackedRace.lockForRead(competitorMarkPassings);
|
||||
try {
|
||||
MarkPassing next = null;
|
||||
Iterator<MarkPassing> i = competitorMarkPassings.descendingIterator();
|
||||
while (i.hasNext() && (next = i.next()).getTimePoint().after(now))
|
||||
;
|
||||
if (next != null) {
|
||||
lastMarkPassingBeforeNow = next;
|
||||
}
|
||||
} finally {
|
||||
trackedRace.unlockAfterRead(competitorMarkPassings);
|
||||
MarkPassing next = null;
|
||||
Iterator<MarkPassing> i = competitorMarkPassings.descendingIterator();
|
||||
while (i.hasNext() && (next = i.next()).getTimePoint().after(now))
|
||||
;
|
||||
if (next != null) {
|
||||
lastMarkPassingBeforeNow = next;
|
||||
}
|
||||
if (lastMarkPassingBeforeNow != null) {
|
||||
// competitor has started and has at least one mark passing before now; compute
|
||||
// distance traveled
|
||||
// up to that mark passing, increasing likelihood of cache hits as compared to using
|
||||
// "now" as
|
||||
// the query time point
|
||||
totalDistanceTraveled = totalDistanceTraveled.add(competitorTrack
|
||||
.getDistanceTraveled(trackedRace.getStartOfRace(),
|
||||
lastMarkPassingBeforeNow.getTimePoint()));
|
||||
Pair<GPSFixMoving, Speed> competitorMaxSpeed = competitorTrack
|
||||
.getMaximumSpeedOverGround(trackedRace.getStartOfRace(),
|
||||
lastMarkPassingBeforeNow.getTimePoint());
|
||||
if (competitorMaxSpeed != null
|
||||
&& (maxSpeed == null || competitorMaxSpeed.getB()
|
||||
.compareTo(maxSpeed.getB()) > 0)) {
|
||||
maxSpeed = new Triple<>(competitor, competitorMaxSpeed.getB(),
|
||||
competitorMaxSpeed.getA().getTimePoint());
|
||||
}
|
||||
} finally {
|
||||
trackedRace.unlockAfterRead(competitorMarkPassings);
|
||||
}
|
||||
if (lastMarkPassingBeforeNow != null) {
|
||||
// competitor has started and has at least one mark passing before now; compute
|
||||
// distance traveled
|
||||
// up to that mark passing, increasing likelihood of cache hits as compared to using
|
||||
// "now" as
|
||||
// the query time point
|
||||
totalDistanceTraveled = totalDistanceTraveled.add(competitorTrack
|
||||
.getDistanceTraveled(trackedRace.getStartOfRace(),
|
||||
lastMarkPassingBeforeNow.getTimePoint()));
|
||||
Pair<GPSFixMoving, Speed> competitorMaxSpeed = competitorTrack
|
||||
.getMaximumSpeedOverGround(trackedRace.getStartOfRace(),
|
||||
lastMarkPassingBeforeNow.getTimePoint());
|
||||
if (competitorMaxSpeed != null
|
||||
&& (maxSpeed == null || competitorMaxSpeed.getB()
|
||||
.compareTo(maxSpeed.getB()) > 0)) {
|
||||
maxSpeed = new Triple<>(competitor, competitorMaxSpeed.getB(),
|
||||
competitorMaxSpeed.getA().getTimePoint());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Mark mark : trackedRace.getMarks()) {
|
||||
GPSFixTrack<Mark, GPSFix> markTrack = trackedRace.getOrCreateTrack(mark);
|
||||
markTrack.lockForRead();
|
||||
try {
|
||||
numberOfGPSFixes += Util.size(markTrack.getRawFixes());
|
||||
} finally {
|
||||
markTrack.unlockAfterRead();
|
||||
}
|
||||
}
|
||||
for (Mark mark : trackedRace.getMarks()) {
|
||||
GPSFixTrack<Mark, GPSFix> markTrack = trackedRace.getOrCreateTrack(mark);
|
||||
markTrack.lockForRead();
|
||||
try {
|
||||
numberOfGPSFixes += Util.size(markTrack.getRawFixes());
|
||||
} finally {
|
||||
markTrack.unlockAfterRead();
|
||||
}
|
||||
for (WindSource windSource : trackedRace.getWindSources()) {
|
||||
WindTrack windTrack = trackedRace.getOrCreateWindTrack(windSource);
|
||||
windTrack.lockForRead();
|
||||
try {
|
||||
numberOfWindFixes += Util.size(windTrack.getRawFixes());
|
||||
} finally {
|
||||
windTrack.unlockAfterRead();
|
||||
}
|
||||
}
|
||||
for (WindSource windSource : trackedRace.getWindSources()) {
|
||||
WindTrack windTrack = trackedRace.getOrCreateWindTrack(windSource);
|
||||
windTrack.lockForRead();
|
||||
try {
|
||||
numberOfWindFixes += Util.size(windTrack.getRawFixes());
|
||||
} finally {
|
||||
windTrack.unlockAfterRead();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/sapjvm_8"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console -clean"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dfile.encoding=cp1252 -Dexpedition.udp.port=2010 -Xmx6000m -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -Dpersistentcompetitors.clear=false -XX:+UseMembar -Digtimi.client.id=7fcdd217e0aa16090edb4ad55b09ec43b2021090e209541fc9b7003c2a2b70c6 -Digtimi.client.secret=aa569cf4909bdc7b0e04b11873f3c4ea20687421e010fcc25b771cca9e6f3f9a -Digtimi.client.redirecturi=http://127.0.0.1:8888/igtimi/oauth/v1/authorizationcallback"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y -ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dfile.encoding=cp1252 -Dexpedition.udp.port=2010 -Xmx6000m -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -Dpersistentcompetitors.clear=false -XX:+UseMembar -Digtimi.client.id=7fcdd217e0aa16090edb4ad55b09ec43b2021090e209541fc9b7003c2a2b70c6 -Digtimi.client.secret=aa569cf4909bdc7b0e04b11873f3c4ea20687421e010fcc25b771cca9e6f3f9a -Digtimi.client.redirecturi=http://127.0.0.1:8888/igtimi/oauth/v1/authorizationcallback"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
|
||||
<stringAttribute key="pde.version" value="3.3"/>
|
||||
<stringAttribute key="profilingTraceType-ALLOCATION_TRACE" value="KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%INCREASE_COUNT%CTX_KEY%8192%CTX_ENTRY%KEY_MIN_SIZE%CTX_KEY%32%CTX_ENTRY%KEY_MAX_SIZE%CTX_KEY%65536%CTX_ENTRY%KEY_INC_LINE_NRS%CTX_KEY%true%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%CLASS_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ADAPTIVE%CTX_KEY%false%CTX_ENTRY%"/>
|
||||
|
||||
Reference in New Issue
Block a user