Tony CHEMIT pushed to branch develop-9 at ultreiaio / ird-observe Commits: 51be9d72 by Tony Chemit at 2021-04-28T17:59:11+02:00 Generate name queries in entity mapping to use dto projection on hibernate - See ultreiaio/ird-observe-toolkit#34 - - - - - 3 changed files: - models/persistence/java/src/main/java/fr/ird/observe/entities/data/ProgramAwareTopiaDao.java - + models/persistence/java/src/test/java/fr/ird/observe/entities/ObserveTopiaPersistenceContextTest.java - pom.xml Changes: ===================================== models/persistence/java/src/main/java/fr/ird/observe/entities/data/ProgramAwareTopiaDao.java ===================================== @@ -26,6 +26,7 @@ import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import fr.ird.observe.dto.ToolkitId; import fr.ird.observe.dto.data.DataDto; import fr.ird.observe.dto.decoration.DecoratorServiceSupport; import fr.ird.observe.dto.reference.DataDtoReference; @@ -33,6 +34,7 @@ import fr.ird.observe.dto.referential.I18nReferentialHelper; import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.dto.referential.common.GearType; import fr.ird.observe.dto.referential.common.ProgramDto; +import fr.ird.observe.entities.ObserveDaoQuerySupport; import fr.ird.observe.entities.ObserveEntityEnum; import fr.ird.observe.entities.ObserveTopiaDaoSupplier; import fr.ird.observe.entities.referential.common.Program; @@ -41,6 +43,8 @@ import fr.ird.observe.spi.context.DataDtoEntityContext; import org.apache.commons.lang3.NotImplementedException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; import org.nuiton.topia.persistence.AddCriteriaOrRunQueryStepWithDelegate; import org.nuiton.topia.persistence.InnerAddCriteriaOrRunQueryStepWithDelegate; import org.nuiton.topia.persistence.TopiaDao; @@ -73,10 +77,11 @@ import java.util.stream.Stream; * @author Tony Chemit - dev@tchemit.fr * @since 9.0.0 */ +@SuppressWarnings("Guava") public abstract class ProgramAwareTopiaDao<D extends DataDto & fr.ird.observe.dto.data.ProgramAware, R extends DataDtoReference & fr.ird.observe.dto.data.ProgramAware, E extends DataEntity<D, R> & ProgramAware<D, R>, - P extends DataEntity<?, ?> & TripAware<?, ?>> implements TopiaDao<E> { + P extends DataEntity<?, ?> & TripAware<?, ?>> implements TopiaDao<E>, ObserveDaoQuerySupport { public static final String GET_CHILDREN = "SELECT" + " t.topiaId," + " t.lastUpdateDate," + @@ -451,4 +456,22 @@ public abstract class ProgramAwareTopiaDao<D extends DataDto & fr.ird.observe.dt protected TopiaQueryBuilderAddCriteriaOrRunQueryStep<Program> availableProgramStep(String id) { return availableProgramStep().addEquals(Program.PROPERTY_TOPIA_ID, id); } + + //FIXME We need to generate proper queries on program entity mapping + @Override + public final Query<ToolkitId> getIdQuery(String queryName) { + return delegate.getIdQuery(queryName); + } + + //FIXME We need to generate proper queries on program entity mapping + @Override + public final Query<Map<String, ?>> getMapQuery(String queryName) { + return delegate.getMapQuery(queryName); + } + + //FIXME We need to generate proper queries on program entity mapping + @Override + public <T> NativeQuery<T> getSqlQuery(String queryName) { + return delegate.getSqlQuery(queryName); + } } ===================================== models/persistence/java/src/test/java/fr/ird/observe/entities/ObserveTopiaPersistenceContextTest.java ===================================== @@ -0,0 +1,231 @@ +package fr.ird.observe.entities; + +/*- + * #%L + * ObServe Models :: Persistence :: Java + * %% + * Copyright (C) 2008 - 2021 IRD, Code Lutin, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import fr.ird.observe.dto.IdDto; +import fr.ird.observe.dto.ToolkitId; +import fr.ird.observe.dto.ToolkitIdMap; +import fr.ird.observe.dto.data.EditableDto; +import fr.ird.observe.dto.data.OpenableDto; +import fr.ird.observe.dto.reference.DtoReference; +import fr.ird.observe.spi.PersistenceBusinessProject; +import fr.ird.observe.spi.context.DtoEntityContext; +import fr.ird.observe.spi.module.ObserveBusinessProject; +import fr.ird.observe.test.ObserveFixtures; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.topia.persistence.TopiaEntity; + +import java.lang.reflect.Modifier; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; + +/** + * Created on 28/04/2021. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.0 + */ +public class ObserveTopiaPersistenceContextTest extends PersistenceTestSupport { + + @Test + public void testMapProjection() { + try (ObserveTopiaPersistenceContext persistenceContext = localTestMethodResource.newPersistenceContext()) { + for (ObserveEntityEnum value : ObserveEntityEnum.values()) { + if (Modifier.isAbstract(value.getImplementation().getModifiers())) { + continue; + } + Class<? extends TopiaEntity> contract = value.getContract(); + List<String> allIds = persistenceContext.getDao(contract).findAllIds(); + if (allIds.isEmpty()) { + continue; + } + if (allIds.size() < 100) { + Stream<ToolkitIdMap> queryAll = persistenceContext.executeQueryMapAll(contract); + Assert.assertNotNull(queryAll); + Assert.assertEquals(allIds.size(), queryAll.count()); + } + + String id = allIds.get(0); + ToolkitIdMap queryOne = persistenceContext.executeQueryMapOne(contract, id); + Assert.assertNotNull(queryOne); + Assert.assertEquals(id, queryOne.getTopiaId()); + + Stream<ToolkitIdMap> querySome = persistenceContext.executeQueryMapSome(contract, Collections.singleton(id)); + Assert.assertNotNull(querySome); + Assert.assertEquals(1, querySome.count()); + + } + } + } + + @Test + public void testMapProjectionFromDao() { + try (ObserveTopiaPersistenceContext persistenceContext = localTestMethodResource.newPersistenceContext()) { + for (ObserveEntityEnum value : ObserveEntityEnum.values()) { + if (Modifier.isAbstract(value.getImplementation().getModifiers())) { + continue; + } + Class<? extends TopiaEntity> contract = value.getContract(); + ObserveDaoQuerySupport dao = (ObserveDaoQuerySupport) persistenceContext.getDao(contract); + List<String> allIds = dao.findAllIds(); + if (allIds.isEmpty()) { + continue; + } + if (allIds.size() < 100) { + Stream<ToolkitIdMap> queryAll = dao.executeQueryMapAll(); + Assert.assertNotNull(queryAll); + Assert.assertEquals(allIds.size(), queryAll.count()); + } + + String id = allIds.get(0); + ToolkitIdMap queryOne = dao.executeQueryMapOne(id); + Assert.assertNotNull(queryOne); + Assert.assertEquals(id, queryOne.getTopiaId()); + + Stream<ToolkitIdMap> querySome = dao.executeQueryMapSome(Collections.singleton(id)); + Assert.assertNotNull(querySome); + Assert.assertEquals(1, querySome.count()); + + } + } + } + + @Test + public void testGetParentId() { + + Set<Class<? extends OpenableDto>> openableDataTypes = ObserveBusinessProject.get().getOpenableDataTypes(); + Set<Class<? extends EditableDto>> editableDataTypes = ObserveBusinessProject.get().getEditableDataTypes(); + + try (ObserveTopiaPersistenceContext persistenceContext = localTestMethodResource.newPersistenceContext()) { + for (ObserveEntityEnum value : ObserveEntityEnum.values()) { + if (Modifier.isAbstract(value.getImplementation().getModifiers())) { + continue; + } + + @SuppressWarnings("unchecked") Class<? extends Entity> contract = (Class<? extends Entity>) value.getContract(); + DtoEntityContext<IdDto, DtoReference, ? extends Entity, ?> spi = PersistenceBusinessProject.fromEntity(contract); + if (spi == null) { + continue; + } + Class<IdDto> dtoType = spi.toDtoType(); + + boolean isOpen = openableDataTypes.contains(dtoType); + String id = null; + if (isOpen) { + List<String> allIds = persistenceContext.getDao(contract).findAllIds(); + if (allIds.isEmpty()) { + continue; + } + id = allIds.get(0); + } + if (id == null) { + continue; + } + String query = persistenceContext.executeQueryGetParentId(contract, id); + if (query == null) { + query = persistenceContext.executeQueryGetParentId2(contract, id); + Assert.assertNotNull(query); + } + } + } + } + + @Test + public void testIdProjection() { + try (ObserveTopiaPersistenceContext persistenceContext = localTestMethodResource.newPersistenceContext()) { + for (ObserveEntityEnum value : ObserveEntityEnum.values()) { + if (Modifier.isAbstract(value.getImplementation().getModifiers())) { + continue; + } + Class<? extends TopiaEntity> contract = value.getContract(); + List<String> allIds = persistenceContext.getDao(contract).findAllIds(); + if (allIds.isEmpty()) { + continue; + } + if (allIds.size() < 100) { + Stream<ToolkitId> queryAll = persistenceContext.executeQueryIdAll(contract); + Assert.assertNotNull(queryAll); + Assert.assertEquals(allIds.size(), queryAll.count()); + } + String id = allIds.get(0); + ToolkitId query = persistenceContext.executeQueryIdEquals(contract, id); + Assert.assertNotNull(query); + Assert.assertEquals(id, query.getTopiaId()); + Assert.assertEquals(id, query.getId()); + Assert.assertNotNull(query.getLastUpdateDate()); + + Stream<ToolkitId> querySome = persistenceContext.executeQueryIdIn(contract, Collections.singleton(id)); + Assert.assertNotNull(querySome); + Assert.assertEquals(1, querySome.count()); + + Stream<ToolkitId> queryBefore = persistenceContext.executeQueryIdBefore(contract, ObserveFixtures.DATE); + Assert.assertNotNull(queryBefore); + + Stream<ToolkitId> queryAfter = persistenceContext.executeQueryIdAfter(contract, ObserveFixtures.DATE); + Assert.assertNotNull(queryAfter); + } + } + } + + + @Test + public void testIdProjectionFromDao() { + try (ObserveTopiaPersistenceContext persistenceContext = localTestMethodResource.newPersistenceContext()) { + for (ObserveEntityEnum value : ObserveEntityEnum.values()) { + if (Modifier.isAbstract(value.getImplementation().getModifiers())) { + continue; + } + Class<? extends TopiaEntity> contract = value.getContract(); + ObserveDaoQuerySupport dao = (ObserveDaoQuerySupport) persistenceContext.getDao(contract); + List<String> allIds = dao.findAllIds(); + if (allIds.isEmpty()) { + continue; + } + if (allIds.size() < 100) { + Stream<ToolkitId> queryAll = dao.executeQueryIdAll(); + Assert.assertNotNull(queryAll); + Assert.assertEquals(allIds.size(), queryAll.count()); + } + String id = allIds.get(0); + ToolkitId query = dao.executeQueryIdEquals(id); + Assert.assertNotNull(query); + Assert.assertEquals(id, query.getTopiaId()); + Assert.assertEquals(id, query.getId()); + Assert.assertNotNull(query.getLastUpdateDate()); + + Stream<ToolkitId> querySome = dao.executeQueryIdIn(Collections.singleton(id)); + Assert.assertNotNull(querySome); + Assert.assertEquals(1, querySome.count()); + + Stream<ToolkitId> queryBefore = dao.executeQueryIdBefore(ObserveFixtures.DATE); + Assert.assertNotNull(queryBefore); + + Stream<ToolkitId> queryAfter = dao.executeQueryIdAfter(ObserveFixtures.DATE); + Assert.assertNotNull(queryAfter); + } + } + } +} ===================================== pom.xml ===================================== @@ -171,7 +171,7 @@ <lib.version.reflections>0.9.11</lib.version.reflections> <!-- <lib.version.java4all.http>1.0.30</lib.version.java4all.http>--> - <!-- <lib.version.java4all.topia>1.44</lib.version.java4all.topia>--> + <lib.version.java4all.topia>1.47-SNAPSHOT</lib.version.java4all.topia> <!-- <lib.version.java4all.eugene>3.0-alpha-38</lib.version.java4all.eugene>--> <!-- <lib.version.java4all.jaxx>3.0.0-RC-4</lib.version.java4all.jaxx>--> <!--<lib.version.java4all.application-context>1.0.3-SNAPSHOT</lib.version.java4all.application-context>--> View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/51be9d72b1e433c08fc43e4c17... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/51be9d72b1e433c08fc43e4c17... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)