Skip to content

Commit 2ea2b55

Browse files
committed
feat: add query multiple users/objects/entities statistic results
1 parent 0837e68 commit 2ea2b55

File tree

5 files changed

+282
-4
lines changed

5 files changed

+282
-4
lines changed

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

Lines changed: 44 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,7 +360,7 @@ 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
}
@@ -348,11 +380,20 @@ public Observable<LCLeaderboardResult> getAroundResults(String targetId, int ski
348380
if (StringUtil.isEmpty(this.statisticName)) {
349381
return Observable.error(new IllegalArgumentException("name is empty"));
350382
}
351-
String leaderboardType = convertLeaderboardType(this.memberType);
383+
String leaderboardType = convertLeaderboardType4Rank(this.memberType);
352384
return PaasClient.getStorageClient().getLeaderboardAroundResults(leaderboardType, this.statisticName, targetId,
353385
skip, limit, selectMemberKeys, null, includeStatistics, this.version);
354386
}
355387

388+
/**
389+
* query multiple users/objects/entities statistic results.
390+
* @param targetKeys target id list.
391+
* @return observable instance.
392+
*/
393+
public Observable<LCStatisticResult> queryGroupStatistics(List<String> targetKeys) {
394+
return queryGroupStatistics(this.memberType, this.statisticName, targetKeys);
395+
}
396+
356397
/**
357398
* create leaderboard with default member type(User).
358399
* @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: 16 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,

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

Lines changed: 5 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,
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
package cn.leancloud;
2+
3+
import cn.leancloud.core.LeanCloud;
4+
import io.reactivex.Observer;
5+
import io.reactivex.disposables.Disposable;
6+
import junit.framework.Test;
7+
import junit.framework.TestCase;
8+
import junit.framework.TestSuite;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.concurrent.CountDownLatch;
13+
14+
public class LCLeaderboardTests extends TestCase {
15+
private boolean testSucceed = false;
16+
private CountDownLatch latch = null;
17+
public LCLeaderboardTests(String name) {
18+
super(name);
19+
Configure.initializeWithApp("dY107uv8CYXDIve1V9",
20+
"hOx6DFyU9pXmZDDbNL4piUFto2LJGYp9UcfJFcaQ",
21+
"dy107uv8.cloud.tds1.tapapis.cn");
22+
LeanCloud.setLogLevel(LCLogger.Level.DEBUG);
23+
}
24+
25+
public static Test suite() {
26+
return new TestSuite(LCLeaderboardTests.class);
27+
}
28+
29+
@Override
30+
protected void setUp() throws Exception {
31+
testSucceed = false;
32+
latch = new CountDownLatch(1);
33+
}
34+
35+
@Override
36+
protected void tearDown() throws Exception {
37+
;
38+
}
39+
40+
public void testResultParse() throws Exception {
41+
LCLeaderboard leaderboard = LCLeaderboard.createWithoutData("LearderBoard_Test");
42+
int skip = 0;
43+
int limit = 10;
44+
45+
List<String> selectMemberKeys=new ArrayList<>();
46+
selectMemberKeys.add("username");
47+
List<String> includeStatistics=new ArrayList<>();
48+
includeStatistics.add("LeaderBoard_Test_Also");
49+
50+
leaderboard.getResults(skip, limit, selectMemberKeys, includeStatistics)
51+
.subscribe(new Observer<LCLeaderboardResult>() {
52+
@Override
53+
public void onSubscribe(Disposable disposable) {
54+
}
55+
@Override
56+
public void onNext(LCLeaderboardResult leaderboardResult) {
57+
// rankings是类的成员变量,用于其他方法访问
58+
// 获取的到的数值请见文档末尾
59+
List<LCRanking> rankings = leaderboardResult.getResults();
60+
// X获取的结果为Null
61+
List<LCStatistic> X = rankings.get(0).getStatistics();
62+
// process rankings
63+
// 调用获取成功处理...
64+
if (null != X) {
65+
for (LCStatistic statistic: X) {
66+
System.out.println(statistic.toString());
67+
}
68+
}
69+
70+
// ...
71+
testSucceed = true;
72+
latch.countDown();
73+
}
74+
@Override
75+
public void onError(Throwable throwable) {
76+
// handle error
77+
// 调用获取失败处理...
78+
// ...
79+
latch.countDown();
80+
}
81+
@Override
82+
public void onComplete() {
83+
}
84+
});
85+
latch.await();
86+
assertTrue(testSucceed);
87+
}
88+
89+
public void testUserGroupResultParse() throws Exception {
90+
LCLeaderboard leaderboard = LCLeaderboard.createWithoutData("LearderBoard_Test");
91+
List<String> userIds=new ArrayList<>();
92+
userIds.add("LeaderBoard_Test_1");
93+
userIds.add("LeaderBoard_Test_Also");
94+
95+
leaderboard.queryGroupStatistics(userIds)
96+
.subscribe(new Observer<LCStatisticResult>() {
97+
@Override
98+
public void onSubscribe(Disposable disposable) {
99+
}
100+
@Override
101+
public void onNext(LCStatisticResult leaderboardResult) {
102+
// X获取的结果为Null
103+
List<LCStatistic> X = leaderboardResult.getResults();
104+
// process rankings
105+
// 调用获取成功处理...
106+
if (null != X) {
107+
for (LCStatistic statistic: X) {
108+
System.out.println(statistic.toString());
109+
}
110+
}
111+
112+
// ...
113+
testSucceed = true;
114+
latch.countDown();
115+
}
116+
@Override
117+
public void onError(Throwable throwable) {
118+
// handle error
119+
// 调用获取失败处理...
120+
// ...
121+
latch.countDown();
122+
}
123+
@Override
124+
public void onComplete() {
125+
}
126+
});
127+
latch.await();
128+
assertTrue(testSucceed);
129+
}
130+
131+
public void testObjectGroupResultParse() throws Exception {
132+
LCLeaderboard leaderboard = LCLeaderboard.createWithoutData("LearderBoard_Test", LCLeaderboard.MEMBER_TYPE_OBJECT);
133+
List<String> targetIds=new ArrayList<>();
134+
targetIds.add("LeaderBoard_Test_1");
135+
targetIds.add("LeaderBoard_Test_Also");
136+
137+
leaderboard.queryGroupStatistics(targetIds)
138+
.subscribe(new Observer<LCStatisticResult>() {
139+
@Override
140+
public void onSubscribe(Disposable disposable) {
141+
}
142+
@Override
143+
public void onNext(LCStatisticResult leaderboardResult) {
144+
// X获取的结果为Null
145+
List<LCStatistic> X = leaderboardResult.getResults();
146+
// process rankings
147+
// 调用获取成功处理...
148+
if (null != X) {
149+
for (LCStatistic statistic: X) {
150+
System.out.println(statistic.toString());
151+
}
152+
}
153+
154+
// ...
155+
testSucceed = true;
156+
latch.countDown();
157+
}
158+
@Override
159+
public void onError(Throwable throwable) {
160+
// handle error
161+
// 调用获取失败处理...
162+
// ...
163+
latch.countDown();
164+
}
165+
@Override
166+
public void onComplete() {
167+
}
168+
});
169+
latch.await();
170+
assertTrue(testSucceed);
171+
}
172+
173+
public void testEntityGroupResultParse() throws Exception {
174+
LCLeaderboard leaderboard = LCLeaderboard.createWithoutData("LearderBoard_Test", LCLeaderboard.MEMBER_TYPE_ENTITY);
175+
List<String> targetIds=new ArrayList<>();
176+
targetIds.add("LeaderBoard_Test_1");
177+
targetIds.add("LeaderBoard_Test_Also");
178+
179+
leaderboard.queryGroupStatistics(targetIds)
180+
.subscribe(new Observer<LCStatisticResult>() {
181+
@Override
182+
public void onSubscribe(Disposable disposable) {
183+
}
184+
@Override
185+
public void onNext(LCStatisticResult leaderboardResult) {
186+
// X获取的结果为Null
187+
List<LCStatistic> X = leaderboardResult.getResults();
188+
// process rankings
189+
// 调用获取成功处理...
190+
if (null != X) {
191+
for (LCStatistic statistic: X) {
192+
System.out.println(statistic.toString());
193+
}
194+
}
195+
196+
// ...
197+
testSucceed = true;
198+
latch.countDown();
199+
}
200+
@Override
201+
public void onError(Throwable throwable) {
202+
// handle error
203+
// 调用获取失败处理...
204+
// ...
205+
System.out.println(throwable);
206+
latch.countDown();
207+
}
208+
@Override
209+
public void onComplete() {
210+
}
211+
});
212+
latch.await();
213+
assertTrue(testSucceed);
214+
}
215+
}

0 commit comments

Comments
 (0)