Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix] 이벤트 유저 수가 0명일 때 set 기반 추첨을 진행하면 예외가 발생하는 문제 수정(#153) #154

Merged
merged 2 commits into from
Aug 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ public class AccSumBasedWinnerPicker implements WinnerPicker {
@Override
public List<PickTarget> pick(List<PickTarget> items, long count) {
long maxPickCount = Math.min(items.size(), count);
// TODO: 둘 중 하나를 선택하는 최적 조건 분석하기.
if (count - maxPickCount <= 10 || // 두 값 차이가 작을 때
// pick count = 0이면 아무 것도 안하게 수정
if(maxPickCount == 0) return Collections.emptyList();
if (count - maxPickCount <= 10 ||// 두 값 차이가 작을 때
((double) count / maxPickCount) <= 1.1 ) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

10d / 0이 exception이 나는게 아니라 infinity가 된다고 하네요. devide 0 예외가 아니라 다른 것으로 간주하는 것은 처음 알았습니다.

return pickMany(items, maxPickCount);
} else {
Expand Down Expand Up @@ -50,6 +51,7 @@ protected List<PickTarget> pickManyUsingSet(List<PickTarget> targets, long count
// 가중합 배열
RandomItem[] items = getAccumulatedItems(targets);
List<PickTarget> pickedTargets = new ArrayList<>();
if(items.length == 0) return pickedTargets;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

길이가 0일 때는 바로 배열을 반환하도록 하여 방어적으로 변경했습니다.

long bound = items[items.length - 1].score;
// 이미 선택된 대상이 존재하는 공간
Set<Integer> pickedIdxSet = new HashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,6 @@ public class DrawEventDrawMachine {
@Async
@Transactional
public CompletableFuture<Void> draw(DrawEvent drawEvent) {
try{
Thread.sleep(1000 * 5 * 1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

long drawEventRawId = drawEvent.getId();
// 점수 계산. 추후 추첨 과정과 분리될 수도 있음.
List<DrawEventScorePolicy> policies = drawEvent.getPolicyList();
Expand Down
Loading