Skip to content

Commit d6adb8f

Browse files
committed
feat: add around-in-group leaderboard ranking
1 parent ad397cc commit d6adb8f

File tree

4 files changed

+124
-4
lines changed

4 files changed

+124
-4
lines changed

core/src/main/java/cn/leancloud/LCLeaderboard.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,26 @@ public Observable<LCLeaderboardResult> getAroundResults(String targetId, int ski
405405
skip, limit, selectMemberKeys, null, includeStatistics, this.version);
406406
}
407407

408+
/**
409+
* get leaderboard results around target id within specified group.
410+
* @param groupUserIds user id list.
411+
* @param targetId target user id.
412+
* @param limit query limit.
413+
* @param selectMemberKeys select object keys(optional)
414+
* @param includeStatistics include other statistics(optional)
415+
* @return observable instance.
416+
*/
417+
public Observable<LCLeaderboardResult> getAroundInGroupResults(List<String> groupUserIds, String targetId, int limit,
418+
List<String> selectMemberKeys,
419+
List<String> includeStatistics) {
420+
if (StringUtil.isEmpty(this.statisticName)) {
421+
return Observable.error(new IllegalArgumentException("name is empty"));
422+
}
423+
String leaderboardType = convertLeaderboardType4Rank(this.memberType);
424+
return PaasClient.getStorageClient().getLeaderboardAroundInGroupResults(leaderboardType, this.statisticName,
425+
groupUserIds, targetId, limit, selectMemberKeys, null, includeStatistics, this.version);
426+
}
427+
408428
/**
409429
* query multiple users/objects/entities statistic results.
410430
* @param targetKeys target id list.

core/src/main/java/cn/leancloud/core/StorageClient.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,8 +1154,9 @@ public Observable<LCLeaderboardResult> getLeaderboardGroupResults(String leaderb
11541154
if (version > LCLeaderboard.INVALID_VERSION) {
11551155
params.put("version", version);
11561156
}
1157-
params.put("ids", groupUserIds);
1158-
return wrapObservable(apiService.queryLeaderboardGroupResults(leaderboardType, statisticName, params));
1157+
Map<String, Object> data = new HashMap<>();
1158+
data.put("ids", groupUserIds);
1159+
return wrapObservable(apiService.queryLeaderboardGroupResults(leaderboardType, statisticName, params, data));
11591160
}
11601161

11611162
public Observable<LCLeaderboardResult> getLeaderboardAroundResults(String leaderboardType, String statisticName, String targetId,
@@ -1189,4 +1190,44 @@ public Observable<LCLeaderboardResult> getLeaderboardAroundResults(String leader
11891190
}
11901191
return wrapObservable(apiService.getLeaderboardAroundResults(leaderboardType, statisticName, targetId, params));
11911192
}
1193+
1194+
public Observable<LCLeaderboardResult> getLeaderboardAroundInGroupResults(String leaderboardType, String statisticName,
1195+
List<String> groupUserIds, String targetId,
1196+
int limit, List<String> selectUserKeys,
1197+
List<String> includeUserKeys,
1198+
List<String> includeStatisticNames,
1199+
int version) {
1200+
if (StringUtil.isEmpty(leaderboardType) || StringUtil.isEmpty(statisticName)) {
1201+
return Observable.error(new IllegalArgumentException("memberType or statisticName is null"));
1202+
}
1203+
if (!"user".equalsIgnoreCase(leaderboardType)) {
1204+
return Observable.error(new IllegalArgumentException("only memberType of user is supported."));
1205+
}
1206+
if (null == groupUserIds || groupUserIds.isEmpty()) {
1207+
return Observable.error(new IllegalArgumentException("group user id is empty."));
1208+
}
1209+
String selectKeys = StringUtil.join(",", selectUserKeys);
1210+
String includeKeys = StringUtil.join(",", includeUserKeys);
1211+
String includeStatistics = StringUtil.join(",", includeStatisticNames);
1212+
Map<String, Object> params = new HashMap<>();
1213+
if (limit > 0) {
1214+
params.put("maxResultsCount", limit);
1215+
}
1216+
if (!StringUtil.isEmpty(selectKeys)) {
1217+
params.put("selectKeys", selectKeys);
1218+
}
1219+
if (!StringUtil.isEmpty(includeKeys)) {
1220+
params.put("includeKeys", includeKeys);
1221+
}
1222+
if (!StringUtil.isEmpty(includeStatistics)) {
1223+
params.put("includeStatistics", includeStatistics);
1224+
}
1225+
if (version > LCLeaderboard.INVALID_VERSION) {
1226+
params.put("version", version);
1227+
}
1228+
Map<String, Object> data = new HashMap<>();
1229+
data.put("ids", groupUserIds);
1230+
return wrapObservable(apiService.queryLeaderboardAroundInGroupResults(leaderboardType, statisticName, targetId,
1231+
params, data));
1232+
}
11921233
}

core/src/main/java/cn/leancloud/service/APIService.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,15 @@ Observable<LCLeaderboardResult> getLeaderboardAroundResults(@Path("memberType")
356356
@POST("/1.1/leaderboard/leaderboards/{memberType}/{statisticName}/group/ranks")
357357
Observable<LCLeaderboardResult> queryLeaderboardGroupResults(@Path("memberType") String memberType,
358358
@Path("statisticName") String statisticName,
359-
@Body Map<String, Object> query);
359+
@QueryMap Map<String, Object> query,
360+
@Body Map<String, Object> data);
361+
362+
@POST("/1.1/leaderboard/leaderboards/{memberType}/{statisticName}/group/ranks/{targetId}")
363+
Observable<LCLeaderboardResult> queryLeaderboardAroundInGroupResults(@Path("memberType") String memberType,
364+
@Path("statisticName") String statisticName,
365+
@Path("targetId") String targetId,
366+
@QueryMap Map<String, Object> query,
367+
@Body Map<String, Object> data);
360368

361369
@GET("/1.1/leaderboard/users/self/statistics")
362370
Observable<LCStatisticResult> getAuthenticatedUserStatistics(@Header(HEADER_KEY_LC_SESSIONTOKEN) String sessionToken);

core/src/test/java/cn/leancloud/LCLeaderboardUserTests.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,58 @@ public void testQueryUserGroupLeaderboard() throws Exception {
6363
scores.put("leancloudgogo", random.nextDouble());
6464
LCLeaderboard.updateStatistic(result, scores).blockingFirst();
6565
}
66-
leaderboard.getGroupResults(testObjectIds, 0, 20, null, null)
66+
leaderboard.getGroupResults(testObjectIds, 0, 5, null, null)
67+
.subscribe(new Observer<LCLeaderboardResult>() {
68+
@Override
69+
public void onSubscribe(@NotNull Disposable disposable) {
70+
71+
}
72+
73+
@Override
74+
public void onNext(@NotNull LCLeaderboardResult lcLeaderboardResult) {
75+
for (LCRanking ranking: lcLeaderboardResult.getResults()) {
76+
System.out.println(JSON.toJSONString(ranking));
77+
}
78+
testSucceed = true;
79+
latch.countDown();
80+
}
81+
82+
@Override
83+
public void onError(@NotNull Throwable throwable) {
84+
testSucceed = false;
85+
latch.countDown();
86+
}
87+
88+
@Override
89+
public void onComplete() {
90+
91+
}
92+
});
93+
latch.await();
94+
assertTrue(testSucceed);
95+
}
96+
97+
public void testUserGroupAroundLeaderboard() throws Exception {
98+
LCLeaderboard leaderboard = LCLeaderboard.fetchByName(LEADERBOARD_NAME).blockingFirst();
99+
100+
final String USER_PREFIX = "DeletedUserTest";
101+
List<String> testObjectIds = new ArrayList<>(10);
102+
String username = null;
103+
String userEmail = null;
104+
Random random = new Random();
105+
for (int i = 0; i < 10; i++) {
106+
username = USER_PREFIX + i;
107+
userEmail = username + "@abc.com";
108+
LCUser result = UserFollowshipTest.prepareUser(username, userEmail, true);
109+
testObjectIds.add(result.getObjectId());
110+
if (!result.isAuthenticated()) {
111+
result = LCUser.logIn(username, passwd).blockingFirst();
112+
}
113+
Map<String, Double> scores = new HashMap<>();
114+
scores.put("leancloudgogo", random.nextDouble());
115+
LCLeaderboard.updateStatistic(result, scores).blockingFirst();
116+
}
117+
leaderboard.getAroundInGroupResults(testObjectIds, testObjectIds.get(4), 3, null, null)
67118
.subscribe(new Observer<LCLeaderboardResult>() {
68119
@Override
69120
public void onSubscribe(@NotNull Disposable disposable) {

0 commit comments

Comments
 (0)