Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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