Skip to content

Commit 334660f

Browse files
authored
Merge pull request #220 from jwfing/master
feat: add query multiple users/objects/entities statistic results
2 parents 0837e68 + d6adb8f commit 334660f

File tree

8 files changed

+715
-10
lines changed

8 files changed

+715
-10
lines changed

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

Lines changed: 84 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class LCLeaderboard {
1111
public static final int INVALID_VERSION = -1;
1212
public static final String MEMBER_TYPE_USER = "_User";
1313
public static final String MEMBER_TYPE_ENTITY = "_Entity";
14+
public static final String MEMBER_TYPE_OBJECT = "_Object";
1415

1516
static final String ATTR_STATISTIC_NAME = "statisticName";
1617
static final String ATTR_MEMBER_TYPE = "memberType";
@@ -288,7 +289,26 @@ public static Observable<LCStatisticResult> getMemberStatistics(String memberTyp
288289
}
289290
}
290291

291-
static String convertLeaderboardType(String memberType) {
292+
/**
293+
* query a group of users/objects/entities statistic results.
294+
* @param memberType member type.
295+
* MEMBER_TYPE_USER("_User"): leaderboard target is LCUser
296+
* MEMBER_TYPE_ENTITY("_Entity"): leaderboard target is any entity
297+
* MEMBER_TYPE_ENTITY("_Object"): leaderboard target is LCObject
298+
* @param statisticName statistic names.
299+
* @param targetKeys target ids.
300+
* @return observable instance.
301+
*/
302+
public static Observable<LCStatisticResult> queryGroupStatistics(String memberType, String statisticName,
303+
List<String> targetKeys) {
304+
if (StringUtil.isEmpty(statisticName)) {
305+
return Observable.error(new IllegalArgumentException("name is empty"));
306+
}
307+
String leaderboardType = convertLeaderboardType4Stats(memberType);
308+
return PaasClient.getStorageClient().getGroupStatistics(leaderboardType, statisticName, targetKeys);
309+
}
310+
311+
static String convertLeaderboardType4Rank(String memberType) {
292312
String leaderboardType = null;
293313
if (MEMBER_TYPE_USER.equalsIgnoreCase(memberType)) {
294314
leaderboardType = "user";
@@ -300,6 +320,18 @@ static String convertLeaderboardType(String memberType) {
300320
return leaderboardType;
301321
}
302322

323+
static String convertLeaderboardType4Stats(String memberType) {
324+
String leaderboardType = null;
325+
if (MEMBER_TYPE_USER.equalsIgnoreCase(memberType)) {
326+
leaderboardType = "users";
327+
} else if (MEMBER_TYPE_ENTITY.equalsIgnoreCase(memberType)) {
328+
leaderboardType = "entities";
329+
} else {
330+
leaderboardType = "objects";
331+
}
332+
return leaderboardType;
333+
}
334+
303335
/**
304336
* get leaderboard results.
305337
* @param skip query offset
@@ -328,11 +360,31 @@ public Observable<LCLeaderboardResult> getResults(int skip, int limit, List<Stri
328360
if (StringUtil.isEmpty(this.statisticName)) {
329361
return Observable.error(new IllegalArgumentException("name is empty"));
330362
}
331-
String leaderboardType = convertLeaderboardType(this.memberType);
363+
String leaderboardType = convertLeaderboardType4Rank(this.memberType);
332364
return PaasClient.getStorageClient().getLeaderboardResults(leaderboardType, this.statisticName,
333365
skip, limit, selectMemberKeys, null, includeStatistics, this.version, withCount);
334366
}
335367

368+
/**
369+
* get group user's ranking.
370+
* @param groupUserIds user id list.
371+
* @param skip skip number.
372+
* @param limit max result limitation.
373+
* @param selectMemberKeys select member(user) keys(optional)
374+
* @param includeStatistics include other statistics(optional)
375+
* @return observable instance.
376+
*/
377+
public Observable<LCLeaderboardResult> getGroupResults(List<String> groupUserIds,
378+
int skip, int limit, List<String> selectMemberKeys,
379+
List<String> includeStatistics) {
380+
if (StringUtil.isEmpty(this.statisticName)) {
381+
return Observable.error(new IllegalArgumentException("name is empty"));
382+
}
383+
String leaderboardType = convertLeaderboardType4Rank(this.memberType);
384+
return PaasClient.getStorageClient().getLeaderboardGroupResults(leaderboardType, this.statisticName,
385+
groupUserIds, skip, limit, selectMemberKeys, null, includeStatistics, this.version);
386+
}
387+
336388
/**
337389
* get leaderboard results around target id(user, object or entity).
338390
* @param targetId target objectId
@@ -348,11 +400,40 @@ public Observable<LCLeaderboardResult> getAroundResults(String targetId, int ski
348400
if (StringUtil.isEmpty(this.statisticName)) {
349401
return Observable.error(new IllegalArgumentException("name is empty"));
350402
}
351-
String leaderboardType = convertLeaderboardType(this.memberType);
403+
String leaderboardType = convertLeaderboardType4Rank(this.memberType);
352404
return PaasClient.getStorageClient().getLeaderboardAroundResults(leaderboardType, this.statisticName, targetId,
353405
skip, limit, selectMemberKeys, null, includeStatistics, this.version);
354406
}
355407

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+
428+
/**
429+
* query multiple users/objects/entities statistic results.
430+
* @param targetKeys target id list.
431+
* @return observable instance.
432+
*/
433+
public Observable<LCStatisticResult> queryGroupStatistics(List<String> targetKeys) {
434+
return queryGroupStatistics(this.memberType, this.statisticName, targetKeys);
435+
}
436+
356437
/**
357438
* create leaderboard with default member type(User).
358439
* @param name name

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package cn.leancloud;
22

3+
import java.util.ArrayList;
34
import java.util.List;
45

56
public class LCStatisticResult {
6-
private List<LCStatistic> results;
7+
private List<LCStatistic> results = new ArrayList<>();
78

89
/**
910
* getter

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

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,6 +1065,22 @@ public Observable<LCStatisticResult> getObjectStatistics(final String objectId,
10651065
return wrapObservable(apiService.getObjectStatistics(objectId, statistics));
10661066
}
10671067

1068+
public Observable<LCStatisticResult> getGroupStatistics(final String leaderboardType, final String statisticName,
1069+
List<String> targetKeys) {
1070+
if (StringUtil.isEmpty(leaderboardType)) {
1071+
return Observable.error(new IllegalArgumentException("leaderboard type is null"));
1072+
}
1073+
if (StringUtil.isEmpty(statisticName)) {
1074+
return Observable.error(new IllegalArgumentException("statistic name is null"));
1075+
}
1076+
if (null == targetKeys || targetKeys.size() < 1) {
1077+
return Observable.just(new LCStatisticResult());
1078+
}
1079+
Map<String, Object> param = new HashMap<>();
1080+
param.put("ids", targetKeys);
1081+
return wrapObservable(apiService.queryGroupStatistics(leaderboardType, statisticName, param));
1082+
}
1083+
10681084
public Observable<LCLeaderboardResult> getLeaderboardResults(String leaderboardType, String statisticName, int skip, int limit,
10691085
List<String> selectUserKeys,
10701086
List<String> includeUserKeys,
@@ -1101,6 +1117,48 @@ public Observable<LCLeaderboardResult> getLeaderboardResults(String leaderboardT
11011117
return wrapObservable(apiService.getLeaderboardResults(leaderboardType, statisticName, params));
11021118
}
11031119

1120+
public Observable<LCLeaderboardResult> getLeaderboardGroupResults(String leaderboardType, String statisticName,
1121+
List<String> groupUserIds,
1122+
int skip, int limit, List<String> selectUserKeys,
1123+
List<String> includeUserKeys,
1124+
List<String> includeStatisticNames,
1125+
int version) {
1126+
if (StringUtil.isEmpty(leaderboardType) || StringUtil.isEmpty(statisticName)) {
1127+
return Observable.error(new IllegalArgumentException("memberType or statisticName is null"));
1128+
}
1129+
if (!"user".equalsIgnoreCase(leaderboardType)) {
1130+
return Observable.error(new IllegalArgumentException("only memberType of user is supported."));
1131+
}
1132+
if (null == groupUserIds || groupUserIds.isEmpty()) {
1133+
return Observable.error(new IllegalArgumentException("group user id is empty."));
1134+
}
1135+
String selectKeys = StringUtil.join(",", selectUserKeys);
1136+
String includeKeys = StringUtil.join(",", includeUserKeys);
1137+
String includeStatistics = StringUtil.join(",", includeStatisticNames);
1138+
Map<String, Object> params = new HashMap<>();
1139+
if (skip > 0) {
1140+
params.put("startPosition", skip);
1141+
}
1142+
if (limit > 0) {
1143+
params.put("maxResultsCount", limit);
1144+
}
1145+
if (!StringUtil.isEmpty(selectKeys)) {
1146+
params.put("selectKeys", selectKeys);
1147+
}
1148+
if (!StringUtil.isEmpty(includeKeys)) {
1149+
params.put("includeKeys", includeKeys);
1150+
}
1151+
if (!StringUtil.isEmpty(includeStatistics)) {
1152+
params.put("includeStatistics", includeStatistics);
1153+
}
1154+
if (version > LCLeaderboard.INVALID_VERSION) {
1155+
params.put("version", version);
1156+
}
1157+
Map<String, Object> data = new HashMap<>();
1158+
data.put("ids", groupUserIds);
1159+
return wrapObservable(apiService.queryLeaderboardGroupResults(leaderboardType, statisticName, params, data));
1160+
}
1161+
11041162
public Observable<LCLeaderboardResult> getLeaderboardAroundResults(String leaderboardType, String statisticName, String targetId,
11051163
int skip, int limit, List<String> selectUserKeys,
11061164
List<String> includeUserKeys,
@@ -1132,4 +1190,44 @@ public Observable<LCLeaderboardResult> getLeaderboardAroundResults(String leader
11321190
}
11331191
return wrapObservable(apiService.getLeaderboardAroundResults(leaderboardType, statisticName, targetId, params));
11341192
}
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+
}
11351233
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,11 @@ Observable<LCStatisticResult> updateObjectStatistics(@Path("objectId") String ob
338338
@GET("/1.1/leaderboard/objects/{objectId}/statistics")
339339
Observable<LCStatisticResult> getObjectStatistics(@Path("objectId") String objectId, @Query("statistics") String statistics);
340340

341+
@POST("/1.1/leaderboard/{memberType}/statistics/{statisticName}")
342+
Observable<LCStatisticResult> queryGroupStatistics(@Path("memberType") String memberType,
343+
@Path("statisticName") String statisticName,
344+
@Body Map<String, Object> param);
345+
341346
@GET("/1.1/leaderboard/leaderboards/{memberType}/{statisticName}/ranks")
342347
Observable<LCLeaderboardResult> getLeaderboardResults(@Path("memberType") String memberType,
343348
@Path("statisticName") String statisticName,
@@ -348,6 +353,19 @@ Observable<LCLeaderboardResult> getLeaderboardAroundResults(@Path("memberType")
348353
@Path("entityId") String entityId,
349354
@QueryMap Map<String, Object> query);
350355

356+
@POST("/1.1/leaderboard/leaderboards/{memberType}/{statisticName}/group/ranks")
357+
Observable<LCLeaderboardResult> queryLeaderboardGroupResults(@Path("memberType") String memberType,
358+
@Path("statisticName") String statisticName,
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);
368+
351369
@GET("/1.1/leaderboard/users/self/statistics")
352370
Observable<LCStatisticResult> getAuthenticatedUserStatistics(@Header(HEADER_KEY_LC_SESSIONTOKEN) String sessionToken);
353371

0 commit comments

Comments
 (0)