Skip to content

Commit

Permalink
refactor: 리뷰어가 matchingSize 만큼 리뷰이와 매칭되도록 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
hjk0761 committed Oct 17, 2024
1 parent 26edce6 commit 183fde8
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ public List<Pair> matchPairs(List<Participation> participations, int roomMatchin
List<Pair> pairs = strategy.matchPairs(nonReviewers, roomMatchingSize);
// 이후 추가적으로 matchingSize 에 따라 매칭 시도
handleAdditionalMatching(nonReviewers, roomMatchingSize, pairs);
// TODO: 리뷰이 매칭 필요
// Reviewer 마다 matchingSize 만큼 reviewee 매칭
if (!reviewers.isEmpty()) {
matchReviewers(reviewers, nonReviewers, pairs);
}
return pairs;
}

Expand All @@ -57,7 +60,6 @@ private void handleAdditionalMatching(List<Participation> nonReviewers, int room

// 지금 가능한 reviewers, reviewees 사이에 매칭 시도
performAdditionalMatching(participations, pairs);

}
}

Expand All @@ -71,6 +73,7 @@ private int getMaxMatchingSize(List<Participation> participations, int roomMatch

// 현재 reviewees 를 기준으로, 모든 reviewee 가 한 번씩 현재 reviewers 에서 가능한 매칭을 시도
private void performAdditionalMatching(List<Participation> participations, List<Pair> pairs) {
// reviewer, reviewee 를 matchingSize 기준 상반되게 정렬하여 매칭 횟수를 최대화
List<Participation> reviewersArray = new ArrayList<>(participations);
ArrayDeque<Member> reviewers = extractMember(reviewersArray);
Collections.reverse(reviewersArray);
Expand Down Expand Up @@ -134,4 +137,24 @@ private boolean isUnderMatchedParticipants(Participation participation, int curr
// MemberRole.BOTH 인 경우 matchingSize 와 currentMatchingSize 를 비교
return participation.getMatchingSize() >= currentMatchingSize;
}

// 모든 Reviewer 에 대해 매칭 시도
private void matchReviewers(List<Participation> reviewers, List<Participation> nonReviewers, List<Pair> pairs) {
ArrayDeque<Member> reviewees = extractMember(nonReviewers);
for (Participation reviewer : reviewers) {
matchRevieweesToReviewer(pairs, reviewer, reviewees);
}
}

// MemberRole.Reviewer 인 참여자는 본인의 matchingSize 만큼 리뷰이를 배정
private void matchRevieweesToReviewer(List<Pair> pairs, Participation reviewerParticipant, ArrayDeque<Member> reviewees) {
for (int count = 0; count < reviewerParticipant.getMatchingSize(); count++) {
Member reviewer = reviewerParticipant.getMember();
Member reviewee = reviewees.pollFirst();
if (isPossiblePair(reviewer, reviewee, pairs)) {
pairs.add(new Pair(reviewer, reviewee));
}
reviewees.add(reviewee);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ void matchPairsWithReviewer() {

List<Pair> pairs = matchingStrategy.matchPairs(participations, room.getMatchingSize());

long reviewerSize = participations.stream().filter(Participation::isReviewer).count();

for (Participation participation : participations) {
long reviewerCount = pairs.stream()
.filter(pair -> pair.getDeliver().getGithubUserId().equals(participation.getMemberGithubId()))
Expand All @@ -108,12 +110,14 @@ void matchPairsWithReviewer() {
.filter(pair -> pair.getReceiver().getGithubUserId().equals(participation.getMemberGithubId()))
.count();
if (participation.getMemberRole().isReviewer()) {
assertThat(reviewerCount).isLessThanOrEqualTo(participation.getMatchingSize());
//MemberRole.REVIEWER 는 matchingSize 만큼 리뷰하고, 이무에게도 리뷰받지 않는다.
assertThat(reviewerCount).isEqualTo(participation.getMatchingSize());
assertThat(revieweeCount).isZero();
} else {
//MemberRole.BOTH 는 최소 roomMatchingSize, 최대 matchingSize 만큼 리뷰하고, 최소 roomMatchingSize, 최대 matchingSize + MemberRole.REVIEWER 수 만큼 리뷰를 받는다.
assertThat(reviewerCount).isLessThanOrEqualTo(participation.getMatchingSize());
assertThat(reviewerCount).isGreaterThanOrEqualTo(room.getMatchingSize());
assertThat(revieweeCount).isLessThanOrEqualTo(participation.getMatchingSize());
assertThat(revieweeCount).isLessThanOrEqualTo(participation.getMatchingSize() + reviewerSize);
assertThat(revieweeCount).isGreaterThanOrEqualTo(room.getMatchingSize());
}
}
Expand Down

0 comments on commit 183fde8

Please sign in to comment.