From 8c0bd2ffd2ac26265dd9dc53d6a4dbce40605116 Mon Sep 17 00:00:00 2001 From: Alexander Dobler <50330299+dobleralex@users.noreply.github.com> Date: Wed, 4 Aug 2021 17:46:31 +0200 Subject: [PATCH] Replace NoCountPagingRepository by interface with dedicated findAllWithoutCount (#1146) * Replace NoCountPagingRepository by enhanced BaseRepository Signed-off-by: Alexander Dobler * Add missed withoutcount call in distributionsettype find all Signed-off-by: Alexander Dobler * Add missing overrides to NoCountRepository implementation Signed-off-by: Alexander Dobler * Remove need of repository by referencing base class directly in configuration Signed-off-by: Alexander Dobler --- .../repository/jpa/BaseEntityRepository.java | 2 +- .../jpa/JpaDistributionSetManagement.java | 12 +- .../jpa/JpaDistributionSetTagManagement.java | 8 +- .../jpa/JpaDistributionSetTypeManagement.java | 10 +- .../jpa/JpaSoftwareModuleManagement.java | 9 +- .../jpa/JpaSoftwareModuleTypeManagement.java | 8 +- .../repository/jpa/JpaTargetManagement.java | 11 +- .../jpa/NoCountPagingRepository.java | 116 ------------------ .../jpa/NoCountSliceRepository.java | 45 +++++++ .../RepositoryApplicationConfiguration.java | 48 +++----- .../jpa/SimpleJpaWithNoCountRepository.java | 64 ++++++++++ 11 files changed, 148 insertions(+), 185 deletions(-) delete mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountPagingRepository.java create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountSliceRepository.java create mode 100644 hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/SimpleJpaWithNoCountRepository.java diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java index 6ead45083..ddccb4f6e 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/BaseEntityRepository.java @@ -29,7 +29,7 @@ import org.springframework.transaction.annotation.Transactional; @NoRepositoryBean @Transactional(readOnly = true) public interface BaseEntityRepository - extends PagingAndSortingRepository { + extends PagingAndSortingRepository, NoCountSliceRepository { /** * Retrieves an {@link BaseEntity} by its id. diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java index 9f652a455..b44e9d73e 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetManagement.java @@ -100,8 +100,6 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { private final ActionRepository actionRepository; - private final NoCountPagingRepository criteriaNoCountDao; - private final EventPublisherHolder eventPublisherHolder; private final TenantAware tenantAware; @@ -122,8 +120,8 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { final DistributionSetTypeManagement distributionSetTypeManagement, final QuotaManagement quotaManagement, final DistributionSetMetadataRepository distributionSetMetadataRepository, final TargetFilterQueryRepository targetFilterQueryRepository, final ActionRepository actionRepository, - final NoCountPagingRepository criteriaNoCountDao, final EventPublisherHolder eventPublisherHolder, - final TenantAware tenantAware, final VirtualPropertyReplacer virtualPropertyReplacer, + final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware, + final VirtualPropertyReplacer virtualPropertyReplacer, final SoftwareModuleRepository softwareModuleRepository, final DistributionSetTagRepository distributionSetTagRepository, final AfterTransactionCommitExecutor afterCommit, final Database database) { @@ -136,7 +134,6 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { this.distributionSetMetadataRepository = distributionSetMetadataRepository; this.targetFilterQueryRepository = targetFilterQueryRepository; this.actionRepository = actionRepository; - this.criteriaNoCountDao = criteriaNoCountDao; this.eventPublisherHolder = eventPublisherHolder; this.tenantAware = tenantAware; this.virtualPropertyReplacer = virtualPropertyReplacer; @@ -793,8 +790,9 @@ public class JpaDistributionSetManagement implements DistributionSetManagement { @Override public Slice findAll(final Pageable pageable) { - return convertDsPage(criteriaNoCountDao.findAll(DistributionSetSpecification.isDeleted(false), pageable, - JpaDistributionSet.class), pageable); + return convertDsPage( + distributionSetRepository.findAllWithoutCount(DistributionSetSpecification.isDeleted(false), pageable), + pageable); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTagManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTagManagement.java index fca185f48..d5e4687fd 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTagManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTagManagement.java @@ -55,18 +55,14 @@ public class JpaDistributionSetTagManagement implements DistributionSetTagManage private final VirtualPropertyReplacer virtualPropertyReplacer; - private final NoCountPagingRepository criteriaNoCountDao; - private final Database database; JpaDistributionSetTagManagement(final DistributionSetTagRepository distributionSetTagRepository, final DistributionSetRepository distributionSetRepository, - final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao, - final Database database) { + final VirtualPropertyReplacer virtualPropertyReplacer, final Database database) { this.distributionSetTagRepository = distributionSetTagRepository; this.distributionSetRepository = distributionSetRepository; this.virtualPropertyReplacer = virtualPropertyReplacer; - this.criteriaNoCountDao = criteriaNoCountDao; this.database = database; } @@ -129,7 +125,7 @@ public class JpaDistributionSetTagManagement implements DistributionSetTagManage @Override public Slice findAll(final Pageable pageable) { - return convertDsPage(criteriaNoCountDao.findAll(pageable, JpaDistributionSetTag.class), pageable); + return convertDsPage(distributionSetTagRepository.findAllWithoutCount(pageable), pageable); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTypeManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTypeManagement.java index b8cb28dfb..a7675bf93 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTypeManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaDistributionSetTypeManagement.java @@ -68,7 +68,6 @@ public class JpaDistributionSetTypeManagement implements DistributionSetTypeMana private final VirtualPropertyReplacer virtualPropertyReplacer; - private final NoCountPagingRepository criteriaNoCountDao; private final Database database; private final QuotaManagement quotaManagement; @@ -76,13 +75,12 @@ public class JpaDistributionSetTypeManagement implements DistributionSetTypeMana JpaDistributionSetTypeManagement(final DistributionSetTypeRepository distributionSetTypeRepository, final SoftwareModuleTypeRepository softwareModuleTypeRepository, final DistributionSetRepository distributionSetRepository, - final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao, - final Database database, final QuotaManagement quotaManagement) { + final VirtualPropertyReplacer virtualPropertyReplacer, final Database database, + final QuotaManagement quotaManagement) { this.distributionSetTypeRepository = distributionSetTypeRepository; this.softwareModuleTypeRepository = softwareModuleTypeRepository; this.distributionSetRepository = distributionSetRepository; this.virtualPropertyReplacer = virtualPropertyReplacer; - this.criteriaNoCountDao = criteriaNoCountDao; this.database = database; this.quotaManagement = quotaManagement; } @@ -234,8 +232,8 @@ public class JpaDistributionSetTypeManagement implements DistributionSetTypeMana @Override public Slice findAll(final Pageable pageable) { - return convertPage(criteriaNoCountDao.findAll(DistributionSetTypeSpecification.isDeleted(false), pageable, - JpaDistributionSetType.class), pageable); + return convertPage(distributionSetTypeRepository + .findAllWithoutCount(DistributionSetTypeSpecification.isDeleted(false), pageable), pageable); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleManagement.java index d35da4ea4..1352c675f 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleManagement.java @@ -103,8 +103,6 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement { private final SoftwareModuleTypeRepository softwareModuleTypeRepository; - private final NoCountPagingRepository criteriaNoCountDao; - private final AuditorAware auditorProvider; private final ArtifactManagement artifactManagement; @@ -119,8 +117,7 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement { final DistributionSetRepository distributionSetRepository, final SoftwareModuleRepository softwareModuleRepository, final SoftwareModuleMetadataRepository softwareModuleMetadataRepository, - final SoftwareModuleTypeRepository softwareModuleTypeRepository, - final NoCountPagingRepository criteriaNoCountDao, final AuditorAware auditorProvider, + final SoftwareModuleTypeRepository softwareModuleTypeRepository, final AuditorAware auditorProvider, final ArtifactManagement artifactManagement, final QuotaManagement quotaManagement, final VirtualPropertyReplacer virtualPropertyReplacer, final Database database) { this.entityManager = entityManager; @@ -128,7 +125,6 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement { this.softwareModuleRepository = softwareModuleRepository; this.softwareModuleMetadataRepository = softwareModuleMetadataRepository; this.softwareModuleTypeRepository = softwareModuleTypeRepository; - this.criteriaNoCountDao = criteriaNoCountDao; this.auditorProvider = auditorProvider; this.artifactManagement = artifactManagement; this.quotaManagement = quotaManagement; @@ -222,8 +218,7 @@ public class JpaSoftwareModuleManagement implements SoftwareModuleManagement { private Slice findByCriteriaAPI(final Pageable pageable, final List> specList) { - return criteriaNoCountDao.findAll(SpecificationsBuilder.combineWithAnd(specList), pageable, - JpaSoftwareModule.class); + return softwareModuleRepository.findAllWithoutCount(SpecificationsBuilder.combineWithAnd(specList), pageable); } private Long countSwModuleByCriteriaAPI(final List> specList) { diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleTypeManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleTypeManagement.java index 3e9fbc514..1371ab4be 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleTypeManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaSoftwareModuleTypeManagement.java @@ -55,19 +55,17 @@ public class JpaSoftwareModuleTypeManagement implements SoftwareModuleTypeManage private final SoftwareModuleRepository softwareModuleRepository; - private final NoCountPagingRepository criteriaNoCountDao; private final Database database; public JpaSoftwareModuleTypeManagement(final DistributionSetTypeRepository distributionSetTypeRepository, final SoftwareModuleTypeRepository softwareModuleTypeRepository, final VirtualPropertyReplacer virtualPropertyReplacer, - final SoftwareModuleRepository softwareModuleRepository, final NoCountPagingRepository criteriaNoCountDao, + final SoftwareModuleRepository softwareModuleRepository, final Database database) { this.distributionSetTypeRepository = distributionSetTypeRepository; this.softwareModuleTypeRepository = softwareModuleTypeRepository; this.virtualPropertyReplacer = virtualPropertyReplacer; this.softwareModuleRepository = softwareModuleRepository; - this.criteriaNoCountDao = criteriaNoCountDao; this.database = database; } @@ -98,9 +96,9 @@ public class JpaSoftwareModuleTypeManagement implements SoftwareModuleTypeManage @Override public Slice findAll(final Pageable pageable) { - return convertPage(criteriaNoCountDao.findAll( + return convertPage(softwareModuleTypeRepository.findAllWithoutCount( (targetRoot, query, cb) -> cb.equal(targetRoot. get(JpaSoftwareModuleType_.deleted), false), - pageable, JpaSoftwareModuleType.class), pageable); + pageable), pageable); } @Override diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java index 105911edc..c09da659c 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/JpaTargetManagement.java @@ -108,8 +108,6 @@ public class JpaTargetManagement implements TargetManagement { private final TargetTagRepository targetTagRepository; - private final NoCountPagingRepository criteriaNoCountDao; - private final EventPublisherHolder eventPublisherHolder; private final TenantAware tenantAware; @@ -125,7 +123,7 @@ public class JpaTargetManagement implements TargetManagement { final RolloutGroupRepository rolloutGroupRepository, final DistributionSetRepository distributionSetRepository, final TargetFilterQueryRepository targetFilterQueryRepository, - final TargetTagRepository targetTagRepository, final NoCountPagingRepository criteriaNoCountDao, + final TargetTagRepository targetTagRepository, final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware, final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer, final Database database) { @@ -137,7 +135,6 @@ public class JpaTargetManagement implements TargetManagement { this.distributionSetRepository = distributionSetRepository; this.targetFilterQueryRepository = targetFilterQueryRepository; this.targetTagRepository = targetTagRepository; - this.criteriaNoCountDao = criteriaNoCountDao; this.eventPublisherHolder = eventPublisherHolder; this.tenantAware = tenantAware; this.afterCommit = afterCommit; @@ -300,7 +297,7 @@ public class JpaTargetManagement implements TargetManagement { @Override public Slice findAll(final Pageable pageable) { - return convertPage(criteriaNoCountDao.findAll(pageable, JpaTarget.class), pageable); + return convertPage(targetRepository.findAllWithoutCount(pageable), pageable); } @Override @@ -488,10 +485,10 @@ public class JpaTargetManagement implements TargetManagement { private Slice findByCriteriaAPI(final Pageable pageable, final List> specList) { if (CollectionUtils.isEmpty(specList)) { - return convertPage(criteriaNoCountDao.findAll(pageable, JpaTarget.class), pageable); + return convertPage(targetRepository.findAllWithoutCount(pageable), pageable); } return convertPage( - criteriaNoCountDao.findAll(SpecificationsBuilder.combineWithAnd(specList), pageable, JpaTarget.class), + targetRepository.findAllWithoutCount(SpecificationsBuilder.combineWithAnd(specList), pageable), pageable); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountPagingRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountPagingRepository.java deleted file mode 100644 index 4f32fff02..000000000 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountPagingRepository.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2015 Bosch Software Innovations GmbH and others. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - */ -package org.eclipse.hawkbit.repository.jpa; - -import java.io.Serializable; -import java.util.List; - -import javax.persistence.Entity; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.support.SimpleJpaRepository; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Repository; - -/** - * Workaround as spring data does not provide a {@link Slice} based - * {@link JpaRepository#findAll()}. - * - */ -@Repository -public class NoCountPagingRepository { - - @Autowired - protected EntityManager em; - - /** - * Searches without the need for an extra count query. - * - * @param spec - * to search for - * @param pageable - * information - * @param domainClass - * of the {@link Entity} - * - * @return {@link Slice} of data - * - * @see org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll(org.springframework - * .data.jpa.domain.Specification, - * org.springframework.data.domain.Pageable) - */ - public Slice findAll(final Specification spec, final Pageable pageable, - final Class domainClass) { - final SimpleJpaNoCountRepository noCountDao = new SimpleJpaNoCountRepository<>(domainClass, em); - return noCountDao.findAll(spec, pageable); - } - - /** - * Searches without the need for an extra count query. - * - * @param pageable - * information - * @param domainClass - * of the {@link Entity} - * - * @return {@link Slice} of data - * - * @see org.springframework.data.jpa.repository.JpaSpecificationExecutor#findAll(org.springframework - * .data.jpa.domain.Specification, - * org.springframework.data.domain.Pageable) - */ - public Slice findAll(final Pageable pageable, final Class domainClass) { - final SimpleJpaNoCountRepository noCountDao = new SimpleJpaNoCountRepository<>(domainClass, em); - return noCountDao.findAll(pageable); - } - - /** - * Repository implementation with disabled count query. - * - * - * - * @param - * entity type - * @param - * key or ID type - */ - public static class SimpleJpaNoCountRepository extends SimpleJpaRepository { - - /** - * Constructor. - * - * @param domainClass - * of the {@link Entity} - * @param em - * {@link EntityManager} instance for the queries - */ - public SimpleJpaNoCountRepository(final Class domainClass, final EntityManager em) { - super(domainClass, em); - } - - @Override - protected Page readPage(final TypedQuery query, final Class domainClass, - final Pageable pageable, @Nullable final Specification spec) { - query.setFirstResult((int) pageable.getOffset()); - query.setMaxResults(pageable.getPageSize()); - - final List content = query.getResultList(); - - return new PageImpl<>(content, pageable, content.size()); - } - } -} diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountSliceRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountSliceRepository.java new file mode 100644 index 000000000..737f40b21 --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/NoCountSliceRepository.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2021 Bosch.IO GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.repository.jpa; + +import org.eclipse.hawkbit.repository.model.BaseEntity; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.lang.Nullable; + +/** + * Repository interface that offers findAll with disabled count query. + * + * @param + * entity type + */ +public interface NoCountSliceRepository { + + /** + * Retrieves a slice of {@link BaseEntity}s without keeping the count updated + * + * @param pageable + * page to keep track of slices + * @return {@link BaseEntity} + */ + Slice findAllWithoutCount(Pageable pageable); + + /** + * Retrieves a slice of {@link BaseEntity}s based on spec without keeping the + * count updated + * + * @param spec + * to search for + * @param pageable + * page to keep track of slices + * @return {@link BaseEntity} + */ + Slice findAllWithoutCount(@Nullable Specification spec, Pageable pageable); +} diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java index 5cf1a5101..db37513bb 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/RepositoryApplicationConfiguration.java @@ -134,7 +134,7 @@ import com.google.common.collect.Maps; * General configuration for hawkBit's Repository. * */ -@EnableJpaRepositories("org.eclipse.hawkbit.repository.jpa") +@EnableJpaRepositories(value = "org.eclipse.hawkbit.repository.jpa", repositoryBaseClass = SimpleJpaWithNoCountRepository.class) @EnableTransactionManagement @EnableJpaAuditing @EnableAspectJAutoProxy @@ -194,12 +194,6 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { return new AfterTransactionCommitDefaultServiceExecutor(); } - @Bean - @ConditionalOnMissingBean - NoCountPagingRepository noCountPagingRepository() { - return new NoCountPagingRepository(); - } - @Bean @ConditionalOnMissingBean RsqlValidationOracle rsqlValidationOracle() { @@ -447,14 +441,14 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final DistributionSetTypeManagement distributionSetTypeManagement, final QuotaManagement quotaManagement, final DistributionSetMetadataRepository distributionSetMetadataRepository, final TargetFilterQueryRepository targetFilterQueryRepository, final ActionRepository actionRepository, - final NoCountPagingRepository criteriaNoCountDao, final EventPublisherHolder eventPublisherHolder, - final TenantAware tenantAware, final VirtualPropertyReplacer virtualPropertyReplacer, + final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware, + final VirtualPropertyReplacer virtualPropertyReplacer, final SoftwareModuleRepository softwareModuleRepository, final DistributionSetTagRepository distributionSetTagRepository, final AfterTransactionCommitExecutor afterCommit, final JpaProperties properties) { return new JpaDistributionSetManagement(entityManager, distributionSetRepository, distributionSetTagManagement, systemManagement, distributionSetTypeManagement, quotaManagement, distributionSetMetadataRepository, - targetFilterQueryRepository, actionRepository, criteriaNoCountDao, eventPublisherHolder, tenantAware, + targetFilterQueryRepository, actionRepository, eventPublisherHolder, tenantAware, virtualPropertyReplacer, softwareModuleRepository, distributionSetTagRepository, afterCommit, properties.getDatabase()); @@ -471,11 +465,10 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final DistributionSetTypeRepository distributionSetTypeRepository, final SoftwareModuleTypeRepository softwareModuleTypeRepository, final DistributionSetRepository distributionSetRepository, - final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao, - final JpaProperties properties, final QuotaManagement quotaManagement) { + final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties, + final QuotaManagement quotaManagement) { return new JpaDistributionSetTypeManagement(distributionSetTypeRepository, softwareModuleTypeRepository, - distributionSetRepository, virtualPropertyReplacer, criteriaNoCountDao, properties.getDatabase(), - quotaManagement); + distributionSetRepository, virtualPropertyReplacer, properties.getDatabase(), quotaManagement); } /** @@ -512,14 +505,12 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final RolloutGroupRepository rolloutGroupRepository, final DistributionSetRepository distributionSetRepository, final TargetFilterQueryRepository targetFilterQueryRepository, - final TargetTagRepository targetTagRepository, final NoCountPagingRepository criteriaNoCountDao, - final EventPublisherHolder eventPublisherHolder, final TenantAware tenantAware, - final AfterTransactionCommitExecutor afterCommit, final VirtualPropertyReplacer virtualPropertyReplacer, - final JpaProperties properties) { + final TargetTagRepository targetTagRepository, final EventPublisherHolder eventPublisherHolder, + final TenantAware tenantAware, final AfterTransactionCommitExecutor afterCommit, + final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) { return new JpaTargetManagement(entityManager, quotaManagement, targetRepository, targetMetadataRepository, rolloutGroupRepository, distributionSetRepository, targetFilterQueryRepository, targetTagRepository, - criteriaNoCountDao, eventPublisherHolder, tenantAware, afterCommit, virtualPropertyReplacer, - properties.getDatabase()); + eventPublisherHolder, tenantAware, afterCommit, virtualPropertyReplacer, properties.getDatabase()); } /** @@ -579,10 +570,9 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { DistributionSetTagManagement distributionSetTagManagement( final DistributionSetTagRepository distributionSetTagRepository, final DistributionSetRepository distributionSetRepository, - final VirtualPropertyReplacer virtualPropertyReplacer, final NoCountPagingRepository criteriaNoCountDao, - final JpaProperties properties) { + final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) { return new JpaDistributionSetTagManagement(distributionSetTagRepository, distributionSetRepository, - virtualPropertyReplacer, criteriaNoCountDao, properties.getDatabase()); + virtualPropertyReplacer, properties.getDatabase()); } /** @@ -596,13 +586,12 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final DistributionSetRepository distributionSetRepository, final SoftwareModuleRepository softwareModuleRepository, final SoftwareModuleMetadataRepository softwareModuleMetadataRepository, - final SoftwareModuleTypeRepository softwareModuleTypeRepository, - final NoCountPagingRepository criteriaNoCountDao, final AuditorAware auditorProvider, + final SoftwareModuleTypeRepository softwareModuleTypeRepository, final AuditorAware auditorProvider, final ArtifactManagement artifactManagement, final QuotaManagement quotaManagement, final VirtualPropertyReplacer virtualPropertyReplacer, final JpaProperties properties) { return new JpaSoftwareModuleManagement(entityManager, distributionSetRepository, softwareModuleRepository, - softwareModuleMetadataRepository, softwareModuleTypeRepository, criteriaNoCountDao, auditorProvider, - artifactManagement, quotaManagement, virtualPropertyReplacer, properties.getDatabase()); + softwareModuleMetadataRepository, softwareModuleTypeRepository, auditorProvider, artifactManagement, + quotaManagement, virtualPropertyReplacer, properties.getDatabase()); } /** @@ -616,10 +605,9 @@ public class RepositoryApplicationConfiguration extends JpaBaseConfiguration { final DistributionSetTypeRepository distributionSetTypeRepository, final SoftwareModuleTypeRepository softwareModuleTypeRepository, final VirtualPropertyReplacer virtualPropertyReplacer, - final SoftwareModuleRepository softwareModuleRepository, final NoCountPagingRepository criteriaNoCountDao, - final JpaProperties properties) { + final SoftwareModuleRepository softwareModuleRepository, final JpaProperties properties) { return new JpaSoftwareModuleTypeManagement(distributionSetTypeRepository, softwareModuleTypeRepository, - virtualPropertyReplacer, softwareModuleRepository, criteriaNoCountDao, properties.getDatabase()); + virtualPropertyReplacer, softwareModuleRepository, properties.getDatabase()); } @Bean diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/SimpleJpaWithNoCountRepository.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/SimpleJpaWithNoCountRepository.java new file mode 100644 index 000000000..1c7e02168 --- /dev/null +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/SimpleJpaWithNoCountRepository.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2021 Bosch.IO GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.repository.jpa; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.support.JpaEntityInformation; +import org.springframework.data.jpa.repository.support.SimpleJpaRepository; +import org.springframework.lang.Nullable; + +/** + * Repository implementation that allows findAll with disabled count query. + * + * @param + * entity type + * @param + * key or ID type + */ +public class SimpleJpaWithNoCountRepository extends SimpleJpaRepository + implements NoCountSliceRepository { + + public SimpleJpaWithNoCountRepository(final Class domainClass, final EntityManager em) { + super(domainClass, em); + } + + public SimpleJpaWithNoCountRepository(JpaEntityInformation entityInformation, EntityManager entityManager) { + super(entityInformation, entityManager); + } + + @Override + public Slice findAllWithoutCount(@Nullable Specification spec, Pageable pageable) { + TypedQuery query = getQuery(spec, pageable); + return pageable.isUnpaged() ? new PageImpl<>(query.getResultList()) : readPageWithoutCount(query, pageable); + } + + @Override + public Slice findAllWithoutCount(final Pageable pageable) { + return findAllWithoutCount(null, pageable); + } + + protected Page readPageWithoutCount(final TypedQuery query, final Pageable pageable) { + query.setFirstResult((int) pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + + final List content = query.getResultList(); + + return new PageImpl<>(content, pageable, content.size()); + } +} \ No newline at end of file