From 4ec247736be3593686068b64962f3474bf96126e Mon Sep 17 00:00:00 2001 From: Otavio Santana Date: Sat, 30 Mar 2024 16:13:41 +0000 Subject: [PATCH] feat: create implementation cursor Signed-off-by: Otavio Santana --- .../semistructured/CursorExecutor.java | 3 +- .../semistructured/DatabaseManagerTest.java | 64 ++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/jnosql-communication/jnosql-communication-semistructured/src/main/java/org/eclipse/jnosql/communication/semistructured/CursorExecutor.java b/jnosql-communication/jnosql-communication-semistructured/src/main/java/org/eclipse/jnosql/communication/semistructured/CursorExecutor.java index 44b030f73..68014ab6d 100644 --- a/jnosql-communication/jnosql-communication-semistructured/src/main/java/org/eclipse/jnosql/communication/semistructured/CursorExecutor.java +++ b/jnosql-communication/jnosql-communication-semistructured/src/main/java/org/eclipse/jnosql/communication/semistructured/CursorExecutor.java @@ -60,7 +60,8 @@ public CursoredPage cursor(SelectQuery query, PageRequest c.and(condition)).orElse(condition)); + query.condition().map(c -> CriteriaCondition.and(c, condition)) + .orElse(condition)); var entities = template.select(select).toList(); var last = entities.isEmpty() ? null : entities.get(entities.size() - 1); diff --git a/jnosql-communication/jnosql-communication-semistructured/src/test/java/org/eclipse/jnosql/communication/semistructured/DatabaseManagerTest.java b/jnosql-communication/jnosql-communication-semistructured/src/test/java/org/eclipse/jnosql/communication/semistructured/DatabaseManagerTest.java index 06d04ecf6..3afb1ac8d 100644 --- a/jnosql-communication/jnosql-communication-semistructured/src/test/java/org/eclipse/jnosql/communication/semistructured/DatabaseManagerTest.java +++ b/jnosql-communication/jnosql-communication-semistructured/src/test/java/org/eclipse/jnosql/communication/semistructured/DatabaseManagerTest.java @@ -13,7 +13,6 @@ import jakarta.data.page.CursoredPage; import jakarta.data.page.PageRequest; -import org.assertj.core.api.SoftAssertions; import org.eclipse.jnosql.communication.Condition; import org.eclipse.jnosql.communication.TypeReference; import org.junit.jupiter.api.Test; @@ -155,6 +154,69 @@ void shouldReturnPaginationAfterKeySingleElementWhenConditionIsNull() { }); } + @Test + void shouldReturnPaginationAfterKeySingleElementWhenThereIsCondition() { + SelectQuery query = SelectQuery.select().from("person") + .where("address").eq("street") + .orderBy("name").asc() + .orderBy("age").asc() + .orderBy("id").asc() + .build(); + + Mockito.when(databaseManager.select(Mockito.any(SelectQuery.class))) + .thenReturn(stream()); + + var id = UUID.randomUUID().toString(); + CursoredPage entities = databaseManager.selectCursor(query, + PageRequest.ofSize(10).afterKey("Ada", 20, id)); + + ArgumentCaptor captor = ArgumentCaptor.forClass(SelectQuery.class); + Mockito.verify(databaseManager).select(captor.capture()); + SelectQuery selectQuery = captor.getValue(); + + CriteriaCondition condition = selectQuery.condition().orElseThrow(); + + assertSoftly(soft -> { + soft.assertThat(condition.condition()).isEqualTo(Condition.AND); + List criteriaConditions = condition.element().get(new TypeReference<>() { + }); + + soft.assertThat(criteriaConditions).hasSize(2); + soft.assertThat(criteriaConditions.get(0)).isEqualTo(CriteriaCondition.eq("address", "street")); + + CriteriaCondition secondCondition = criteriaConditions.get(1); + soft.assertThat(secondCondition.condition()).isEqualTo(Condition.OR); + List secondConditions = secondCondition.element().get(new TypeReference<>() { + }); + + soft.assertThat(secondConditions).hasSize(3); + soft.assertThat(secondConditions.get(0)).isEqualTo(CriteriaCondition.gt("name", "Ada")); + soft.assertThat(secondConditions.get(1)).isEqualTo( + CriteriaCondition.eq("name", "Ada").and(CriteriaCondition.gt("age", 20))); + soft.assertThat(secondConditions.get(2)).isEqualTo( + CriteriaCondition.eq("name", "Ada").and(CriteriaCondition.eq("age", 20)) + .and(CriteriaCondition.gt("id", id))); + }); + + assertSoftly(soft -> { + PageRequest pageRequest = entities.pageRequest(); + PageRequest nextedPageRequest = entities.nextPageRequest(); + PageRequest.Cursor cursor = nextedPageRequest.cursor().orElseThrow(); + + soft.assertThat(entities).hasSize(2); + soft.assertThat(pageRequest.mode()) + .isEqualTo(PageRequest.Mode.CURSOR_NEXT); + soft.assertThat(nextedPageRequest.mode()) + .isEqualTo(PageRequest.Mode.CURSOR_NEXT); + soft.assertThat(cursor.elements()) + .hasSize(3); + soft.assertThat(cursor.get(0)).isEqualTo("Poliana"); + soft.assertThat(cursor.get(1)).isEqualTo(35); + soft.assertThat(cursor.get(2)).isNotNull(); + + }); + } + private Stream stream() { var entity = CommunicationEntity.of("name"); entity.add("name", "Ada");