Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/feature/#1775-show-all-search-re…
Browse files Browse the repository at this point in the history
…sults' into feature/#1775-show-all-search-results
  • Loading branch information
krristi427 committed Jul 8, 2020
2 parents 141ff53 + 53b44b5 commit dd13c65
Show file tree
Hide file tree
Showing 21 changed files with 547 additions and 114 deletions.
4 changes: 3 additions & 1 deletion src/main/java/com/faforever/client/api/FafApiAccessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.faforever.client.api.dto.GameReview;
import com.faforever.client.api.dto.GlobalLeaderboardEntry;
import com.faforever.client.api.dto.GlobalRating;
import com.faforever.client.api.dto.GlobalRatingWithRank;
import com.faforever.client.api.dto.Ladder1v1LeaderboardEntry;
import com.faforever.client.api.dto.Ladder1v1Map;
import com.faforever.client.api.dto.Map;
Expand All @@ -30,6 +31,7 @@
import com.faforever.client.vault.search.SearchController.SearchConfig;
import com.faforever.client.vault.search.SearchController.SortConfig;
import com.faforever.commons.io.ByteCountListener;
import com.github.jasminb.jsonapi.JSONAPIDocument;

import java.io.IOException;
import java.nio.file.Path;
Expand Down Expand Up @@ -120,7 +122,7 @@ public interface FafApiAccessor {

List<Map> findMapsByQuery(SearchConfig searchConfig, int page, int count);

List<GlobalLeaderboardEntry> findGlobalLeaderboardEntryByQuery(String nameToSearch, int page, int count);
JSONAPIDocument<List<GlobalRatingWithRank>> findGlobalLeaderboardEntryByQuery(String nameToSearch, int page, int count);

List<Ladder1v1LeaderboardEntry> findLadder1v1LeaderboardEntryByQuery(String nameToSearch, int page, int count);

Expand Down
31 changes: 27 additions & 4 deletions src/main/java/com/faforever/client/api/FafApiAccessorImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.faforever.client.api.dto.GameReviewsSummary;
import com.faforever.client.api.dto.GlobalLeaderboardEntry;
import com.faforever.client.api.dto.GlobalRating;
import com.faforever.client.api.dto.GlobalRatingWithRank;
import com.faforever.client.api.dto.Ladder1v1LeaderboardEntry;
import com.faforever.client.api.dto.Ladder1v1Map;
import com.faforever.client.api.dto.Map;
Expand Down Expand Up @@ -39,6 +40,7 @@
import com.faforever.client.vault.search.SearchController.SearchConfig;
import com.faforever.client.vault.search.SearchController.SortConfig;
import com.faforever.commons.io.ByteCountListener;
import com.github.jasminb.jsonapi.JSONAPIDocument;
import com.github.rutledgepaulv.qbuilders.builders.QBuilder;
import com.github.rutledgepaulv.qbuilders.conditions.Condition;
import com.github.rutledgepaulv.qbuilders.visitors.RSQLVisitor;
Expand Down Expand Up @@ -481,9 +483,9 @@ public List<Map> findMapsByQuery(SearchConfig searchConfig, int page, int count)
}

@Override
public List<GlobalLeaderboardEntry> findGlobalLeaderboardEntryByQuery(String nameToSearch, int page, int count) {
return getPage("/leaderboards/global", count, page,
ImmutableMap.of("playerNameMatchesRegex", nameToSearch + "%", "page[number]", page, "page[size]", count));
public JSONAPIDocument<List<GlobalRatingWithRank>> findGlobalLeaderboardEntryByQuery(String nameToSearch, int page, int count) {
return getPageWithMeta("/data/globalRatingWithRank", count, page,
ImmutableMap.of("filter", "player.login==" + nameToSearch + "*", "page[number]", page, "page[size]", count, "page[totals]", ""));
}

@Override
Expand Down Expand Up @@ -634,6 +636,13 @@ private <T> List<T> getPage(String endpointPath, int pageSize, int page, java.ut
return getPage(endpointPath, pageSize, page, CollectionUtils.toMultiValueMap(multiValues));
}

private <T> JSONAPIDocument<List<T>> getPageWithMeta(String endpointPath, int pageSize, int page, java.util.Map<String, Serializable> params) {
java.util.Map<String, List<String>> multiValues = params.entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry -> Collections.singletonList(String.valueOf(entry.getValue()))));

return getPageWithMeta(endpointPath, pageSize, page, CollectionUtils.toMultiValueMap(multiValues));
}

