search service now works based on leaderboards, not regattas

This commit is contained in:
Axel Uhl committed 2014-06-04 12:07:31 +02:00
1 parent d7cf30f9f7
commit c204bece9c
8 files changed
+123 -79

No files matched your search

@@ -1,8 +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 RegattaSearchResult extends Hit {
public interface LeaderboardSearchResult extends Hit {
Regatta getRegatta();
Leaderboard getLeaderboard();
}
@@ -555,5 +555,5 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
*/
Util.Pair<Iterable<EventBase>, Exception> updateRemoteServerEventCacheSynchronously(RemoteSailingServerReference ref);
Result<RegattaSearchResult> search(KeywordQuery query);
Result<LeaderboardSearchResult> search(KeywordQuery query);
}
@@ -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;
}
}
@@ -133,7 +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.RegattaSearchResult;
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;
@@ -2593,7 +2593,7 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
}
@Override
public Result<RegattaSearchResult> search(KeywordQuery query) {
public Result<LeaderboardSearchResult> search(KeywordQuery query) {
return new RegattaByKeywordSearchService().search(this, query);
}
}
@@ -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(racingEventService));
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;
@@ -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;
}
}
@@ -11,10 +11,10 @@ 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.RegattaSearchResult;
import com.sap.sailing.server.LeaderboardSearchResult;
import com.sap.sse.common.Util;
public class RegattaSearchResultRanker implements Comparator<RegattaSearchResult> {
public class RegattaSearchResultRanker implements Comparator<LeaderboardSearchResult> {
private final TrackedRegattaRegistry trackedRegattaRegistry;
protected RegattaSearchResultRanker(RacingEventService racingEventService) {
@@ -22,15 +22,15 @@ public class RegattaSearchResultRanker implements Comparator<RegattaSearchResult
}
@Override
public int compare(RegattaSearchResult o1, RegattaSearchResult o2) {
public int compare(LeaderboardSearchResult o1, LeaderboardSearchResult o2) {
Regatta r1 = o1.getRegatta();
Regatta r2 = o2.getRegatta();
TrackedRegatta trackedR1 = trackedRegattaRegistry.getTrackedRegatta(r1);
TrackedRegatta trackedR2 = trackedRegattaRegistry.getTrackedRegatta(r2);
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 = r1.getName().compareTo(r2.getName());
result = o1.getLeaderboard().getName().compareTo(o2.getLeaderboard().getName());
} else {
result = -1; // a non-tracked regatta is greater (shown further down) than a tracked regatta
}