diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cc8a653..4911528 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,9 +17,13 @@ jobs: java-version: '21' distribution: 'temurin' + - name: Set versions + run: | + export BUILD_VERSION=$(test "$GITHUB_REF_TYPE" = "tag" && echo ${GITHUB_REF_NAME} || (echo ${GITHUB_SHA} | head -c 8)) + ./mvnw versions:set -DnewVersion=${BUILD_VERSION} + - name: Build project - run: ./mvnw -s .mvn/settings.xml clean install -DskipTests + run: ./mvnw -s .mvn/settings.xml clean install - name: Deploy project - run: ./mvnw -s .mvn/settings.xml deploy -DskipTests - + run: ./mvnw -s .mvn/settings.xml deploy diff --git a/integration/semrack-integration/src/test/java/fr/codeanddata/SemrackApiIT.java b/integration/semrack-integration/src/test/java/fr/codeanddata/SemrackApiIT.java deleted file mode 100644 index 6f0a011..0000000 --- a/integration/semrack-integration/src/test/java/fr/codeanddata/SemrackApiIT.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.codeanddata; - -import io.quarkus.test.junit.QuarkusIntegrationTest; - -@QuarkusIntegrationTest -class SemrackApiIT extends SemrackApiTest { - // Execute the same tests but in packaged mode. -} diff --git a/integration/semrack-integration/src/test/java/fr/codeanddata/SemrackApiTest.java b/integration/semrack-integration/src/test/java/fr/codeanddata/SemrackApiTest.java deleted file mode 100644 index 53be737..0000000 --- a/integration/semrack-integration/src/test/java/fr/codeanddata/SemrackApiTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.codeanddata; - -import io.quarkus.test.junit.QuarkusTest; -import org.junit.jupiter.api.Test; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.CoreMatchers.is; - -@QuarkusTest -class SemrackApiTest { - @Test - void testHelloEndpoint() { - given() - .when().get("/hello") - .then() - .statusCode(200) - .body(is("Hello from Quarkus REST")); - } - -} diff --git a/modules/semrack-api-rest/runtime/src/main/java/fr/codeanddata/semrack/api/rest/SemrackApi.java b/modules/semrack-api-rest/runtime/src/main/java/fr/codeanddata/semrack/api/rest/SemrackApi.java index f9ab2aa..565412a 100644 --- a/modules/semrack-api-rest/runtime/src/main/java/fr/codeanddata/semrack/api/rest/SemrackApi.java +++ b/modules/semrack-api-rest/runtime/src/main/java/fr/codeanddata/semrack/api/rest/SemrackApi.java @@ -1,50 +1,54 @@ package fr.codeanddata.semrack.api.rest; -import fr.codeanddata.semrack.core.models.PushDocumentRequest; -import fr.codeanddata.semrack.core.models.SearchRequest; -import fr.codeanddata.semrack.core.models.SearchResult; -import fr.codeanddata.semrack.core.models.SemrackDocument; -import fr.codeanddata.semrack.core.repositories.SemdocRepository; +import fr.codeanddata.semrack.core.models.*; +import fr.codeanddata.semrack.core.repositories.DocumentRepository; import io.smallrye.mutiny.Uni; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.jboss.resteasy.reactive.RestPath; @Path("/semrack/documents") -//@Authenticated public class SemrackApi { @Inject - SemdocRepository repository; + DocumentRepository repository; @POST @Produces(MediaType.APPLICATION_JSON) - public Uni pushDocument(PushDocumentRequest semrackDocument) { + public Uni pushDocument(PushDocument semrackDocument) { return repository.pushDocument(semrackDocument); } @POST @Path("/search") @Produces(MediaType.APPLICATION_JSON) - public Uni searchDocument(SearchRequest query) { + public Uni searchDocument(Search query) { return repository.searchDocument(query); } @GET @Path("{uid}") @Produces(MediaType.APPLICATION_JSON) - public Uni getDocument(@RestPath String uid) { + public Uni getDocument(@RestPath String uid) { return repository.get(uid); } @POST @Path("{uid}") @Produces(MediaType.APPLICATION_JSON) - public Uni updateDocument(@RestPath String uid, PushDocumentRequest semrackDocument) { + public Uni getDocument(@RestPath String uid, StorageGet request) { + return repository.get(uid, request); + } + + @POST + @Path("{uid}/update") + @Produces(MediaType.APPLICATION_JSON) + public Uni updateDocument(@RestPath String uid, PushDocument semrackDocument) { return repository.pushDocument(semrackDocument); } } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/Index.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/Index.java new file mode 100644 index 0000000..42e8554 --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/Index.java @@ -0,0 +1,13 @@ +package fr.codeanddata.semrack.core; + +import fr.codeanddata.semrack.core.models.IndexSearchResult; +import fr.codeanddata.semrack.core.models.Search; +import io.smallrye.mutiny.Uni; + +public interface Index { + Uni count(Search request); + Uni exist(Search query); + Uni index(String documentId); + Uni search(Search search); + Uni clear(String documentId); +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemrackLookupExpression.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/LookupExpression.java similarity index 91% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemrackLookupExpression.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/LookupExpression.java index 8645964..117a7de 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemrackLookupExpression.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/LookupExpression.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.enterprise.inject.spi.CDI; -public interface SemrackLookupExpression { +public interface LookupExpression { String apply(Object params); default T convert(Object params) { diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/ReadInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/ReadInterceptor.java new file mode 100644 index 0000000..9cb9fce --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/ReadInterceptor.java @@ -0,0 +1,8 @@ +package fr.codeanddata.semrack.core; + +import fr.codeanddata.semrack.core.models.ReadContext; +import io.smallrye.mutiny.Uni; + +public interface ReadInterceptor { + Uni interceptSemdocRead(ReadContext context); +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SearchInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SearchInterceptor.java new file mode 100644 index 0000000..50771f3 --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SearchInterceptor.java @@ -0,0 +1,8 @@ +package fr.codeanddata.semrack.core; + +import fr.codeanddata.semrack.core.models.SearchContext; +import io.smallrye.mutiny.Uni; + +public interface SearchInterceptor { + Uni interceptSemdocSearch(SearchContext context); +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocIndex.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocIndex.java deleted file mode 100644 index e815c16..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocIndex.java +++ /dev/null @@ -1,13 +0,0 @@ -package fr.codeanddata.semrack.core; - -import fr.codeanddata.semrack.core.models.IndexSearchResult; -import fr.codeanddata.semrack.core.models.SearchRequest; -import io.smallrye.mutiny.Uni; - -public interface SemdocIndex { - Uni count(SearchRequest request); - Uni exist(SearchRequest query); - Uni index(String documentId); - Uni search(SearchRequest searchRequest); - Uni clear(String documentId); -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocReadInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocReadInterceptor.java deleted file mode 100644 index af08011..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocReadInterceptor.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.codeanddata.semrack.core; - -import fr.codeanddata.semrack.core.models.SemdocReadContext; -import io.smallrye.mutiny.Uni; - -public interface SemdocReadInterceptor { - Uni interceptSemdocRead(SemdocReadContext context); -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocSearchInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocSearchInterceptor.java deleted file mode 100644 index c6719a9..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocSearchInterceptor.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.codeanddata.semrack.core; - -import fr.codeanddata.semrack.core.models.SemdocSearchContext; -import io.smallrye.mutiny.Uni; - -public interface SemdocSearchInterceptor { - Uni interceptSemdocSearch(SemdocSearchContext context); -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocStorage.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocStorage.java deleted file mode 100644 index 9ea7a41..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocStorage.java +++ /dev/null @@ -1,12 +0,0 @@ -package fr.codeanddata.semrack.core; - -import fr.codeanddata.semrack.core.models.SemrackDocument; -import io.smallrye.mutiny.Uni; - -import java.util.List; - -public interface SemdocStorage { - Uni get(String uid); - Uni> get(List uids); - Uni storeDocument(SemrackDocument document); -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocWriteInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocWriteInterceptor.java deleted file mode 100644 index ed7d7da..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/SemdocWriteInterceptor.java +++ /dev/null @@ -1,8 +0,0 @@ -package fr.codeanddata.semrack.core; - -import fr.codeanddata.semrack.core.models.SemdocWriteContext; -import io.smallrye.mutiny.Uni; - -public interface SemdocWriteInterceptor { - Uni interceptSemdocWrite(SemdocWriteContext context); -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/Storage.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/Storage.java new file mode 100644 index 0000000..c27c527 --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/Storage.java @@ -0,0 +1,13 @@ +package fr.codeanddata.semrack.core; + +import fr.codeanddata.semrack.core.models.Document; +import fr.codeanddata.semrack.core.models.StorageGet; +import io.smallrye.mutiny.Uni; + +import java.util.List; + +public interface Storage { + Uni get(String uid, StorageGet request); + Uni> get(List uids, StorageGet request); + Uni storeDocument(Document document); +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/WriteInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/WriteInterceptor.java new file mode 100644 index 0000000..a3419e8 --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/WriteInterceptor.java @@ -0,0 +1,8 @@ +package fr.codeanddata.semrack.core; + +import fr.codeanddata.semrack.core.models.WriteContext; +import io.smallrye.mutiny.Uni; + +public interface WriteInterceptor { + Uni interceptSemdocWrite(WriteContext context); +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/enums/SemrackSortDirection.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/enums/SortDirection.java similarity index 62% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/enums/SemrackSortDirection.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/enums/SortDirection.java index c7ab71a..1d911e3 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/enums/SemrackSortDirection.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/enums/SortDirection.java @@ -1,5 +1,5 @@ package fr.codeanddata.semrack.core.enums; -public enum SemrackSortDirection { +public enum SortDirection { asc, desc } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/AnnotateWriteInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/AnnotateWriteInterceptor.java index a74c986..0747b3d 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/AnnotateWriteInterceptor.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/AnnotateWriteInterceptor.java @@ -2,8 +2,8 @@ package fr.codeanddata.semrack.core.interceptors; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import fr.codeanddata.semrack.core.SemdocWriteInterceptor; -import fr.codeanddata.semrack.core.models.SemdocWriteContext; +import fr.codeanddata.semrack.core.WriteInterceptor; +import fr.codeanddata.semrack.core.models.WriteContext; import io.smallrye.mutiny.Uni; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -11,7 +11,7 @@ import jakarta.inject.Inject; import java.util.Map; @ApplicationScoped -public class AnnotateWriteInterceptor implements SemdocWriteInterceptor { +public class AnnotateWriteInterceptor implements WriteInterceptor { public static final String ANNOTATE_KEY = "annotate"; public static final String CUSTOM_PREFIX = "custom/"; @@ -20,7 +20,7 @@ public class AnnotateWriteInterceptor implements SemdocWriteInterceptor { ObjectMapper objectMapper; @Override - public Uni interceptSemdocWrite(SemdocWriteContext context) { + public Uni interceptSemdocWrite(WriteContext context) { final Map directives = context.getDirectives(); if (directives.containsKey(ANNOTATE_KEY)) { diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/PublishWriteInterceptor.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/PublishWriteInterceptor.java index ca37090..9fb14c9 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/PublishWriteInterceptor.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/interceptors/PublishWriteInterceptor.java @@ -1,8 +1,8 @@ package fr.codeanddata.semrack.core.interceptors; -import fr.codeanddata.semrack.core.SemdocWriteInterceptor; -import fr.codeanddata.semrack.core.models.SemdocWriteContext; -import fr.codeanddata.semrack.core.models.SemrackDocument; +import fr.codeanddata.semrack.core.WriteInterceptor; +import fr.codeanddata.semrack.core.models.WriteContext; +import fr.codeanddata.semrack.core.models.Document; import fr.codeanddata.semrack.core.utils.UIDGenerator; import io.smallrye.mutiny.Uni; import jakarta.enterprise.context.ApplicationScoped; @@ -12,7 +12,7 @@ import java.util.Map; import java.util.Optional; @ApplicationScoped -public class PublishWriteInterceptor implements SemdocWriteInterceptor { +public class PublishWriteInterceptor implements WriteInterceptor { final String PUBLICATION_PREFIX = "publication/"; @@ -20,18 +20,18 @@ public class PublishWriteInterceptor implements SemdocWriteInterceptor { UIDGenerator uidGenerator; @Override - public Uni interceptSemdocWrite(SemdocWriteContext context) { + public Uni interceptSemdocWrite(WriteContext context) { final Map directives = context.getDirectives(); - final SemrackDocument current = context.getCurrentDocument(); - final SemrackDocument next = context.getNextDocument(); + final Document current = context.getCurrentDocument(); + final Document next = context.getNextDocument(); int version = (int) Optional.ofNullable(current) - .map(SemrackDocument::getAnnotations) + .map(Document::getAnnotations) .map(annotations -> annotations.getOrDefault(PUBLICATION_PREFIX + "version", 0)) .orElse(0); next.getAnnotations().put(PUBLICATION_PREFIX + "reference", Optional.ofNullable(current) - .map(SemrackDocument::getAnnotations) + .map(Document::getAnnotations) .map(annotations -> annotations.getOrDefault(PUBLICATION_PREFIX + "reference", next.getUid())) .orElse(next.getUid())); diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/mappers/SemrackDocumentMapper.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/mappers/DocumentMapper.java similarity index 56% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/mappers/SemrackDocumentMapper.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/mappers/DocumentMapper.java index c2cf8de..e04367d 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/mappers/SemrackDocumentMapper.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/mappers/DocumentMapper.java @@ -1,14 +1,14 @@ package fr.codeanddata.semrack.core.mappers; -import fr.codeanddata.semrack.core.models.SemrackDocument; -import fr.codeanddata.semrack.core.models.PushDocumentRequest; +import fr.codeanddata.semrack.core.models.Document; +import fr.codeanddata.semrack.core.models.PushDocument; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingConstants; @Mapper(componentModel = MappingConstants.ComponentModel.CDI) -public abstract class SemrackDocumentMapper { +public abstract class DocumentMapper { @Mapping(source = "uid", target = "uid") @Mapping(source = "metadata", target = "metadata") - abstract SemrackDocument toDocument(PushDocumentRequest document); + abstract Document toDocument(PushDocument document); } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackDocument.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Document.java similarity index 90% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackDocument.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Document.java index e1c1651..34e0ba5 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackDocument.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Document.java @@ -11,7 +11,7 @@ import java.util.Map; @AllArgsConstructor @NoArgsConstructor @RegisterForReflection(serialization = true) -public class SemrackDocument { +public class Document { /** * L'identifiant unique du document. @@ -29,4 +29,8 @@ public class SemrackDocument { */ Map metadata; + /** + * + */ + Map fields; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackPagination.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Pagination.java similarity index 82% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackPagination.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Pagination.java index d66ede0..ba1d6d3 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackPagination.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Pagination.java @@ -7,7 +7,7 @@ import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor -public class SemrackPagination { +public class Pagination { Integer page; Integer size; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/PushDocumentRequest.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/PushDocument.java similarity index 93% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/PushDocumentRequest.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/PushDocument.java index 45f94b7..e2aceb9 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/PushDocumentRequest.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/PushDocument.java @@ -9,7 +9,7 @@ import java.util.Map; @Builder @AllArgsConstructor @NoArgsConstructor -public class PushDocumentRequest { +public class PushDocument { /** * L'identifiant unique du document. */ diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocReadContext.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/ReadContext.java similarity index 58% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocReadContext.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/ReadContext.java index aeec61b..774613b 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocReadContext.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/ReadContext.java @@ -2,15 +2,11 @@ package fr.codeanddata.semrack.core.models; import lombok.*; -import java.util.Map; - @Getter @Setter @Builder @NoArgsConstructor @AllArgsConstructor -public class SemdocReadContext { - - SemrackDocument currentDocument; - +public class ReadContext { + Document currentDocument; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchRequest.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Search.java similarity index 59% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchRequest.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Search.java index e1a1770..aac333e 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchRequest.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Search.java @@ -10,9 +10,11 @@ import java.util.Map; @Builder @AllArgsConstructor @NoArgsConstructor -public class SearchRequest { +public class Search { Map filter; - List sort; - SemrackPagination paginate; - List fields; + List sort; + Pagination paginate; + Boolean annotations; + Boolean metadata; + Map fields; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocSearchContext.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchContext.java similarity index 83% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocSearchContext.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchContext.java index 1dcc025..573576a 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocSearchContext.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchContext.java @@ -9,7 +9,7 @@ import java.util.Map; @Builder @NoArgsConstructor @AllArgsConstructor -public class SemdocSearchContext { +public class SearchContext { Map search; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchResult.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchResult.java index 9a3c84c..4922f72 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchResult.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SearchResult.java @@ -10,6 +10,6 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor public class SearchResult { - List documents; + List documents; PaginationInfo pagination; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackSort.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Sort.java similarity index 53% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackSort.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Sort.java index 62b03ce..24fe263 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemrackSort.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/Sort.java @@ -1,6 +1,6 @@ package fr.codeanddata.semrack.core.models; -import fr.codeanddata.semrack.core.enums.SemrackSortDirection; +import fr.codeanddata.semrack.core.enums.SortDirection; import lombok.*; @Getter @@ -8,7 +8,7 @@ import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor -public class SemrackSort { +public class Sort { String field; - SemrackSortDirection direction; + SortDirection direction; } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/StorageGet.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/StorageGet.java new file mode 100644 index 0000000..c54a29b --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/StorageGet.java @@ -0,0 +1,16 @@ +package fr.codeanddata.semrack.core.models; + +import lombok.*; + +import java.util.Map; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class StorageGet { + Boolean metadataSource; + Boolean annotationsSource; + Map fields; +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocWriteContext.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/WriteContext.java similarity index 80% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocWriteContext.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/WriteContext.java index 831da6e..ea8a1f9 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/SemdocWriteContext.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/models/WriteContext.java @@ -9,19 +9,19 @@ import java.util.Map; @Builder @NoArgsConstructor @AllArgsConstructor -public class SemdocWriteContext { +public class WriteContext { /** * Previous stored document */ - SemrackDocument currentDocument; + Document currentDocument; /** * Document to be store. It initialized with : * - the currentDocument uid if exists, or a new one * - the metadata to be persisted */ - SemrackDocument nextDocument; + Document nextDocument; /** * The directives to be applied diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/repositories/SemdocRepository.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/repositories/DocumentRepository.java similarity index 60% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/repositories/SemdocRepository.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/repositories/DocumentRepository.java index 3a7944e..0029062 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/repositories/SemdocRepository.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/repositories/DocumentRepository.java @@ -1,9 +1,9 @@ package fr.codeanddata.semrack.core.repositories; -import fr.codeanddata.semrack.core.SemdocWriteInterceptor; +import fr.codeanddata.semrack.core.WriteInterceptor; import fr.codeanddata.semrack.core.exceptions.SemrackRuntimeException; import fr.codeanddata.semrack.core.models.*; -import fr.codeanddata.semrack.core.storages.SemdocStorageProxy; +import fr.codeanddata.semrack.core.storages.StorageProxy; import fr.codeanddata.semrack.core.utils.UIDGenerator; import io.smallrye.mutiny.Uni; import jakarta.enterprise.context.ApplicationScoped; @@ -16,35 +16,43 @@ import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; @ApplicationScoped -public class SemdocRepository { +public class DocumentRepository { @Inject - SemdocStorageProxy semdocStorage; + StorageProxy semdocStorage; @Inject @Any - Instance writeInterceptors; + Instance writeInterceptors; @Inject UIDGenerator uidGenerator; - public Uni searchDocument(SearchRequest query) { + public Uni searchDocument(Search query) { return semdocStorage.searchDocument(query); } - public Uni get(String documentId) { - return semdocStorage.readDocument(documentId); + public Uni get(String documentId) { + return get(documentId, StorageGet.builder().build()); } - public Uni pushDocument(PushDocumentRequest pushDocument) { - return Optional.ofNullable(pushDocument.getUid()).map(semdocStorage::readDocument).orElse(Uni.createFrom().nullItem()) + public Uni get(String documentId, StorageGet request) { + return semdocStorage.readDocument(documentId, request); + } + + public Uni pushDocument(PushDocument pushDocument) { + return Optional.ofNullable(pushDocument.getUid()).map(uid -> semdocStorage.readDocument(uid, StorageGet.builder() + .annotationsSource(true) + .metadataSource(true) + .build())) + .orElse(Uni.createFrom().nullItem()) .chain(currentDocument -> { - final SemdocWriteContext context = SemdocWriteContext.builder() + final WriteContext context = WriteContext.builder() .directives(pushDocument.getDirectives()) .currentDocument(currentDocument) - .nextDocument(SemrackDocument.builder() - .uid(Optional.ofNullable(currentDocument).map(SemrackDocument::getUid).orElse(uidGenerator.apply(null))) + .nextDocument(Document.builder() + .uid(Optional.ofNullable(currentDocument).map(Document::getUid).orElse(uidGenerator.apply(null))) .metadata(pushDocument.getMetadata()) .annotations(new HashMap<>()) .build()) @@ -57,7 +65,7 @@ public class SemdocRepository { }); } - public Uni getOrCreate(SearchRequest query, PushDocumentRequest toCreate) { + public Uni getOrCreate(Search query, PushDocument toCreate) { return searchDocument(query) .chain(searchResult -> { if (searchResult.getDocuments().isEmpty()) { diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/IndexService.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/IndexService.java new file mode 100644 index 0000000..3f92e37 --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/IndexService.java @@ -0,0 +1,35 @@ +package fr.codeanddata.semrack.core.services; + +import fr.codeanddata.semrack.core.Index; +import fr.codeanddata.semrack.core.models.IndexSearchResult; +import fr.codeanddata.semrack.core.models.Search; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +@ApplicationScoped +public class IndexService { + + @Inject + Index index; + + public Uni index(String documentId) { + return index.index(documentId); + } + + public Uni search(Search search) { + return index.search(search); + } + + public Uni count(Search request) { + return index.count(request); + } + + public Uni exist(Search query) { + return index.exist(query); + } + + public Uni clear(String documentId) { + return index.clear(documentId); + } +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/SemrackLookupService.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/LookupService.java similarity index 82% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/SemrackLookupService.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/LookupService.java index 9c6bf9a..ac1a6b8 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/SemrackLookupService.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/LookupService.java @@ -1,6 +1,6 @@ package fr.codeanddata.semrack.core.services; -import fr.codeanddata.semrack.core.SemrackLookupExpression; +import fr.codeanddata.semrack.core.LookupExpression; import io.quarkus.runtime.StartupEvent; import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; @@ -14,13 +14,13 @@ import java.util.Map; import java.util.Set; @ApplicationScoped -public class SemrackLookupService { +public class LookupService { @Inject @Any - Instance> operators; + Instance> operators; - final Map> operatorsIndex = new HashMap<>(); + final Map> operatorsIndex = new HashMap<>(); void startup(@Observes StartupEvent event) { operators.stream() @@ -42,7 +42,7 @@ public class SemrackLookupService { if (! operatorsIndex.containsKey(lookupKey)) { throw new RuntimeException("Unknown lookup expression '" + lookupKey + "'"); } else { - final SemrackLookupExpression lookup = operatorsIndex.get(lookupKey); + final LookupExpression lookup = operatorsIndex.get(lookupKey); final Object lookupParams = lookupExpression.get(lookupKey); return lookup.apply(lookupParams); } diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/SemrackIndexService.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/SemrackIndexService.java deleted file mode 100644 index 57d913f..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/services/SemrackIndexService.java +++ /dev/null @@ -1,35 +0,0 @@ -package fr.codeanddata.semrack.core.services; - -import fr.codeanddata.semrack.core.SemdocIndex; -import fr.codeanddata.semrack.core.models.IndexSearchResult; -import fr.codeanddata.semrack.core.models.SearchRequest; -import io.smallrye.mutiny.Uni; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; - -@ApplicationScoped -public class SemrackIndexService { - - @Inject - SemdocIndex semdocIndex; - - public Uni index(String documentId) { - return semdocIndex.index(documentId); - } - - public Uni search(SearchRequest searchRequest) { - return semdocIndex.search(searchRequest); - } - - public Uni count(SearchRequest request) { - return semdocIndex.count(request); - } - - public Uni exist(SearchRequest query) { - return semdocIndex.exist(query); - } - - public Uni clear(String documentId) { - return semdocIndex.clear(documentId); - } -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/storages/SemdocStorageProxy.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/storages/SemdocStorageProxy.java deleted file mode 100644 index 1664e1c..0000000 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/storages/SemdocStorageProxy.java +++ /dev/null @@ -1,46 +0,0 @@ -package fr.codeanddata.semrack.core.storages; - -import fr.codeanddata.semrack.core.SemdocIndex; -import fr.codeanddata.semrack.core.SemdocStorage; -import fr.codeanddata.semrack.core.models.SearchRequest; -import fr.codeanddata.semrack.core.models.SearchResult; -import fr.codeanddata.semrack.core.models.SemrackDocument; -import io.smallrye.mutiny.Uni; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; - -@ApplicationScoped -public class SemdocStorageProxy { - - @Inject - SemdocStorage storage; - - @Inject - SemdocIndex index; - - public Uni readDocument(String uid) { - return storage.get(uid); - } - - public Uni searchDocument(SearchRequest query) { - return index.search(query) - .chain(searchResult -> storage.get(searchResult.getUids()) - .map(documents -> SearchResult.builder() - .documents(documents) - .pagination(searchResult.getPagination()) - .build())); - } - - public Uni countDocuments(SearchRequest request) { - return index.count(request); - } - - public Uni documentsExist(SearchRequest query) { - return index.exist(query); - } - - public Uni storeDocument(SemrackDocument document) { - return storage.storeDocument(document) - .call(x -> index.index(x.getUid())); - } -} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/storages/StorageProxy.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/storages/StorageProxy.java new file mode 100644 index 0000000..68f8758 --- /dev/null +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/storages/StorageProxy.java @@ -0,0 +1,55 @@ +package fr.codeanddata.semrack.core.storages; + +import fr.codeanddata.semrack.core.Index; +import fr.codeanddata.semrack.core.Storage; +import fr.codeanddata.semrack.core.models.Search; +import fr.codeanddata.semrack.core.models.SearchResult; +import fr.codeanddata.semrack.core.models.Document; +import fr.codeanddata.semrack.core.models.StorageGet; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +@ApplicationScoped +public class StorageProxy { + + @Inject + Storage storage; + + @Inject + Index index; + + public Uni readDocument(String uid) { + return readDocument(uid, StorageGet.builder().build()); + } + + public Uni readDocument(String uid, StorageGet request) { + return storage.get(uid, request); + } + + public Uni searchDocument(Search query) { + return index.search(query) + .chain(searchResult -> storage.get(searchResult.getUids(), StorageGet.builder() + .annotationsSource(query.getAnnotations()) + .metadataSource(query.getMetadata()) + .fields(query.getFields()) + .build()) + .map(documents -> SearchResult.builder() + .documents(documents) + .pagination(searchResult.getPagination()) + .build())); + } + + public Uni countDocuments(Search request) { + return index.count(request); + } + + public Uni documentsExist(Search query) { + return index.exist(query); + } + + public Uni storeDocument(Document document) { + return storage.storeDocument(document) + .call(x -> index.index(x.getUid())); + } +} diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/SemdocUtils.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/DocumentUtils.java similarity index 95% rename from modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/SemdocUtils.java rename to modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/DocumentUtils.java index 9620e94..5a5b877 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/SemdocUtils.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/DocumentUtils.java @@ -8,7 +8,7 @@ import jakarta.inject.Inject; import java.util.Map; @ApplicationScoped -public class SemdocUtils { +public class DocumentUtils { @Inject ObjectMapper objectMapper; diff --git a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/UIDGenerator.java b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/UIDGenerator.java index 50bf783..4c840f3 100644 --- a/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/UIDGenerator.java +++ b/modules/semrack-core/runtime/src/main/java/fr/codeanddata/semrack/core/utils/UIDGenerator.java @@ -1,6 +1,6 @@ package fr.codeanddata.semrack.core.utils; -import fr.codeanddata.semrack.core.models.SemrackDocument; +import fr.codeanddata.semrack.core.models.Document; import jakarta.enterprise.context.ApplicationScoped; import org.apache.commons.codec.digest.DigestUtils; @@ -10,10 +10,10 @@ import java.util.UUID; import java.util.function.Function; @ApplicationScoped -public class UIDGenerator implements Function { +public class UIDGenerator implements Function { @Override - public String apply(SemrackDocument semrackDocument) { + public String apply(Document document) { final String uuid = UUID.randomUUID().toString(); final LocalDateTime now = LocalDateTime.now(); final long timestamp = now.toInstant(ZoneOffset.UTC).toEpochMilli(); diff --git a/modules/semrack-core/testing/src/main/java/fr/codeanddata/semrack/core/MockProducer.java b/modules/semrack-core/testing/src/main/java/fr/codeanddata/semrack/core/MockProducer.java index a892aa0..4183569 100644 --- a/modules/semrack-core/testing/src/main/java/fr/codeanddata/semrack/core/MockProducer.java +++ b/modules/semrack-core/testing/src/main/java/fr/codeanddata/semrack/core/MockProducer.java @@ -1,8 +1,9 @@ package fr.codeanddata.semrack.core; import fr.codeanddata.semrack.core.models.IndexSearchResult; -import fr.codeanddata.semrack.core.models.SearchRequest; -import fr.codeanddata.semrack.core.models.SemrackDocument; +import fr.codeanddata.semrack.core.models.Search; +import fr.codeanddata.semrack.core.models.Document; +import fr.codeanddata.semrack.core.models.StorageGet; import io.quarkus.arc.DefaultBean; import io.smallrye.mutiny.Uni; import jakarta.annotation.Priority; @@ -16,20 +17,20 @@ public class MockProducer { @Produces @DefaultBean @Priority(100) - SemdocStorage produceStorage() { - return new SemdocStorage() { + Storage produceStorage() { + return new Storage() { @Override - public Uni get(String uid) { + public Uni get(String uid, StorageGet request) { return null; } @Override - public Uni> get(List uids) { + public Uni> get(List uids, StorageGet request) { return null; } @Override - public Uni storeDocument(SemrackDocument document) { + public Uni storeDocument(Document document) { return null; } }; @@ -38,15 +39,15 @@ public class MockProducer { @Produces @DefaultBean @Priority(100) - SemdocIndex produceIndex() { - return new SemdocIndex() { + Index produceIndex() { + return new Index() { @Override - public Uni count(SearchRequest request) { + public Uni count(Search request) { return null; } @Override - public Uni exist(SearchRequest query) { + public Uni exist(Search query) { return null; } @@ -56,7 +57,7 @@ public class MockProducer { } @Override - public Uni search(SearchRequest searchRequest) { + public Uni search(Search search) { return null; } diff --git a/modules/semrack-index-postgres/integration-tests/src/test/java/fr/codeanddata/semrack/index/postgres/it/SemrackIndexPostgresResourceIT.java b/modules/semrack-index-postgres/integration-tests/src/test/java/fr/codeanddata/semrack/index/postgres/it/SemrackIndexPostgresResourceIT.java deleted file mode 100644 index 20c1f30..0000000 --- a/modules/semrack-index-postgres/integration-tests/src/test/java/fr/codeanddata/semrack/index/postgres/it/SemrackIndexPostgresResourceIT.java +++ /dev/null @@ -1,7 +0,0 @@ -package fr.codeanddata.semrack.index.postgres.it; - -import io.quarkus.test.junit.QuarkusIntegrationTest; - -@QuarkusIntegrationTest -public class SemrackIndexPostgresResourceIT extends SemrackIndexPostgresResourceTest { -} diff --git a/modules/semrack-index-postgres/integration-tests/src/test/java/fr/codeanddata/semrack/index/postgres/it/SemrackIndexPostgresResourceTest.java b/modules/semrack-index-postgres/integration-tests/src/test/java/fr/codeanddata/semrack/index/postgres/it/SemrackIndexPostgresResourceTest.java deleted file mode 100644 index 5341a1c..0000000 --- a/modules/semrack-index-postgres/integration-tests/src/test/java/fr/codeanddata/semrack/index/postgres/it/SemrackIndexPostgresResourceTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.codeanddata.semrack.index.postgres.it; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.is; - -import org.junit.jupiter.api.Test; - -import io.quarkus.test.junit.QuarkusTest; - -@QuarkusTest -public class SemrackIndexPostgresResourceTest { - - @Test - public void testHelloEndpoint() { - given() - .when().get("/semrack-index-postgres") - .then() - .statusCode(200) - .body(is("Hello semrack-index-postgres")); - } -} diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/SemdocJpaIndex.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/JpaIndex.java similarity index 82% rename from modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/SemdocJpaIndex.java rename to modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/JpaIndex.java index 1dd1f06..01cab99 100644 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/SemdocJpaIndex.java +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/JpaIndex.java @@ -1,9 +1,9 @@ package fr.codeanddata.semrack.index.postgres; -import fr.codeanddata.semrack.core.SemdocIndex; -import fr.codeanddata.semrack.core.SemdocStorage; +import fr.codeanddata.semrack.core.Index; +import fr.codeanddata.semrack.core.Storage; import fr.codeanddata.semrack.core.models.*; -import fr.codeanddata.semrack.core.services.SemrackLookupService; +import fr.codeanddata.semrack.core.services.LookupService; import fr.codeanddata.semrack.core.utils.Traverser; import fr.codeanddata.semrack.index.postgres.dtos.IndexEntry; import fr.codeanddata.semrack.index.postgres.entities.SemrackIndexEntity; @@ -19,23 +19,23 @@ import org.hibernate.query.Page; import java.util.*; @ApplicationScoped -public class SemdocJpaIndex implements SemdocIndex, PanacheRepository { +public class JpaIndex implements Index, PanacheRepository { @Inject Traverser traverser; @Inject - SemrackLookupService lookupService; + LookupService lookupService; @Inject - SemdocStorage storage; + Storage storage; @Inject SemrackIndexRepository indexRepository; @Override @WithSession - public Uni count(SearchRequest request) { + public Uni count(Search request) { final StringBuilder query = new StringBuilder("SELECT DISTINCT count(uid) FROM semrack_index"); final String lookup = lookupService.lookup(request.getFilter()); @@ -47,14 +47,16 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository exist(SearchRequest query) { + public Uni exist(Search query) { return count(query).map(count -> count > 0); } @Override @WithTransaction public Uni index(String documentId) { - return storage.get(documentId) + return storage.get(documentId, StorageGet.builder() + .metadataSource(true) + .build()) .call(document -> clear(documentId)) .call(document -> { final Map indexes = new HashMap<>(); @@ -78,7 +80,7 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository search(SearchRequest request) { + public Uni search(Search request) { final IndexSearchResult result = new IndexSearchResult(); final StringBuilder query = new StringBuilder("SELECT DISTINCT uid FROM semrack_index"); @@ -105,11 +107,11 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository queryPaginationInfo(SearchRequest query) { + Uni queryPaginationInfo(Search query) { return count(query) .map(count -> PaginationInfo.builder() - .page(Optional.ofNullable(query.getPaginate()).map(SemrackPagination::getPage).orElse(0)) - .size(Optional.ofNullable(query.getPaginate()).map(SemrackPagination::getSize).orElse(10)) + .page(Optional.ofNullable(query.getPaginate()).map(Pagination::getPage).orElse(0)) + .size(Optional.ofNullable(query.getPaginate()).map(Pagination::getSize).orElse(10)) .total(count) .build()); } diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/AndLookup.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/AndLookup.java index dfd7917..f690d43 100644 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/AndLookup.java +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/AndLookup.java @@ -1,6 +1,6 @@ package fr.codeanddata.semrack.index.postgres.operators; -import fr.codeanddata.semrack.core.services.SemrackLookupService; +import fr.codeanddata.semrack.core.services.LookupService; import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -10,10 +10,10 @@ import java.util.Map; @Identifier("and") @ApplicationScoped -public class AndLookup implements SemrackJpaLookupExpression>> { +public class AndLookup implements JpaLookupExpression>> { @Inject - SemrackLookupService lookupService; + LookupService lookupService; @Override public String apply(Object expressions) { diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/EqualLookup.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/EqualLookup.java index 2049b57..0c00ebb 100644 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/EqualLookup.java +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/EqualLookup.java @@ -10,7 +10,7 @@ import jakarta.inject.Inject; @Identifier("equal") @ApplicationScoped -public class EqualLookup implements SemrackJpaLookupExpression { +public class EqualLookup implements JpaLookupExpression { @Inject ObjectMapper objectMapper; diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/InLookup.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/InLookup.java index 2a54de3..e8f3205 100644 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/InLookup.java +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/InLookup.java @@ -13,7 +13,7 @@ import java.util.List; @Identifier("in") @ApplicationScoped -public class InLookup implements SemrackJpaLookupExpression { +public class InLookup implements JpaLookupExpression { @Inject ObjectMapper objectMapper; diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/JpaLookupExpression.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/JpaLookupExpression.java new file mode 100644 index 0000000..2c0f09d --- /dev/null +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/JpaLookupExpression.java @@ -0,0 +1,6 @@ +package fr.codeanddata.semrack.index.postgres.operators; + +import fr.codeanddata.semrack.core.LookupExpression; + +public interface JpaLookupExpression extends LookupExpression { +} diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/OrLookup.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/OrLookup.java index b528a2c..969d70f 100644 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/OrLookup.java +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/OrLookup.java @@ -1,6 +1,6 @@ package fr.codeanddata.semrack.index.postgres.operators; -import fr.codeanddata.semrack.core.services.SemrackLookupService; +import fr.codeanddata.semrack.core.services.LookupService; import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -10,10 +10,10 @@ import java.util.Map; @Identifier("or") @ApplicationScoped -public class OrLookup implements SemrackJpaLookupExpression>> { +public class OrLookup implements JpaLookupExpression>> { @Inject - SemrackLookupService lookupService; + LookupService lookupService; @Override public String apply(Object expressions) { diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/SemrackJpaLookupExpression.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/SemrackJpaLookupExpression.java deleted file mode 100644 index 6c4f7bc..0000000 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/operators/SemrackJpaLookupExpression.java +++ /dev/null @@ -1,6 +0,0 @@ -package fr.codeanddata.semrack.index.postgres.operators; - -import fr.codeanddata.semrack.core.SemrackLookupExpression; - -public interface SemrackJpaLookupExpression extends SemrackLookupExpression { -} diff --git a/modules/semrack-storage-postgres/deployment/pom.xml b/modules/semrack-storage-postgres/deployment/pom.xml index e4cf622..8881427 100644 --- a/modules/semrack-storage-postgres/deployment/pom.xml +++ b/modules/semrack-storage-postgres/deployment/pom.xml @@ -45,6 +45,16 @@ quarkus-junit5-internal test + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-test-vertx + test + fr.codeanddata.semrack semrack-core-testing diff --git a/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/storage/JpaStorageTest.java b/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/storage/JpaStorageTest.java new file mode 100644 index 0000000..dc34d37 --- /dev/null +++ b/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/storage/JpaStorageTest.java @@ -0,0 +1,73 @@ +package fr.codeanddata.semrack.storage.postgres.storage; + +import fr.codeanddata.semrack.core.models.StorageGet; +import io.quarkus.hibernate.reactive.panache.Panache; +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.vertx.RunOnVertxContext; +import io.quarkus.test.vertx.UniAsserter; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +@QuarkusTest +public class JpaStorageTest { + @Inject + JpaStorage jpaStorage; + + @Test + @RunOnVertxContext + void testJpaStorageGetDefault(UniAsserter asserter) { + asserter.assertThat( + () -> Panache.withSession(() -> jpaStorage.get("doc-001", StorageGet.builder().build())), + doc -> { + assert doc != null; + assert "doc-001".equals(doc.getUid()); + assert doc.getAnnotations() == null; + assert doc.getMetadata() == null; + assert doc.getFields() == null; + } + ); + } + + @Test + @RunOnVertxContext + void testJpaStorageGetWithAnnotationsAndMetadata(UniAsserter asserter) { + asserter.assertThat( + () -> Panache.withSession(() -> jpaStorage.get("doc-001", StorageGet.builder() + .annotationsSource(true) + .metadataSource(true) + .build())), + doc -> { + assert doc != null; + assert doc.getAnnotations() != null; + assert doc.getMetadata() != null; + } + ); + } + + @Test + @RunOnVertxContext + void testJpaStorageGetWithFields(UniAsserter asserter) { + asserter.assertThat( + () -> Panache.withSession(() -> jpaStorage.get("doc-001", StorageGet.builder() + .fields(Map.of( + "title", "title", + "content", "content", + "sku", "product.sku" + )) + .build())), + doc -> { + assert doc != null; + assert doc.getFields() != null; + assert doc.getFields().containsKey("title"); + assert "Test Document".equals(doc.getFields().get("title")); + assert doc.getFields().containsKey("content"); + assert "Hello World".equals(doc.getFields().get("content")); + assert doc.getFields().containsKey("sku"); + assert "001".equals(doc.getFields().get("sku")); + } + ); + } + +} diff --git a/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/test/SemrackStoragePostgresDevModeTest.java b/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/test/SemrackStoragePostgresDevModeTest.java deleted file mode 100644 index 3af02e7..0000000 --- a/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/test/SemrackStoragePostgresDevModeTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.codeanddata.semrack.storage.postgres.test; - -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; - -import io.quarkus.test.QuarkusDevModeTest; - -public class SemrackStoragePostgresDevModeTest { - - // Start hot reload (DevMode) test with your extension loaded - @RegisterExtension - static final QuarkusDevModeTest devModeTest = new QuarkusDevModeTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); - - @Test - public void writeYourOwnDevModeTest() { - // Write your dev mode tests here - see the testing extension guide https://quarkus.io/guides/writing-extensions#testing-hot-reload for more information - Assertions.assertTrue(true, "Add dev mode assertions to " + getClass().getName()); - } -} diff --git a/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/test/SemrackStoragePostgresTest.java b/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/test/SemrackStoragePostgresTest.java deleted file mode 100644 index 795c0ed..0000000 --- a/modules/semrack-storage-postgres/deployment/src/test/java/fr/codeanddata/semrack/storage/postgres/test/SemrackStoragePostgresTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.codeanddata.semrack.storage.postgres.test; - -import org.jboss.shrinkwrap.api.ShrinkWrap; -import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; - -import io.quarkus.test.QuarkusUnitTest; - -public class SemrackStoragePostgresTest { - - // Start unit test with your extension loaded - @RegisterExtension - static final QuarkusUnitTest unitTest = new QuarkusUnitTest() - .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); - - @Test - public void writeYourOwnUnitTest() { - // Write your unit tests here - see the testing extension guide https://quarkus.io/guides/writing-extensions#testing-extensions for more information - Assertions.assertTrue(true, "Add some assertions to " + getClass().getName()); - } -} diff --git a/modules/semrack-storage-postgres/deployment/src/test/resources/application.properties b/modules/semrack-storage-postgres/deployment/src/test/resources/application.properties new file mode 100644 index 0000000..b32fcfd --- /dev/null +++ b/modules/semrack-storage-postgres/deployment/src/test/resources/application.properties @@ -0,0 +1,3 @@ +quarkus.flyway.enabled=false +quarkus.hibernate-orm.schema-management.strategy=drop-and-create +quarkus.hibernate-orm.sql-load-script=import.sql \ No newline at end of file diff --git a/modules/semrack-storage-postgres/deployment/src/test/resources/import.sql b/modules/semrack-storage-postgres/deployment/src/test/resources/import.sql new file mode 100644 index 0000000..86b9315 --- /dev/null +++ b/modules/semrack-storage-postgres/deployment/src/test/resources/import.sql @@ -0,0 +1,5 @@ +INSERT INTO semrack_document (id, uid, document) +VALUES (nextval('semrack_document_SEQ'), 'doc-001', + '{"uid":"doc-001","annotations":{"category":"test"},"metadata":{"product":{"sku":"001"},"title":"Test Document","content":"Hello World"}}'), + (nextval('semrack_document_SEQ'), 'doc-002', + '{"uid":"doc-002","annotations":{"category":"test"},"metadata":{"product":{"sku":"002"},"title":"Test Document 2","content":"Hello World 2"}}'); diff --git a/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/entities/SemrackDocumentEntity.java b/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/entities/SemrackDocumentEntity.java index 6c2d58f..849b695 100644 --- a/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/entities/SemrackDocumentEntity.java +++ b/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/entities/SemrackDocumentEntity.java @@ -1,6 +1,6 @@ package fr.codeanddata.semrack.storage.postgres.entities; -import fr.codeanddata.semrack.core.models.SemrackDocument; +import fr.codeanddata.semrack.core.models.Document; import io.quarkus.hibernate.reactive.panache.PanacheEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -23,5 +23,5 @@ public class SemrackDocumentEntity extends PanacheEntity implements Serializable String uid; @JdbcTypeCode(SqlTypes.JSON) - SemrackDocument document; + Document document; } diff --git a/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/storage/JpaStorage.java b/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/storage/JpaStorage.java new file mode 100644 index 0000000..0978921 --- /dev/null +++ b/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/storage/JpaStorage.java @@ -0,0 +1,148 @@ +package fr.codeanddata.semrack.storage.postgres.storage; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.codeanddata.semrack.core.Storage; +import fr.codeanddata.semrack.core.models.Document; +import fr.codeanddata.semrack.core.models.StorageGet; +import fr.codeanddata.semrack.core.utils.UIDGenerator; +import fr.codeanddata.semrack.storage.postgres.entities.SemrackDocumentEntity; +import io.quarkus.hibernate.reactive.panache.PanacheRepository; +import io.quarkus.hibernate.reactive.panache.common.WithSession; +import io.quarkus.hibernate.reactive.panache.common.WithTransaction; +import io.smallrye.mutiny.Uni; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.*; + +@ApplicationScoped +public class JpaStorage implements Storage, PanacheRepository { + + @Inject + UIDGenerator generator; + + @Inject + ObjectMapper objectMapper; + + @Override + @WithSession + public Uni get(String uid, StorageGet request) { + final List fields = selectFields(request); + return getSession() + .chain(session -> session.createNativeQuery("select " + String.join(",", fields) + " from semrack_document where uid = ?1") + .setParameter(1, uid) + .getSingleResult()) + .map(result -> mapDocument(result, request)); + } + + @Override + @WithSession + public Uni> get(List uids, StorageGet request) { + final List fields = selectFields(request); + return getSession() + .chain(session -> session.createNativeQuery("select " + String.join(",", fields) + " from semrack_document where uid in ?1") + .setParameter(1, uids) + .getResultList()) + .map(results -> mapDocuments(results, request)); + } + + @WithTransaction + @Override + public Uni storeDocument(Document document) { + if (document.getUid() == null) { + return createDocument(document) + .call(this::flush); + } else { + return find("uid = ?1", document.getUid()) + .count() + .chain(n -> n == 0 ? createDocument(document) : updateDocument(document)) + .call(this::flush); + } + } + + // TODO err : handle existing document + @WithTransaction + Uni createDocument(Document document) { + final String uid = document.getUid() == null ? generator.apply(document) : document.getUid(); + document.setUid(uid); + final SemrackDocumentEntity entity = SemrackDocumentEntity.builder() + .uid(uid) + .document(document) + .build(); + return persist(entity).map(SemrackDocumentEntity::getDocument); + } + + // TODO err : document not exists + @WithTransaction + Uni updateDocument(Document document) { + return update("uid = ?1, document = ?2 WHERE uid = ?1", document.getUid(), document) + .map(x -> document); + } + + List selectFields(StorageGet request) { + final List fields = new ArrayList<>(List.of( + "uid as _uid", + (Optional.ofNullable(request.getAnnotationsSource()).orElse(false) ? "document->'annotations'" : "null") + " as _annotations", + (Optional.ofNullable(request.getMetadataSource()).orElse(false) ? "document->'metadata'" : "null") + " as _metadata" + )); + + if (request.getFields() != null) { + int i = 0; + for (String field : request.getFields().values()) { + fields.add("jsonb_path_query(document, '$.metadata." + field + "') as field_" + i++); + } + } + + return fields; + } + + Document mapDocument(Object result, StorageGet request) { + final Map fieldMap = buildFieldMap(request); + final List resultList = objectMapper.convertValue(result, new TypeReference<>() { + }); + final Object oAnnotations = resultList.get(fieldMap.get("_annotations")); + final Object oMetadata = resultList.get(fieldMap.get("_metadata")); + final Map annotations = oAnnotations == null ? null : objectMapper.convertValue(oAnnotations, new TypeReference<>() { + }); + final Map metadata = oMetadata == null ? null : objectMapper.convertValue(oMetadata, new TypeReference<>() { + }); + + final Map fields = new HashMap<>(); + if (request.getFields() != null) { + for (final String field : request.getFields().keySet()) { + fields.put(field, resultList.get(fieldMap.get(field))); + } + } + + return Document.builder() + .uid((String) resultList.get(fieldMap.get("_uid"))) + .annotations(annotations) + .metadata(metadata) + .fields(fields.isEmpty() ? null : fields) + .build(); + } + + List mapDocuments(List results, StorageGet request) { + return results.stream().map(doc -> mapDocument(doc, request)).toList(); + } + + Map buildFieldMap(StorageGet request) { + final Map fieldsMap = new HashMap<>(Map.of( + "_uid", 0, + "_annotations", 1, + "_metadata", 2 + )); + + if (request.getFields() != null) { + Integer i = 3; + for (String field : request.getFields().keySet()) { + fieldsMap.put(field, i); + i++; + } + } + + return fieldsMap; + } + +} diff --git a/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/storage/SemdocJpaStorage.java b/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/storage/SemdocJpaStorage.java deleted file mode 100644 index b702ab2..0000000 --- a/modules/semrack-storage-postgres/runtime/src/main/java/fr/codeanddata/semrack/storage/postgres/storage/SemdocJpaStorage.java +++ /dev/null @@ -1,144 +0,0 @@ -package fr.codeanddata.semrack.storage.postgres.storage; - -import fr.codeanddata.semrack.core.SemdocStorage; -import fr.codeanddata.semrack.core.models.SemrackDocument; -import fr.codeanddata.semrack.core.services.SemrackLookupService; -import fr.codeanddata.semrack.core.utils.UIDGenerator; -import fr.codeanddata.semrack.storage.postgres.entities.SemrackDocumentEntity; -import io.quarkus.hibernate.reactive.panache.PanacheRepository; -import io.quarkus.hibernate.reactive.panache.common.WithSession; -import io.quarkus.hibernate.reactive.panache.common.WithTransaction; -import io.smallrye.mutiny.Uni; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; - -import java.util.List; -import java.util.Optional; - -@ApplicationScoped -public class SemdocJpaStorage implements SemdocStorage, PanacheRepository { - - @Inject - UIDGenerator generator; - - @Inject - SemrackLookupService lookupService; - - @Override - @WithSession - public Uni get(String uid) { - return find("uid = ?1", uid) - .firstResult().map(d -> Optional.ofNullable(d).map(SemrackDocumentEntity::getDocument).orElse(null)); - } - - @Override - @WithSession - public Uni> get(List uids) { - return find("uid in ?1", uids).list() - .map(d -> d.stream().map(SemrackDocumentEntity::getDocument).toList()); - } - - @WithTransaction - @Override - public Uni storeDocument(SemrackDocument document) { - if (document.getUid() == null) { - return createDocument(document); - } else { - return find("uid = ?1", document.getUid()) - .count() - .chain(n -> n == 0 ? createDocument(document) : updateDocument(document)); - } - } - - // TODO err : handle existing document - @WithTransaction - Uni createDocument(SemrackDocument document) { - final String uid = document.getUid() == null ? generator.apply(document) : document.getUid(); - document.setUid(uid); - final SemrackDocumentEntity entity = SemrackDocumentEntity.builder() - .uid(uid) - .document(document) - .build(); - return persist(entity).map(SemrackDocumentEntity::getDocument); - } - - // TODO err : document not exists - @WithTransaction - Uni updateDocument(SemrackDocument document) { - return update("uid = ?1, document = ?2 WHERE uid = ?1", document.getUid(), document) - .map(x -> document); - } - -// Uni search(SearchRequest request) { -// final String baseQuery = buildBaseQuery(request); -// -// final StringBuilder sorting = new StringBuilder(); -// if (request.getSort() != null && !request.getSort().isEmpty()) { -// sorting.append(" ORDER BY "); -// sorting.append(String.join(", ", request.getSort().stream().map(sort -> sort.getField() + " " + Optional.ofNullable(sort.getDirection()).orElse(SemrackSortDirection.asc).name()).toList())); -// } -// -// final StringBuilder paginate = new StringBuilder(); -// if (request.getPaginate() != null) { -// final SemrackPagination pagination = request.getPaginate(); -// final Integer size = pagination.getSize() == null ? 200 : pagination.getSize(); -// final Integer page = pagination.getPage() == null ? 0 : pagination.getPage(); -// -// paginate.append(" LIMIT ").append(size).append(" OFFSET ").append(size * page); -// } -// -// return getSession() -// .chain(s -> { -// final SearchResult searchResult = SearchResult.builder().build(); -// return countDocuments(request) -// .invoke(count -> searchResult.setPagination(PaginationInfo.builder() -// .page(Optional.ofNullable(request.getPaginate()).map(SemrackPagination::getPage).orElse(0)) -// .size(Optional.ofNullable(request.getPaginate()).map(SemrackPagination::getSize).orElse(0)) -// .total(count) -// .build())) -// .call(() -> s -// .createNativeQuery(baseQuery + sorting + paginate, Object.class).getResultList() -// .invoke(results -> searchResult.setDocuments(project(request.getFields(), results)))) -// .map(count -> searchResult); -// }); -// } -// -// String buildBaseQuery(SearchRequest request) { -// final String lookup = lookupService.lookup(request.getFilter()); -// final String whereClause = lookup.isEmpty() ? "" : " WHERE " + lookup; -// -// if (request.getFields() == null || request.getFields().isEmpty()) { -// return "SELECT document FROM semrack_document" + whereClause; -// } else { -// return "SELECT " + toJsonbPathExtract(request.getFields()) + " FROM semrack_document" + whereClause; -// } -// } -// -// String toJsonbPathExtract(List fields) { -// return String.join(",", fields.stream().map(field -> { -// final String serializedField = "'" + String.join("','", field.split("\\.")) + "'"; -// return "jsonb_extract_path(document, " + serializedField + ")"; -// }).toList()); -// } -// -// List project(List fields, Object results) { -// final List projectedResults = objectMapper.convertValue(results, List.class); -// if (fields == null || fields.isEmpty()) { -// return projectedResults.stream().map(result -> objectMapper.convertValue(result, SemrackDocument.class)).toList(); -// } else { -// return projectedResults.stream().map(result -> { -// final List row = fields.size() == 1 ? List.of(result) : objectMapper.convertValue(result, new TypeReference<>() { -// }); -// final List rowMut = new ArrayList<>(row); -// final List fieldCp = new ArrayList<>(fields); -// final Map document = new HashMap<>(); -// while (!fieldCp.isEmpty() && !row.isEmpty()) { -// final String field = fieldCp.removeFirst(); -// final Object value = rowMut.removeFirst(); -// pathMapper.map(field, document, value); -// } -// return objectMapper.convertValue(document, SemrackDocument.class); -// }).toList(); -// } -// } -} diff --git a/pom.xml b/pom.xml index 92b1f61..aa2dd4a 100644 --- a/pom.xml +++ b/pom.xml @@ -29,11 +29,11 @@ 1.16.0 + 2.9.0 1.18.38 1.6.3 - 1.0-SNAPSHOT - 3.29.4 - 2.9.0 + 3.31.3 + ${project.version}