@SuppressWarnings("unchecked")
@SneakyThrows
private <T> List<T> getPage(String endpointPath, int pageSize, int page, MultiValueMap<String, String> params) {
Expand All @@ -644,6 +653,20 @@ private <T> List<T> getPage(String endpointPath, int pageSize, int page, MultiVa
.build();

authorizedLatch.await();
return (List<T>) restOperations.getForObject(uriComponents.toUriString(), List.class);
return restOperations.getForObject(uriComponents.toUriString(), List.class);
}

@SuppressWarnings("unchecked")
@SneakyThrows
private <T> JSONAPIDocument<List<T>> getPageWithMeta(String endpointPath, int pageSize, int page, MultiValueMap<String, String> params) {
UriComponents uriComponents = UriComponentsBuilder.fromPath(endpointPath)
.queryParams(params)
.replaceQueryParam("page[size]", pageSize)
.replaceQueryParam("page[number]", page)
.replaceQueryParam("page[totals]")
.build();

authorizedLatch.await();
return restOperations.getForObject(uriComponents.toUriString(), JSONAPIDocument.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,19 @@ public JsonApiMessageConverter(ResourceConverter resourceConverter) {
@Override
protected boolean supports(Class<?> clazz) {
return Collection.class.isAssignableFrom(clazz)
|| ReflectionUtils.getTypeName(clazz) != null;
|| ReflectionUtils.getTypeName(clazz) != null
|| clazz.equals(JSONAPIDocument.class);
}

@Override
@SneakyThrows
@SuppressWarnings("unchecked")
protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) {
try (InputStream inputStream = inputMessage.getBody()) {
JSONAPIDocument<?> document;
if (Iterable.class.isAssignableFrom(clazz)) {
document = resourceConverter.readDocumentCollection(inputStream, Object.class);
} else if (clazz.equals(JSONAPIDocument.class)) {
return resourceConverter.readDocumentCollection(inputStream, Object.class);
} else {
document = resourceConverter.readDocument(inputMessage.getBody(), Object.class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.faforever.client.api.dto.GamePlayerStats;
import com.faforever.client.api.dto.GameReview;
import com.faforever.client.api.dto.GlobalLeaderboardEntry;
import com.faforever.client.api.dto.GlobalRatingWithRank;
import com.faforever.client.api.dto.Ladder1v1LeaderboardEntry;
import com.faforever.client.api.dto.Ladder1v1Map;
import com.faforever.client.api.dto.Map;
Expand All @@ -32,6 +33,7 @@
import com.faforever.client.vault.search.SearchController.SearchConfig;
import com.faforever.client.vault.search.SearchController.SortConfig;
import com.faforever.commons.io.ByteCountListener;
import com.github.jasminb.jsonapi.JSONAPIDocument;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -255,8 +257,8 @@ public List<Map> findMapsByQuery(SearchConfig searchConfig, int page, int count)
}

@Override
public List<GlobalLeaderboardEntry> findGlobalLeaderboardEntryByQuery(String nameToSearch, int page, int count) {
return Collections.emptyList();
public JSONAPIDocument<List<GlobalRatingWithRank>> findGlobalLeaderboardEntryByQuery(String nameToSearch, int page, int count) {
return null;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.faforever.client.api.dto;

import com.github.jasminb.jsonapi.annotations.Id;
import com.github.jasminb.jsonapi.annotations.Relationship;
import com.github.jasminb.jsonapi.annotations.Type;
import lombok.Data;

@Data
@Type("globalRatingWithRank")
public class GlobalRatingWithRank {
@Id
private String id;
private double mean;
private double deviation;
private double rating;
private int rank;

@Relationship("player")
private Player player;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.faforever.client.api.dto;

import com.github.jasminb.jsonapi.annotations.Id;
import com.github.jasminb.jsonapi.annotations.Relationship;
import com.github.jasminb.jsonapi.annotations.Type;
import lombok.Data;

@Data
@Type("Ladder1v1RatingWithRank")
public class Ladder1v1RatingWithRank {
@Id
private String id;
private double mean;
private double deviation;
private double rating;
private int rank;

@Relationship("player")
private Player player;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.property.SimpleFloatProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
Expand All @@ -34,7 +35,9 @@
import org.springframework.stereotype.Component;

import java.lang.invoke.MethodHandles;
import java.util.concurrent.CompletableFuture;

import static java.util.stream.Collectors.toList;
import static javafx.collections.FXCollections.observableList;


Expand All @@ -49,12 +52,12 @@ public class LeaderboardController extends AbstractViewController<Node> {
private final I18n i18n;
private final ReportingService reportingService;
public Pane leaderboardRoot;
public TableColumn<LeaderboardEntry, Number> rankColumn;
public TableColumn<LeaderboardEntry, String> nameColumn;
public TableColumn<LeaderboardEntry, Number> winLossColumn;
public TableColumn<LeaderboardEntry, Number> gamesPlayedColumn;
public TableColumn<LeaderboardEntry, Number> ratingColumn;
public TableView<LeaderboardEntry> ratingTable;
public TableColumn<RatingWithRank, Number> rankColumn;
public TableColumn<RatingWithRank, String> nameColumn;
public TableColumn<RatingWithRank, Number> meanColumn;
public TableColumn<RatingWithRank, Number> deviationColumn;
public TableColumn<RatingWithRank, Number> ratingColumn;
public TableView<RatingWithRank> ratingTable;
public TextField searchTextField;
public Pane connectionProgressPane;
public Pane contentPane;
Expand All @@ -71,14 +74,14 @@ public void initialize() {
rankColumn.setCellValueFactory(param -> param.getValue().rankProperty());
rankColumn.setCellFactory(param -> new StringCell<>(rank -> i18n.number(rank.intValue())));

nameColumn.setCellValueFactory(param -> param.getValue().usernameProperty());
nameColumn.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getPlayer().getLogin())) ;
nameColumn.setCellFactory(param -> new StringCell<>(name -> name));

winLossColumn.setCellValueFactory(param -> param.getValue().winLossRatioProperty());
winLossColumn.setCellFactory(param -> new StringCell<>(number -> i18n.get("percentage", number.floatValue() * 100)));
meanColumn.setCellValueFactory(param -> param.getValue().meanProperty());
meanColumn.setCellFactory(param -> new StringCell<>(number -> i18n.rounded(number.doubleValue(), 2)));

gamesPlayedColumn.setCellValueFactory(param -> param.getValue().gamesPlayedProperty());
gamesPlayedColumn.setCellFactory(param -> new StringCell<>(count -> i18n.number(count.intValue())));
deviationColumn.setCellValueFactory(param -> param.getValue().deviationProperty());
deviationColumn.setCellFactory(param -> new StringCell<>(number -> i18n.rounded(number.doubleValue(), 2)));

ratingColumn.setCellValueFactory(param -> param.getValue().ratingProperty());
ratingColumn.setCellFactory(param -> new StringCell<>(rating -> i18n.number(rating.intValue())));
Expand Down Expand Up @@ -123,9 +126,15 @@ private void updateTable(int currentPage)
Assert.checkNullIllegalState(ratingType, "ratingType must not be null");

contentPane.setVisible(false);
leaderboardService.getSearchResults(ratingType, searchTextFieldText,currentPage+1, NUMBER_OF_PLAYERS_PER_PAGE).thenAccept(leaderboardEntryBeans -> {
leaderboardService.getSearchResultsWithMeta(ratingType, searchTextFieldText,currentPage+1, NUMBER_OF_PLAYERS_PER_PAGE).thenAccept(ratingWithRankBeans -> {
Platform.runLater(() -> {
ratingTable.setItems(observableList(leaderboardEntryBeans));
ratingTable.setItems(observableList(

ratingWithRankBeans.get()
.parallelStream()
.map(RatingWithRank::fromGlobal)
.collect(toList()))
);
contentPane.setVisible(true);
});
}).exceptionally(throwable -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.faforever.client.FafClientApplication;
import com.faforever.client.api.dto.GlobalRating;
import com.faforever.client.api.dto.GlobalRatingWithRank;
import com.faforever.client.api.dto.Rating;
import com.faforever.client.game.KnownFeaturedMod;
import com.faforever.client.query.SearchablePropertyMappings;
Expand All @@ -10,6 +11,7 @@
import com.faforever.client.vault.search.SearchController.SearchConfig;
import com.faforever.client.vault.search.SearchController.SortConfig;
import com.faforever.client.vault.search.SearchController.SortOrder;
import com.github.jasminb.jsonapi.JSONAPIDocument;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Profile;
Expand Down Expand Up @@ -67,7 +69,18 @@ public CompletableFuture<List<LeaderboardEntry>> getEntries(KnownFeaturedMod rat
}
}

public CompletableFuture<List<LeaderboardEntry>> getSearchResults(KnownFeaturedMod ratingType, String nameToSearch, int page, int count) {
public CompletableFuture<JSONAPIDocument<List<GlobalRatingWithRank>>> getSearchResultsWithMeta(KnownFeaturedMod ratingType, String nameToSearch, int page, int count) {
switch (ratingType) {
case FAF:
return fafService.findGlobalLeaderboardEntryByQuery(nameToSearch, page, count);
case LADDER_1V1:
return null;
default:
throw new IllegalArgumentException("Not supported: " + ratingType);
}
}

/*public CompletableFuture<List<LeaderboardEntry>> getSearchResults(KnownFeaturedMod ratingType, String nameToSearch, int page, int count) {
switch (ratingType) {
case FAF:
return fafService.findGlobalLeaderboardEntryByQuery(nameToSearch, page, count);
Expand All @@ -77,5 +90,5 @@ public CompletableFuture<List<LeaderboardEntry>> getSearchResults(KnownFeaturedM
throw new IllegalArgumentException("Not supported: " + ratingType);
}
}
}*/
}

0 comments on commit dd13c65

Please sign in to comment.