diff --git a/core/app/datasource/src/main/java/io/openk9/datasource/service/AnalyzerService.java b/core/app/datasource/src/main/java/io/openk9/datasource/service/AnalyzerService.java index 17d3d1bfc..0d43d48c2 100644 --- a/core/app/datasource/src/main/java/io/openk9/datasource/service/AnalyzerService.java +++ b/core/app/datasource/src/main/java/io/openk9/datasource/service/AnalyzerService.java @@ -23,7 +23,9 @@ import io.openk9.datasource.model.Analyzer; import io.openk9.datasource.model.Analyzer_; import io.openk9.datasource.model.CharFilter; +import io.openk9.datasource.model.CharFilter_; import io.openk9.datasource.model.TokenFilter; +import io.openk9.datasource.model.TokenFilter_; import io.openk9.datasource.model.Tokenizer; import io.openk9.datasource.model.dto.AnalyzerDTO; import io.openk9.datasource.service.util.BaseK9EntityService; @@ -31,6 +33,12 @@ import io.smallrye.mutiny.Uni; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Join; +import jakarta.persistence.criteria.JoinType; +import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.Subquery; import java.util.ArrayList; import java.util.List; @@ -46,27 +54,53 @@ public class AnalyzerService extends BaseK9EntityService public Uni> findUnboundAnalyzersByTokenFilter(long tokenFilterId) { return sessionFactory.withTransaction(s -> { - String queryString = "SELECT analyzer.* from analyzer " + - "WHERE analyzer.id not in (" + - "SELECT analyzer_token_filter.analyzer FROM analyzer_token_filter " + - "WHERE analyzer_token_filter.token_filter = (:tokenFilterId))"; - - return s.createNativeQuery(queryString, Analyzer.class) - .setParameter("tokenFilterId", tokenFilterId) - .getResultList(); + CriteriaBuilder cb = sessionFactory.getCriteriaBuilder(); + + CriteriaQuery criteriaQuery = cb.createQuery(Analyzer.class); + Root rootAnalyzer = criteriaQuery.from(Analyzer.class); + + criteriaQuery.select(rootAnalyzer); + + Subquery idsToExcludeQuery = criteriaQuery.subquery(Long.class); + Root rootAnalyzerToExclude = idsToExcludeQuery.from(Analyzer.class); + + Join tokenFilterJoinToExclude = + rootAnalyzerToExclude.join(Analyzer_.tokenFilters, JoinType.INNER); + + idsToExcludeQuery + .select(rootAnalyzerToExclude.get(Analyzer_.id)) + .where(cb.equal(tokenFilterJoinToExclude.get(TokenFilter_.id), tokenFilterId)); + + criteriaQuery.where( + cb.not(rootAnalyzer.get(Analyzer_.id).in(idsToExcludeQuery))); + + return s.createQuery(criteriaQuery).getResultList(); }); } public Uni> findUnboundAnalyzersByCharFilter(long charFilterId) { return sessionFactory.withTransaction(s -> { - String queryString = "SELECT analyzer.* from analyzer " + - "WHERE analyzer.id not in (" + - "SELECT analyzer_char_filter.analyzer FROM analyzer_char_filter " + - "WHERE analyzer_char_filter.char_filter = (:charFilterId))"; - - return s.createNativeQuery(queryString, Analyzer.class) - .setParameter("charFilterId", charFilterId) - .getResultList(); + CriteriaBuilder cb = sessionFactory.getCriteriaBuilder(); + + CriteriaQuery criteriaQuery = cb.createQuery(Analyzer.class); + Root rootAnalyzer = criteriaQuery.from(Analyzer.class); + + criteriaQuery.select(rootAnalyzer); + + Subquery idsToExcludeQuery = criteriaQuery.subquery(Long.class); + Root rootAnalyzerToExclude = idsToExcludeQuery.from(Analyzer.class); + + Join charFilterJoinToExclude = + rootAnalyzerToExclude.join(Analyzer_.charFilters, JoinType.INNER); + + idsToExcludeQuery + .select(rootAnalyzerToExclude.get(Analyzer_.id)) + .where(cb.equal(charFilterJoinToExclude.get(CharFilter_.id), charFilterId)); + + criteriaQuery.where( + cb.not(rootAnalyzer.get(Analyzer_.id).in(idsToExcludeQuery))); + + return s.createQuery(criteriaQuery).getResultList(); }); } diff --git a/core/app/datasource/src/main/java/io/openk9/datasource/service/BucketService.java b/core/app/datasource/src/main/java/io/openk9/datasource/service/BucketService.java index 07f721d87..909748a69 100644 --- a/core/app/datasource/src/main/java/io/openk9/datasource/service/BucketService.java +++ b/core/app/datasource/src/main/java/io/openk9/datasource/service/BucketService.java @@ -448,8 +448,8 @@ public Uni> findUnboundBucketsBySuggestionCategory(long suggestionC }); } - public Uni> findUnboundBucketsByTab(long tabId) { - return sessionFactory.withTransaction(s -> { + public Uni> findUnboundBucketsByTab(long tabId) { + return sessionFactory.withTransaction(s -> { CriteriaBuilder cb = sessionFactory.getCriteriaBuilder(); CriteriaQuery criteriaQuery = cb.createQuery(Bucket.class);