Tony CHEMIT pushed to branch develop-7.x at ultreiaio / ird-observe Commits: 82296bfa by Tony CHEMIT at 2018-09-12T14:04:00Z La synchronisation des référentiels pourrait ne pas fonctionner sur la suppression de certains référentiels - Closes #1048 - - - - - 4 changed files: - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DeleteSqlStatementGenerator.java - services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java Changes: ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/legacy/UnidirectionalReferentialSynchronizeLocalServiceLocal.java ===================================== @@ -26,11 +26,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.reference.ReferentialDtoReferenceSet; -import fr.ird.observe.dto.referential.GearCaracteristicDto; -import fr.ird.observe.dto.referential.GearDto; -import fr.ird.observe.dto.referential.OceanDto; import fr.ird.observe.dto.referential.ReferentialDto; -import fr.ird.observe.dto.referential.SpeciesDto; import fr.ird.observe.dto.referential.seine.ObjectMaterialDto; import fr.ird.observe.dto.referential.seine.ObjectMaterialHelper; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; @@ -48,18 +44,19 @@ import fr.ird.observe.services.service.actions.synchro.referential.legacy.Unidir import fr.ird.observe.spi.DbModelHelper; import fr.ird.observe.spi.context.ReferentialDtoEntityContext; import fr.ird.observe.spi.context.ReferentialReferenceEntityContext; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; import org.nuiton.topia.persistence.support.TopiaSqlWork; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * Created on 27/06/16. * @@ -163,30 +160,8 @@ public class UnidirectionalReferentialSynchronizeLocalServiceLocal extends Obser DeleteSqlStatementGenerator sqlStatementGenerator = new DeleteSqlStatementGenerator(metadataEntity); for (String id : request.getReferentialToRemove()) { - if (SpeciesDto.class.equals(request.getReferentialName())) { - - // also remove ocean_species association - result.add(sqlStatementGenerator.generateAssociationSql("ocean_species", "species", id)); - - // also remove species_specieslist association - result.add(sqlStatementGenerator.generateAssociationSql("species_specieslist", "species", id)); - } - if (OceanDto.class.equals(request.getReferentialName())) { - - // also remove ocean_species association - result.add(sqlStatementGenerator.generateAssociationSql("ocean_species", "ocean", id)); - } - if (GearDto.class.equals(request.getReferentialName())) { - - // also remove gear_gearcaracteristic association - result.add(sqlStatementGenerator.generateAssociationSql("gear_gearcaracteristic", "gear", id)); - } - if (GearCaracteristicDto.class.equals(request.getReferentialName())) { - - // also remove gear_gearcaracteristic association - result.add(sqlStatementGenerator.generateAssociationSql("gear_gearcaracteristic", "gearcaracteristic", id)); - } - result.add(sqlStatementGenerator.generateSql(id)); + List<String> sql = sqlStatementGenerator.generateSql(id); + result.addAll(sql); } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/ng/ReferentialSynchronizeSqlsRequestBuilder.java ===================================== @@ -24,12 +24,10 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.ng; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import fr.ird.observe.dto.reference.ReferentialDtoReference; -import fr.ird.observe.spi.DbModelHelper; import fr.ird.observe.binder.referential.ReferentialEntityDtoBinderSupport; -import fr.ird.observe.spi.DtoModelClasses; -import fr.ird.observe.dto.referential.ReferentialLocale; +import fr.ird.observe.dto.reference.ReferentialDtoReference; import fr.ird.observe.dto.referential.ReferentialDto; +import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.entities.referentiel.ObserveReferentialEntity; import fr.ird.observe.persistence.ObserveEntityEnum; import fr.ird.observe.services.local.service.actions.synchro.referential.sql.DeleteSqlStatementGenerator; @@ -42,15 +40,18 @@ import fr.ird.observe.services.local.service.actions.synchro.referential.sql.Upd import fr.ird.observe.services.service.actions.synchro.referential.ng.ReferentialSynchronizeRequest; import fr.ird.observe.services.service.actions.synchro.referential.ng.ReferentialSynchronizeSqlsRequest; import fr.ird.observe.services.service.actions.synchro.referential.ng.task.ReferentialSynchronizeTask; +import fr.ird.observe.spi.DbModelHelper; +import fr.ird.observe.spi.DtoModelClasses; import fr.ird.observe.spi.context.ReferentialDtoEntityContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; + import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.LogManager; -import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; -import org.nuiton.topia.persistence.metadata.TopiaMetadataModel; /** * Created on 14/08/16. @@ -134,7 +135,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { if (log.isInfoEnabled()) { log.info("Delete: " + deleteTasks.size()); } - onDelete(referentialName, referenceType, deleteTasks, binder); + onDelete(referentialName, referenceType, deleteTasks); Set<ReferentialSynchronizeTask<R>> desactivateTasks = request.getDesactivateTasks(referenceType); if (log.isInfoEnabled()) { @@ -258,7 +259,7 @@ public class ReferentialSynchronizeSqlsRequestBuilder { } - private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> void onDelete(String referentialName, Class<R> type, Set<ReferentialSynchronizeTask<R>> tasks, ReferentialEntityDtoBinderSupport<D, E> binder) { + private <D extends ReferentialDto, R extends ReferentialDtoReference<D, R>, E extends ObserveReferentialEntity> void onDelete(String referentialName, Class<R> type, Set<ReferentialSynchronizeTask<R>> tasks) { TopiaMetadataEntity metadata = metadataModel.getEntity(referentialName); @@ -271,16 +272,14 @@ public class ReferentialSynchronizeSqlsRequestBuilder { Optional<String> replaceReferentialId = task.getOptionalReplaceReferentialId(); if (replaceReferentialId.isPresent()) { ImmutableList<String> sqls = replaceGenerator.generateSqls(referentialId, replaceReferentialId.get()); - for (String sql : sqls) { - resultBuilder.addDeleteStatement(sql); - } + sqls.forEach(resultBuilder::addDeleteStatement); } - String sql = deleteGenerator.generateSql(referentialId); + List<String> sql = deleteGenerator.generateSql(referentialId); if (log.isInfoEnabled()) { log.info("Delete referential: " + type.getName() + " / " + referentialId + " -- " + sql); } - resultBuilder.addDeleteStatement(sql); + sql.forEach(resultBuilder::addDeleteStatement); } } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/DeleteSqlStatementGenerator.java ===================================== @@ -10,22 +10,30 @@ package fr.ird.observe.services.local.service.actions.synchro.referential.sql; * 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 org.apache.logging.log4j.Logger; +import com.google.common.collect.ImmutableList; +import fr.ird.observe.services.local.service.actions.synchro.referential.sql.UpdateSqlStatementGenerator.ManyToManyAssociationStruct; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.nuiton.topia.persistence.metadata.TopiaMetadataEntity; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +import static fr.ird.observe.services.local.service.actions.synchro.referential.sql.UpdateSqlStatementGenerator.MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT; + /** * Pour générer une requète sql de suppression à partir d'un référentiel donné. * <p> @@ -43,34 +51,48 @@ public class DeleteSqlStatementGenerator { private final String schemaName; private final String tableName; + private final LinkedHashSet<ManyToManyAssociationStruct> manyToManyAssociations; public DeleteSqlStatementGenerator(TopiaMetadataEntity metadataEntity) { this.schemaName = metadataEntity.getDbSchemaName(); this.tableName = metadataEntity.getDbTableName(); + Map<String, String> manyToManyAssociationsMap = metadataEntity.getManyToManyAssociations(); + this.manyToManyAssociations = new LinkedHashSet<>(); + for (Map.Entry<String, String> entry : manyToManyAssociationsMap.entrySet()) { + String propertyName = entry.getKey(); + String dbColumnName = metadataEntity.getDbColumnName(propertyName); + String tableName = metadataEntity.getBdManyToManyAssociationTableName(propertyName); + ManyToManyAssociationStruct manyToManyAssociation = new ManyToManyAssociationStruct(propertyName, dbColumnName, tableName); + manyToManyAssociations.add(manyToManyAssociation); + } } - public String generateSql(String id) { - - String result = String.format(DELETE_STATEMENT, schemaName, tableName, id); - + public List<String> generateSql(String id) { + ImmutableList.Builder<String> result = ImmutableList.builder(); + String sql = String.format(DELETE_STATEMENT, schemaName, tableName, id); if (log.isDebugEnabled()) { - log.debug("sql: " + result); + log.debug("sql: " + sql); } - - return result; - + result.add(sql); + for (ManyToManyAssociationStruct manyToManyAssociation : manyToManyAssociations) { + generateManyToManyAssociationSql(id, manyToManyAssociation, result); + } + return result.build(); } - public String generateAssociationSql(String tableName, String columnName, String id) { + private void generateManyToManyAssociationSql(String referentialDtoId, ManyToManyAssociationStruct manyToManyAssociation, ImmutableList.Builder<String> result) { - String result = String.format(DELETE_ASSOCIATION_STATEMENT, schemaName, tableName, columnName, id); + String manyToManyAssociationTableName = manyToManyAssociation.tableName; + // On commence toujours par supprimer toutes les anciennes associations, elles seront ré-ajoutées juste après + String deleteSql = String.format(MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT, + schemaName, + manyToManyAssociationTableName, + tableName, + referentialDtoId); + result.add(deleteSql); if (log.isDebugEnabled()) { - log.debug("sql: " + result); + log.debug("sql: " + deleteSql); } - - return result; - } - } ===================================== services-local/src/main/java/fr/ird/observe/services/local/service/actions/synchro/referential/sql/UpdateSqlStatementGenerator.java ===================================== @@ -57,7 +57,7 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { private static final String UPDATE_STATEMENT = "UPDATE %s.%s SET %s WHERE topiaId ='%s';\n"; // We use a special prefix because those requests must be applied before all simple insert requests - private static final String MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT = "$$_DELETE FROM %s.%s WHERE %s = '%s';\n"; + static final String MANY_TO_MANY_ASSOCIATION_DELETE_STATEMENT = "$$_DELETE FROM %s.%s WHERE %s = '%s';\n"; private final Map<String, String> columnNames; private final String schemaName; @@ -329,7 +329,7 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { /** * Pour décrire une association nm. */ - private static class ManyToManyAssociationStruct { + static class ManyToManyAssociationStruct { /** * Le nom de la propriété dans l'objet. @@ -342,9 +342,9 @@ public class UpdateSqlStatementGenerator<D extends ReferentialDto> { /** * Le nom de la table d'association. */ - private final String tableName; + final String tableName; - private ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName) { + ManyToManyAssociationStruct(String propertyName, String dbColumnName, String tableName) { this.propertyName = propertyName; this.dbColumnName = dbColumnName; this.tableName = tableName; View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/82296bfa2b4972bf1ead88b2d2a8... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/commit/82296bfa2b4972bf1ead88b2d2a8... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT