Skip to content
This repository was archived by the owner on Dec 27, 2024. It is now read-only.

Commit a2a81a2

Browse files
dev/codeforces/ Добавил мапперы для превращения модели в response
1 parent 1ea7521 commit a2a81a2

File tree

5 files changed

+155
-26
lines changed

5 files changed

+155
-26
lines changed

src/main/java/com/cf/cfteam/utils/codeforces/GroupMapper.java

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.cf.cfteam.utils.codeforces;
2+
3+
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
4+
5+
import java.util.List;
6+
7+
public class RatingCalculator {
8+
9+
public static double getWinProbability(double ra, double rb) {
10+
return 1.0 / (1.0 + Math.pow(10.0, (rb - ra) / 400.0));
11+
}
12+
13+
public static double aggregateRatings(List<PlayerResponse> players) {
14+
double left = 1.0;
15+
double right = 1E4;
16+
17+
for (int tt = 0; tt < 100; tt++) {
18+
double r = (left + right) / 2.0;
19+
20+
double rWinsProbability = 1.0;
21+
for (PlayerResponse player : players) {
22+
rWinsProbability *= getWinProbability(r, player.rating());
23+
}
24+
25+
double rating = Math.log10(1 / rWinsProbability - 1) * 400 + r;
26+
27+
if (rating > r) {
28+
left = r;
29+
} else {
30+
right = r;
31+
}
32+
}
33+
34+
return (left + right) / 2.0;
35+
}
36+
37+
private RatingCalculator() {
38+
throw new UnsupportedOperationException("Utility class");
39+
}
40+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.cf.cfteam.utils.codeforces.mappers;
2+
3+
import com.cf.cfteam.models.entities.codeforces.Group;
4+
import com.cf.cfteam.models.entities.security.User;
5+
import com.cf.cfteam.transfer.payloads.codeforces.GroupPayload;
6+
import com.cf.cfteam.transfer.responses.codeforces.GroupResponse;
7+
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
8+
import com.cf.cfteam.transfer.responses.codeforces.TeamResponse;
9+
import lombok.NoArgsConstructor;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.stereotype.Component;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
@Component
17+
@RequiredArgsConstructor
18+
public final class GroupMapper {
19+
20+
private final TeamMapper teamMapper;
21+
22+
public Group fromPayloadToEntity(GroupPayload payload, User user) {
23+
return Group.builder()
24+
.name(payload.name())
25+
.description(payload.description())
26+
.user(user)
27+
.build();
28+
}
29+
30+
public Group updateEntityFromPayload(Group group, GroupPayload payload) {
31+
group.setName(payload.name());
32+
group.setDescription(payload.description());
33+
return group;
34+
}
35+
36+
public GroupResponse fromEntityToResponse(Group group) {
37+
List<TeamResponse> convertedTeams = new ArrayList<>();
38+
39+
if (group.getTeams() != null) {
40+
convertedTeams = group.getTeams().stream()
41+
.map(teamMapper::fromEntityToResponse)
42+
.toList();
43+
}
44+
45+
return GroupResponse.builder()
46+
.id(group.getId())
47+
.name(group.getName())
48+
.description(group.getDescription())
49+
.teams(convertedTeams)
50+
.build();
51+
}
52+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.cf.cfteam.utils.codeforces.mappers;
2+
3+
import com.cf.cfteam.models.entities.codeforces.Player;
4+
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
5+
import com.github.benmanes.caffeine.cache.Cache;
6+
import com.github.benmanes.caffeine.cache.LoadingCache;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.stereotype.Component;
10+
11+
@Component
12+
@RequiredArgsConstructor
13+
public class PlayerMapper {
14+
15+
private final LoadingCache<String, Double> ratingCache;
16+
17+
public PlayerResponse fromEntityToResponse(Player player) {
18+
return PlayerResponse.builder()
19+
.id(player.getId())
20+
.login(player.getLogin())
21+
.rating(ratingCache.get(player.getLogin()))
22+
.build();
23+
}
24+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.cf.cfteam.utils.codeforces.mappers;
2+
3+
import com.cf.cfteam.models.entities.codeforces.Team;
4+
import com.cf.cfteam.transfer.responses.codeforces.PlayerResponse;
5+
import com.cf.cfteam.transfer.responses.codeforces.TeamResponse;
6+
import com.cf.cfteam.utils.codeforces.RatingCalculator;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
@Component
14+
@RequiredArgsConstructor
15+
public class TeamMapper {
16+
17+
private final PlayerMapper playerMapper;
18+
19+
public TeamResponse fromEntityToResponse(Team team) {
20+
List<PlayerResponse> convertedPlayers = new ArrayList<>();
21+
Double teamRating = 0.;
22+
23+
if (team.getPlayers() != null) {
24+
convertedPlayers = team.getPlayers().stream()
25+
.map(playerMapper::fromEntityToResponse)
26+
.toList();
27+
28+
teamRating = RatingCalculator.aggregateRatings(convertedPlayers);
29+
}
30+
31+
return TeamResponse.builder()
32+
.id(team.getId())
33+
.name(team.getName())
34+
.description(team.getDescription())
35+
.players(convertedPlayers)
36+
.teamRating(teamRating)
37+
.build();
38+
}
39+
}

0 commit comments

Comments
 (0)