mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-30 15:57:11 +00:00
Merge branch 'master' into tracapi
Conflicts: java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java
This commit is contained in:
commit
6f99f073bf
20 files changed
+3316
-2957
No files matched your search
+10
@@ -0,0 +1,10 @@
|
||||
package com.sap.sailing.server;
|
||||
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sse.common.search.Hit;
|
||||
|
||||
public interface LeaderboardSearchResult extends Hit {
|
||||
Regatta getRegatta();
|
||||
Leaderboard getLeaderboard();
|
||||
}
|
||||
@@ -67,6 +67,8 @@ import com.sap.sailing.domain.tracking.WindStore;
|
||||
import com.sap.sailing.server.masterdata.DataImportLockWithProgress;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Triple;
|
||||
import com.sap.sse.common.search.KeywordQuery;
|
||||
import com.sap.sse.common.search.Result;
|
||||
|
||||
/**
|
||||
* An OSGi service that can be used to track boat races using a TracTrac connector that pushes
|
||||
@@ -552,4 +554,6 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
|
||||
* or, if fetching the event list from the remote server did fail, the exception for which it failed.
|
||||
*/
|
||||
Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref);
|
||||
|
||||
Result<LeaderboardSearchResult> search(KeywordQuery query);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.sap.sailing.server;
|
||||
|
||||
import com.sap.sse.common.search.Hit;
|
||||
|
||||
public interface RegattaSearchResult extends Hit {
|
||||
|
||||
}
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.server.LeaderboardSearchResult;
|
||||
|
||||
public class LeaderboardSearchResultImpl implements LeaderboardSearchResult {
|
||||
private final Leaderboard leaderboard;
|
||||
|
||||
public LeaderboardSearchResultImpl(Leaderboard leaderboard) {
|
||||
this.leaderboard = leaderboard;
|
||||
}
|
||||
|
||||
public Regatta getRegatta() {
|
||||
final Regatta regatta;
|
||||
if (leaderboard instanceof RegattaLeaderboard) {
|
||||
regatta = ((RegattaLeaderboard) leaderboard).getRegatta();
|
||||
} else {
|
||||
regatta = null;
|
||||
}
|
||||
return regatta;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Leaderboard getLeaderboard() {
|
||||
return leaderboard;
|
||||
}
|
||||
}
|
||||
+8
@@ -133,6 +133,7 @@ import com.sap.sailing.operationaltransformation.Operation;
|
||||
import com.sap.sailing.server.OperationExecutionListener;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.server.RacingEventServiceOperation;
|
||||
import com.sap.sailing.server.LeaderboardSearchResult;
|
||||
import com.sap.sailing.server.Replicator;
|
||||
import com.sap.sailing.server.masterdata.DataImportLockWithProgress;
|
||||
import com.sap.sailing.server.operationaltransformation.AddCourseArea;
|
||||
@@ -171,6 +172,8 @@ import com.sap.sailing.util.BuildVersion;
|
||||
import com.sap.sailing.util.impl.LockUtil;
|
||||
import com.sap.sailing.util.impl.NamedReentrantReadWriteLock;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.search.KeywordQuery;
|
||||
import com.sap.sse.common.search.Result;
|
||||
|
||||
public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport, RegattaListener, LeaderboardRegistry, Replicator {
|
||||
private static final Logger logger = Logger.getLogger(RacingEventServiceImpl.class.getName());
|
||||
@@ -2588,4 +2591,9 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
|
||||
public void setDataImportDeleteProgressFromMapTimerWithoutReplication(UUID importOperationId) {
|
||||
dataImportLock.setDeleteFromMapTimer(importOperationId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<LeaderboardSearchResult> search(KeywordQuery query) {
|
||||
return new RegattaByKeywordSearchService().search(this, query);
|
||||
}
|
||||
}
|
||||
+33
-42
@@ -7,12 +7,10 @@ import java.util.Set;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.Event;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
|
||||
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
|
||||
import com.sap.sailing.server.LeaderboardSearchResult;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.server.RegattaSearchResult;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.AbstractListFilter;
|
||||
import com.sap.sse.common.search.KeywordQuery;
|
||||
@@ -30,53 +28,46 @@ import com.sap.sse.common.search.ResultImpl;
|
||||
*
|
||||
*/
|
||||
public class RegattaByKeywordSearchService {
|
||||
Result<RegattaSearchResult> search(final RacingEventService racingEventService, KeywordQuery query) {
|
||||
ResultImpl<RegattaSearchResult> result = new ResultImpl<>(query, new RegattaSearchResultRanker());
|
||||
AbstractListFilter<Regatta> regattaFilter = new AbstractListFilter<Regatta>() {
|
||||
Result<LeaderboardSearchResult> search(final RacingEventService racingEventService, KeywordQuery query) {
|
||||
ResultImpl<LeaderboardSearchResult> result = new ResultImpl<>(query, new RegattaSearchResultRanker(racingEventService));
|
||||
AbstractListFilter<Leaderboard> leaderboardFilter = new AbstractListFilter<Leaderboard>() {
|
||||
@Override
|
||||
public Iterable<String> getStrings(Regatta regatta) {
|
||||
List<String> regattaStrings = new ArrayList<>();
|
||||
regattaStrings.add(regatta.getBaseName());
|
||||
regattaStrings.add(regatta.getBoatClass().getName());
|
||||
for (Competitor competitor : regatta.getCompetitors()) {
|
||||
regattaStrings.add(competitor.getName());
|
||||
regattaStrings.add(competitor.getBoat().getSailID());
|
||||
}
|
||||
final Iterable<LeaderboardGroup> leaderboardGroupsHostingRegatta = getLeaderboardGroupsHostingRegatta(regatta, racingEventService);
|
||||
for (LeaderboardGroup leaderboardGroup : leaderboardGroupsHostingRegatta) {
|
||||
regattaStrings.add(leaderboardGroup.getName());
|
||||
regattaStrings.add(leaderboardGroup.getDescription());
|
||||
for (Leaderboard leaderboard : leaderboardGroup.getLeaderboards()) {
|
||||
if (leaderboard instanceof RegattaLeaderboard && ((RegattaLeaderboard) leaderboard).getRegatta() == regatta) {
|
||||
regattaStrings.add(leaderboard.getName());
|
||||
regattaStrings.add(leaderboard.getDisplayName());
|
||||
for (Competitor competitor : leaderboard.getCompetitors()) {
|
||||
String competitorDisplayName = leaderboard.getDisplayName(competitor);
|
||||
if (competitorDisplayName != null) {
|
||||
regattaStrings.add(competitorDisplayName);
|
||||
}
|
||||
}
|
||||
}
|
||||
public Iterable<String> getStrings(Leaderboard leaderboard) {
|
||||
List<String> leaderboardStrings = new ArrayList<>();
|
||||
leaderboardStrings.add(leaderboard.getName());
|
||||
leaderboardStrings.add(leaderboard.getDisplayName());
|
||||
for (Competitor competitor : leaderboard.getCompetitors()) {
|
||||
leaderboardStrings.add(competitor.getName());
|
||||
leaderboardStrings.add(competitor.getBoat().getSailID());
|
||||
String competitorDisplayName = leaderboard.getDisplayName(competitor);
|
||||
if (competitorDisplayName != null) {
|
||||
leaderboardStrings.add(competitorDisplayName);
|
||||
}
|
||||
}
|
||||
for (Event event : getEventsHostingRegatta(regatta, racingEventService, leaderboardGroupsHostingRegatta)) {
|
||||
regattaStrings.add(event.getName());
|
||||
regattaStrings.add(event.getVenue().getName());
|
||||
final Iterable<LeaderboardGroup> leaderboardGroupsHostingLeaderboard = getLeaderboardGroupsHostingLeaderboard(
|
||||
leaderboard, racingEventService);
|
||||
for (LeaderboardGroup leaderboardGroup : leaderboardGroupsHostingLeaderboard) {
|
||||
leaderboardStrings.add(leaderboardGroup.getName());
|
||||
leaderboardStrings.add(leaderboardGroup.getDescription());
|
||||
}
|
||||
return regattaStrings;
|
||||
for (Event event : getEventsHostingLeaderboard(leaderboard, racingEventService, leaderboardGroupsHostingLeaderboard)) {
|
||||
leaderboardStrings.add(event.getName());
|
||||
leaderboardStrings.add(event.getVenue().getName());
|
||||
}
|
||||
return leaderboardStrings;
|
||||
}
|
||||
};
|
||||
for (Regatta matchingRegatta : regattaFilter.applyFilter(query.getKeywords(), racingEventService.getAllRegattas())) {
|
||||
result.addHit(new RegattaSearchResultImpl(matchingRegatta));
|
||||
for (Leaderboard matchingLeaderboard : leaderboardFilter.applyFilter(query.getKeywords(), racingEventService.getLeaderboards().values())) {
|
||||
result.addHit(new LeaderboardSearchResultImpl(matchingLeaderboard));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private Iterable<LeaderboardGroup> getLeaderboardGroupsHostingRegatta(Regatta regatta, RacingEventService racingEventService) {
|
||||
private Iterable<LeaderboardGroup> getLeaderboardGroupsHostingLeaderboard(Leaderboard leaderboard, RacingEventService racingEventService) {
|
||||
Set<LeaderboardGroup> result = new LinkedHashSet<>();
|
||||
for (LeaderboardGroup leaderboardGroup : racingEventService.getLeaderboardGroups().values()) {
|
||||
for (Leaderboard leaderboard : leaderboardGroup.getLeaderboards()) {
|
||||
if (leaderboard instanceof RegattaLeaderboard && ((RegattaLeaderboard) leaderboard).getRegatta() == regatta) {
|
||||
for (Leaderboard lgLeaderboard : leaderboardGroup.getLeaderboards()) {
|
||||
if (lgLeaderboard == leaderboard) {
|
||||
result.add(leaderboardGroup);
|
||||
}
|
||||
}
|
||||
@@ -84,14 +75,14 @@ public class RegattaByKeywordSearchService {
|
||||
return result;
|
||||
}
|
||||
|
||||
private Iterable<Event> getEventsHostingRegatta(Regatta regatta, RacingEventService racingEventService,
|
||||
Iterable<LeaderboardGroup> leaderboardGroupsHostingRegatta) {
|
||||
private Iterable<Event> getEventsHostingLeaderboard(Leaderboard leaderboard, RacingEventService racingEventService,
|
||||
Iterable<LeaderboardGroup> leaderboardGroupsHostingLeaderboard) {
|
||||
Set<Event> result = new LinkedHashSet<>();
|
||||
for (Event event : racingEventService.getAllEvents()) {
|
||||
if (Util.contains(event.getVenue().getCourseAreas(), regatta.getDefaultCourseArea())) {
|
||||
if (Util.contains(event.getVenue().getCourseAreas(), leaderboard.getDefaultCourseArea())) {
|
||||
result.add(event);
|
||||
} else {
|
||||
for (LeaderboardGroup leaderboardGroupHostingRegatta : leaderboardGroupsHostingRegatta) {
|
||||
for (LeaderboardGroup leaderboardGroupHostingRegatta : leaderboardGroupsHostingLeaderboard) {
|
||||
if (Util.contains(event.getLeaderboardGroups(), leaderboardGroupHostingRegatta)) {
|
||||
result.add(event);
|
||||
break;
|
||||
|
||||
-16
@@ -1,16 +0,0 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.server.RegattaSearchResult;
|
||||
|
||||
public class RegattaSearchResultImpl implements RegattaSearchResult {
|
||||
private final Regatta regatta;
|
||||
|
||||
public RegattaSearchResultImpl(Regatta regatta) {
|
||||
this.regatta = regatta;
|
||||
}
|
||||
|
||||
public Regatta getRegatta() {
|
||||
return regatta;
|
||||
}
|
||||
}
|
||||
+63
-5
@@ -1,13 +1,71 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.server.RegattaSearchResult;
|
||||
import com.sap.sailing.domain.base.Regatta;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.tracking.TrackedRegatta;
|
||||
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.server.LeaderboardSearchResult;
|
||||
import com.sap.sse.common.Util;
|
||||
|
||||
public class RegattaSearchResultRanker implements Comparator<LeaderboardSearchResult> {
|
||||
private final TrackedRegattaRegistry trackedRegattaRegistry;
|
||||
|
||||
protected RegattaSearchResultRanker(RacingEventService racingEventService) {
|
||||
this.trackedRegattaRegistry = racingEventService;
|
||||
}
|
||||
|
||||
public class RegattaSearchResultRanker implements Comparator<RegattaSearchResult> {
|
||||
@Override
|
||||
public int compare(RegattaSearchResult o1, RegattaSearchResult o2) {
|
||||
// TODO Auto-generated method stub
|
||||
return 0;
|
||||
public int compare(LeaderboardSearchResult o1, LeaderboardSearchResult o2) {
|
||||
Regatta r1 = o1.getRegatta();
|
||||
Regatta r2 = o2.getRegatta();
|
||||
TrackedRegatta trackedR1 = r1 == null ? null : trackedRegattaRegistry.getTrackedRegatta(r1);
|
||||
TrackedRegatta trackedR2 = r2 == null ? null : trackedRegattaRegistry.getTrackedRegatta(r2);
|
||||
final int result;
|
||||
if (trackedR1 == null) {
|
||||
if (trackedR2 == null) {
|
||||
result = o1.getLeaderboard().getName().compareTo(o2.getLeaderboard().getName());
|
||||
} else {
|
||||
result = -1; // a non-tracked regatta is greater (shown further down) than a tracked regatta
|
||||
}
|
||||
} else {
|
||||
if (trackedR2 == null) {
|
||||
result = 1; // a tracked regatta is less (shown further up) than a non-tracked regatta
|
||||
} else {
|
||||
// both are tracked; check times of tracked races
|
||||
result = compareByEarliestStartOfATrackedRace(trackedR1, trackedR2);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private int compareByEarliestStartOfATrackedRace(TrackedRegatta trackedR1, TrackedRegatta trackedR2) {
|
||||
assert trackedR1 != null;
|
||||
assert trackedR2 != null;
|
||||
TimePoint earliestTrackedRaceInR1 = getEarliestTrackedRace(trackedR1);
|
||||
TimePoint earliestTrackedRaceInR2 = getEarliestTrackedRace(trackedR2);
|
||||
return Util.compareToWithNull(earliestTrackedRaceInR1, earliestTrackedRaceInR2, /* nullIsLess */ false);
|
||||
}
|
||||
|
||||
private TimePoint getEarliestTrackedRace(TrackedRegatta trackedRegatta) {
|
||||
List<TimePoint> startOfTrackingTimes = new ArrayList<>();
|
||||
for (TrackedRace trackedRace : trackedRegatta.getTrackedRaces()) {
|
||||
if (trackedRace.getStartOfTracking() != null) {
|
||||
startOfTrackingTimes.add(trackedRace.getStartOfTracking());
|
||||
}
|
||||
}
|
||||
final TimePoint result;
|
||||
if (startOfTrackingTimes.isEmpty()) {
|
||||
result = null;
|
||||
} else {
|
||||
result = Collections.min(startOfTrackingTimes);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -6,6 +6,7 @@ import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
|
||||
import com.sap.sailing.domain.racelog.tracking.EmptyGPSFixStore;
|
||||
import com.sap.sailing.domain.racelog.tracking.GPSFixStore;
|
||||
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.domain.tracking.TrackedRegatta;
|
||||
import com.sap.sailing.domain.tracking.WindStore;
|
||||
@@ -22,7 +23,7 @@ import com.sap.sailing.server.RacingEventServiceOperation;
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public class CreateTrackedRace extends AbstractRaceOperation<TrackedRace> {
|
||||
public class CreateTrackedRace extends AbstractRaceOperation<DynamicTrackedRace> {
|
||||
private static final long serialVersionUID = 5084401060896514911L;
|
||||
private final long millisecondsOverWhichToAverageWind;
|
||||
private final long millisecondsOverWhichToAverageSpeed;
|
||||
@@ -73,7 +74,7 @@ public class CreateTrackedRace extends AbstractRaceOperation<TrackedRace> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public TrackedRace internalApplyTo(RacingEventService toState) {
|
||||
public DynamicTrackedRace internalApplyTo(RacingEventService toState) {
|
||||
return toState.createTrackedRace(getRaceIdentifier(), windStore == null ? EmptyWindStore.INSTANCE : windStore,
|
||||
gpsFixStore == null ? EmptyGPSFixStore.INSTANCE : gpsFixStore,
|
||||
delayToLiveInMillis, millisecondsOverWhichToAverageWind, millisecondsOverWhichToAverageSpeed);
|
||||
|
||||
Reference in new issue
Block a user