Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ Current API methods include:

`List<UUID> postStatements(List<Statement> stmts)`
`List<UUID> postStatement(Statement stmt)`
`List<Statement> getStatements(StatementFilters filters)`
`List<Statement> getStatements()`
`List<Statement> getStatements(StatementFilters filters, Integer max)` - *GET with filters and a max number of statements*
`List<Statement> getStatements(StatementFilters filters)` - *GET with filters and no max*
`List<Statement> 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.

Expand Down
34 changes: 30 additions & 4 deletions src/main/java/com/yetanalytics/xapi/client/StatementClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Statement> getStatements(StatementFilters filters) {
public List<Statement> getStatements(StatementFilters filters, Integer max) {
List<Statement> statements = new ArrayList<Statement>();

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);
Expand All @@ -170,8 +178,16 @@ public List<Statement> getStatements(StatementFilters filters) {
target = null;
} else {
StatementResult result = doGetStatementResult(target);
statements.addAll(result.getStatements());
target = resolveMore(result.getMore());
List<Statement> 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);
}
}

Expand All @@ -181,13 +197,23 @@ public List<Statement> 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<Statement> getStatements(StatementFilters filters) {
return getStatements(filters, null);
}

/**
* Method to get Statements from LRS with no filters
*
* @return All statements
*/
public List<Statement> getStatements() {
return getStatements(null);
return getStatements(null, null);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Statement> resultMax = client.getStatements(filter, 37);
assertEquals(resultMax.size(), 37);

//max with low limit
filter.setLimit(10);
List<Statement> resultMaxLowLimit = client.getStatements(filter, 42);
assertEquals(resultMaxLowLimit.size(), 42);

//max with high limit
filter.setLimit(100);
List<Statement> resultMaxHighLimit = client.getStatements(filter, 96);
assertEquals(resultMaxHighLimit.size(), 96);

//max above result
List<Statement> resultMaxAboveResult = client.getStatements(filter, 300);
assertEquals(resultMaxAboveResult.size(), 200);
}

@Test
Expand Down