From def2e4140f8cfcb0e46519cd395fd3e25333ce25 Mon Sep 17 00:00:00 2001 From: Guillaume Dugas Date: Wed, 26 Nov 2025 11:27:48 +0100 Subject: [PATCH] Update indexes --- .../index/postgres/SemdocJpaIndex.java | 67 +++++++------------ .../index/postgres/dtos/IndexEntry.java | 14 ++++ .../entities/IndexDocumentEntity.java | 20 ------ .../postgres/entities/IndexKeyEntity.java | 33 --------- .../postgres/entities/SemrackIndexEntity.java | 26 +++++++ .../index/postgres/operators/AndLookup.java | 2 +- .../index/postgres/operators/EqualLookup.java | 2 +- .../index/postgres/operators/InLookup.java | 2 +- .../index/postgres/operators/OrLookup.java | 2 +- .../repositories/IndexDocumentRepository.java | 9 --- ...itory.java => SemrackIndexRepository.java} | 4 +- .../db/migration/V1.0.3__IndexPg.sql | 18 +++++ pom.xml | 2 +- 13 files changed, 89 insertions(+), 112 deletions(-) create mode 100644 modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/dtos/IndexEntry.java delete mode 100644 modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexDocumentEntity.java delete mode 100644 modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexKeyEntity.java create mode 100644 modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/SemrackIndexEntity.java delete mode 100644 modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexDocumentRepository.java rename modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/{IndexKeyRepository.java => SemrackIndexRepository.java} (55%) create mode 100644 modules/semrack-index-postgres/runtime/src/main/resources/db/migration/V1.0.3__IndexPg.sql 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/SemdocJpaIndex.java index 4eb3950..1dd1f06 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/SemdocJpaIndex.java @@ -5,16 +5,13 @@ import fr.codeanddata.semrack.core.SemdocStorage; import fr.codeanddata.semrack.core.models.*; import fr.codeanddata.semrack.core.services.SemrackLookupService; import fr.codeanddata.semrack.core.utils.Traverser; -import fr.codeanddata.semrack.index.postgres.entities.IndexDocumentEntity; -import fr.codeanddata.semrack.index.postgres.entities.IndexKeyEntity; -import fr.codeanddata.semrack.index.postgres.repositories.IndexDocumentRepository; -import fr.codeanddata.semrack.index.postgres.repositories.IndexKeyRepository; +import fr.codeanddata.semrack.index.postgres.dtos.IndexEntry; +import fr.codeanddata.semrack.index.postgres.entities.SemrackIndexEntity; +import fr.codeanddata.semrack.index.postgres.repositories.SemrackIndexRepository; 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.quarkus.vertx.ConsumeEvent; import io.smallrye.mutiny.Uni; -import io.vertx.core.eventbus.EventBus; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.hibernate.query.Page; @@ -22,9 +19,7 @@ import org.hibernate.query.Page; import java.util.*; @ApplicationScoped -public class SemdocJpaIndex implements SemdocIndex, PanacheRepository { - - public static final String INDEX_CONSUMER = "semdoc-jpa-index"; +public class SemdocJpaIndex implements SemdocIndex, PanacheRepository { @Inject Traverser traverser; @@ -36,18 +31,12 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository count(SearchRequest request) { - final StringBuilder query = new StringBuilder("SELECT DISTINCT count(d.id) FROM index_document d JOIN index_key idx on d.id = idx.index_document_id"); + final StringBuilder query = new StringBuilder("SELECT DISTINCT count(uid) FROM semrack_index"); final String lookup = lookupService.lookup(request.getFilter()); final String whereClause = lookup.isEmpty() ? "" : " WHERE " + lookup; @@ -67,29 +56,23 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository index(String documentId) { return storage.get(documentId) .call(document -> clear(documentId)) - .call(document -> indexDocumentRepository.persist(IndexDocumentEntity.builder() - .uid(documentId) - .build()) - .call(index -> { - final List annotationPaths = traverser.apply(document.getAnnotations()).stream().peek(x -> x.setFullPath("annotations" + x.getFullPath())).toList(); - final List metadataPaths = traverser.apply(document.getMetadata()).stream().peek(x -> x.setFullPath("metadata" + x.getFullPath())).toList(); + .call(document -> { + final Map indexes = new HashMap<>(); + final List annotationPaths = traverser.apply(document.getAnnotations()).stream().peek(x -> x.setFullPath("annotations" + x.getFullPath())).toList(); + final List metadataPaths = traverser.apply(document.getMetadata()).stream().peek(x -> x.setFullPath("metadata" + x.getFullPath())).toList(); + final List allPaths = new ArrayList<>(); + allPaths.addAll(annotationPaths); + allPaths.addAll(metadataPaths); + allPaths.forEach(x -> indexes.put(x.getFullPath(), IndexEntry.builder() + .type(x.getType()) + .value(x.getValue()) + .build())); - final List allPaths = new ArrayList<>(); - allPaths.addAll(annotationPaths); - allPaths.addAll(metadataPaths); - return indexKeyRepository.persist(allPaths - .stream() - .map(path -> { - final Map values = new HashMap<>(); - values.put("v", path.getValue()); - return IndexKeyEntity.builder() - .index(index) - .type(path.getType()) - .fullPath(path.getFullPath()) - .value(values) - .build(); - })); - })) + return indexRepository.persist(SemrackIndexEntity.builder() + .uid(document.getUid()) + .indexes(indexes) + .build()); + }) .replaceWithVoid(); } @@ -97,12 +80,11 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository search(SearchRequest request) { final IndexSearchResult result = new IndexSearchResult(); - final StringBuilder query = new StringBuilder("SELECT DISTINCT d.uid FROM index_document d JOIN index_key idx on d.id = idx.index_document_id"); + final StringBuilder query = new StringBuilder("SELECT DISTINCT uid FROM semrack_index"); final String lookup = lookupService.lookup(request.getFilter()); final String whereClause = lookup.isEmpty() ? "" : " WHERE " + lookup; query.append(whereClause); - query.append(" GROUP BY d.uid"); return getSession() .chain(s -> queryPaginationInfo(request) @@ -119,8 +101,7 @@ public class SemdocJpaIndex implements SemdocIndex, PanacheRepository clear(String documentId) { return Uni.createFrom().nullItem() - .call(() -> IndexKeyEntity.delete("index.uid = ?1", documentId)) - .call(() -> IndexDocumentEntity.delete("uid = ?1", documentId)) + .call(() -> SemrackIndexEntity.delete("uid = ?1", documentId)) .replaceWithVoid(); } diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/dtos/IndexEntry.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/dtos/IndexEntry.java new file mode 100644 index 0000000..c70d188 --- /dev/null +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/dtos/IndexEntry.java @@ -0,0 +1,14 @@ +package fr.codeanddata.semrack.index.postgres.dtos; + +import fr.codeanddata.semrack.core.utils.Traverser; +import lombok.*; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class IndexEntry { + Traverser.PathTypes type; + Object value; +} diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexDocumentEntity.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexDocumentEntity.java deleted file mode 100644 index e918b83..0000000 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexDocumentEntity.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.codeanddata.semrack.index.postgres.entities; - -import io.quarkus.hibernate.reactive.panache.PanacheEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Table; -import lombok.*; - -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Entity(name = "IndexDocument") -@Table(name = "index_document") -public class IndexDocumentEntity extends PanacheEntity { - - @Column(nullable = false, unique = true, columnDefinition = "varchar(256)") - String uid; -} diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexKeyEntity.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexKeyEntity.java deleted file mode 100644 index 452ed33..0000000 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/IndexKeyEntity.java +++ /dev/null @@ -1,33 +0,0 @@ -package fr.codeanddata.semrack.index.postgres.entities; - -import fr.codeanddata.semrack.core.utils.Traverser; -import io.quarkus.hibernate.reactive.panache.PanacheEntity; -import jakarta.persistence.*; -import lombok.*; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.util.Map; - -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Entity(name = "IndexAnnotation") -@Table(name = "index_key") -public class IndexKeyEntity extends PanacheEntity { - - @ManyToOne - @JoinColumn(name = "index_document_id", nullable = false) - IndexDocumentEntity index; - - @Column(name = "fullpath") - String fullPath; - - @Enumerated(EnumType.STRING) - Traverser.PathTypes type; - - @JdbcTypeCode(SqlTypes.JSON) - Map value; -} diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/SemrackIndexEntity.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/SemrackIndexEntity.java new file mode 100644 index 0000000..1587e49 --- /dev/null +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/entities/SemrackIndexEntity.java @@ -0,0 +1,26 @@ +package fr.codeanddata.semrack.index.postgres.entities; + +import fr.codeanddata.semrack.index.postgres.dtos.IndexEntry; +import io.quarkus.hibernate.reactive.panache.PanacheEntity; +import jakarta.persistence.*; +import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.util.Map; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Entity(name = "SemrackIndex") +@Table(name = "semrack_index") +public class SemrackIndexEntity extends PanacheEntity { + + @Column(nullable = false, unique = true, columnDefinition = "varchar(256)") + String uid; + + @JdbcTypeCode(SqlTypes.JSON) + Map indexes; +} 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 e764661..dfd7917 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 @@ -18,6 +18,6 @@ public class AndLookup implements SemrackJpaLookupExpression> typedExpressions = convert(expressions); - return String.join(" AND ", typedExpressions.stream().map(lookupService::lookup).toList()); + return "(" + String.join(" AND ", typedExpressions.stream().map(lookupService::lookup).toList()) + ")"; } } 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 b15cd2d..2049b57 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 @@ -24,7 +24,7 @@ public class EqualLookup implements SemrackJpaLookupExpression'v' = '"+ objectMapper.writeValueAsString(equalLookupParams.getValue())+"'::jsonb)"; + return "(indexes->'"+ equalLookupParams.getField() + "'->'value' = '"+ objectMapper.writeValueAsString(equalLookupParams.getValue())+"'::jsonb)"; } catch (JsonProcessingException e) { throw new RuntimeException(e); } 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 8147fe2..2a54de3 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 @@ -31,7 +31,7 @@ public class InLookup implements SemrackJpaLookupExpression { for (Object value : inLookupParams.getValues()) { inValues.add("'" + objectMapper.writeValueAsString(value) + "'::jsonb"); } - return "(idx.fullpath = '" + inLookupParams.getField() + "' AND idx.value->'v' in (" + String.join(",", inValues) + "))"; + return "(indexes->'" + inLookupParams.getField() + "'->'value' in (" + String.join(",", inValues) + "))"; } catch (JsonProcessingException e) { throw new RuntimeException(e); } 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 c14f4e6..b528a2c 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 @@ -18,6 +18,6 @@ public class OrLookup implements SemrackJpaLookupExpression> typedExpressions = convert(expressions); - return String.join(" OR ", typedExpressions.stream().map(lookupService::lookup).toList()); + return "(" + String.join(" OR ", typedExpressions.stream().map(lookupService::lookup).toList()) + ")"; } } diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexDocumentRepository.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexDocumentRepository.java deleted file mode 100644 index 0117490..0000000 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexDocumentRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package fr.codeanddata.semrack.index.postgres.repositories; - -import fr.codeanddata.semrack.index.postgres.entities.IndexDocumentEntity; -import io.quarkus.hibernate.reactive.panache.PanacheRepository; -import jakarta.enterprise.context.ApplicationScoped; - -@ApplicationScoped -public class IndexDocumentRepository implements PanacheRepository { -} diff --git a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexKeyRepository.java b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/SemrackIndexRepository.java similarity index 55% rename from modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexKeyRepository.java rename to modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/SemrackIndexRepository.java index a0ad72c..b9b9ac7 100644 --- a/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/IndexKeyRepository.java +++ b/modules/semrack-index-postgres/runtime/src/main/java/fr/codeanddata/semrack/index/postgres/repositories/SemrackIndexRepository.java @@ -1,9 +1,9 @@ package fr.codeanddata.semrack.index.postgres.repositories; -import fr.codeanddata.semrack.index.postgres.entities.IndexKeyEntity; +import fr.codeanddata.semrack.index.postgres.entities.SemrackIndexEntity; import io.quarkus.hibernate.reactive.panache.PanacheRepository; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped -public class IndexKeyRepository implements PanacheRepository { +public class SemrackIndexRepository implements PanacheRepository { } diff --git a/modules/semrack-index-postgres/runtime/src/main/resources/db/migration/V1.0.3__IndexPg.sql b/modules/semrack-index-postgres/runtime/src/main/resources/db/migration/V1.0.3__IndexPg.sql new file mode 100644 index 0000000..96fb670 --- /dev/null +++ b/modules/semrack-index-postgres/runtime/src/main/resources/db/migration/V1.0.3__IndexPg.sql @@ -0,0 +1,18 @@ +drop sequence if exists index_document_SEQ; +drop sequence if exists index_key_SEQ; + +drop table if exists index_key; +drop table if exists index_document; + +create table semrack_index +( + id bigint NOT NULL, + uid varchar(256) NOT NULL, + indexes jsonb, + constraint pk_semrack_index primary key (id) +); + +alter table semrack_index + add constraint uc_semrack_index_uid unique (uid); + +create sequence semrack_index_SEQ start with 1 increment by 50; diff --git a/pom.xml b/pom.xml index d2e768e..92b1f61 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ 1.18.38 1.6.3 1.0-SNAPSHOT - 3.27.0 + 3.29.4 2.9.0