diff --git a/README.md b/README.md index 06725d1..87cb6e6 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,9 @@ Current API methods include: `List postStatements(List stmts)` `List postStatement(Statement stmt)` -`List getStatements(StatementFilters filters)` -`List getStatements()` +`List getStatements(StatementFilters filters, Integer max)` - *GET with filters and a max number of statements* +`List getStatements(StatementFilters filters)` - *GET with filters and no max* +`List getStatements()` - *GET all statements (no max, no filters)* The client will batch at the size (optionally) provided to the LRS object. It will also handle retrieving the results from `more` links when the LRS paginates responses. diff --git a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java index 651871d..758b1c7 100644 --- a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java +++ b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java @@ -151,11 +151,19 @@ private URI resolveMore(URI moreLink) { * Method to get Statements from LRS * * @param filters StatementFilters object to filter the query. + * @param max Max total number of statements to retrieve regardless + * of `limit` size per query * @return All statements that match filter */ - public List getStatements(StatementFilters filters) { + public List getStatements(StatementFilters filters, Integer max) { List statements = new ArrayList(); + if (max != null && filters.getLimit() != null && + filters.getLimit() > max) + filters.setLimit(max); + + Integer remaining = max; + URI target = lrs.getHost().resolve(STATEMENT_ENDPOINT); if (filters != null) { target = filters.addQueryToUri(target); @@ -170,8 +178,16 @@ public List getStatements(StatementFilters filters) { target = null; } else { StatementResult result = doGetStatementResult(target); - statements.addAll(result.getStatements()); - target = resolveMore(result.getMore()); + List stmts = result.getStatements(); + if (remaining != null && stmts.size() >= remaining) { + stmts = stmts.subList(0, remaining); + target = null; + } else { + target = resolveMore(result.getMore()); + if (remaining != null) + remaining = remaining - stmts.size(); + } + statements.addAll(stmts); } } @@ -181,13 +197,23 @@ public List getStatements(StatementFilters filters) { return statements; } + /** + * Wrapper for getStatements where `max` = `null` (unlimited). + * + * @param filters StatementFilters object to filter the query. + * @return All statements that match filter + */ + public List getStatements(StatementFilters filters) { + return getStatements(filters, null); + } + /** * Method to get Statements from LRS with no filters * * @return All statements */ public List getStatements() { - return getStatements(null); + return getStatements(null, null); } } diff --git a/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java b/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java index 86b4998..2158ecd 100644 --- a/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java +++ b/src/test/java/com/yetanalytics/xapi/client/StatementClientTest.java @@ -146,6 +146,24 @@ public void testLargeBatchPost() throws StreamReadException, DatabindException, assertTrue(result != null); assertEquals(result.size(), 200); assertEquals(result.get(0).getContext().getRegistration(), sessionId); + + //max + List resultMax = client.getStatements(filter, 37); + assertEquals(resultMax.size(), 37); + + //max with low limit + filter.setLimit(10); + List resultMaxLowLimit = client.getStatements(filter, 42); + assertEquals(resultMaxLowLimit.size(), 42); + + //max with high limit + filter.setLimit(100); + List resultMaxHighLimit = client.getStatements(filter, 96); + assertEquals(resultMaxHighLimit.size(), 96); + + //max above result + List resultMaxAboveResult = client.getStatements(filter, 300); + assertEquals(resultMaxAboveResult.size(), 200); } @Test