From 4ab8967722d561ae8db38416b4240e31bedaeac7 Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Mon, 11 Aug 2025 16:32:31 -0400 Subject: [PATCH 1/3] max statements feature, tests, docs --- README.md | 5 +-- .../xapi/client/StatementClient.java | 34 ++++++++++++++++--- .../xapi/client/StatementClientTest.java | 18 ++++++++++ 3 files changed, 51 insertions(+), 6 deletions(-) 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..db37bee 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 From 12e607bf6c32f808a71f277363eada0e92961f67 Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Mon, 11 Aug 2025 16:42:31 -0400 Subject: [PATCH 2/3] whitespace --- src/main/java/com/yetanalytics/xapi/client/StatementClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java index db37bee..758b1c7 100644 --- a/src/main/java/com/yetanalytics/xapi/client/StatementClient.java +++ b/src/main/java/com/yetanalytics/xapi/client/StatementClient.java @@ -159,7 +159,7 @@ public List getStatements(StatementFilters filters, Integer max) { List statements = new ArrayList(); if (max != null && filters.getLimit() != null && - filters.getLimit() > max) + filters.getLimit() > max) filters.setLimit(max); Integer remaining = max; From 6afef59207fbe8c9f7ffe6bfc5c6f90924f33742 Mon Sep 17 00:00:00 2001 From: Cliff Casey Date: Mon, 11 Aug 2025 16:51:49 -0400 Subject: [PATCH 3/3] 0.0.3-beta version change --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 59a27d5..8cbc6c9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.yetanalytics xapi-tools jar - 0.0.2 + 0.0.3-beta xAPI Tools Java Serialization Model and Tools for xAPI Standard (IEEE 9274.1.1) https://github.com/yetanalytics/java-xapi-tools