Tony CHEMIT pushed to branch feature/feature/issue-2669 at ultreiaio / ird-observe Commits: a502e4d0 by Tony Chemit at 2024-09-12T19:13:49+02:00 stash consolidation updates - - - - - 15 changed files: - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java - client/runner/src/main/i18n/translations/client-runner_en_GB.properties - client/runner/src/main/i18n/translations/client-runner_es_ES.properties - client/runner/src/main/i18n/translations/client-runner_fr_FR.properties - core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateRequest.java - core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateResult.java - + core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateResult.java - + core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateResultBuilder.java - core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateEngine.java - core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleActivityConsolidateContext.java - core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleActivityConsolidateEngine.java → core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateActions.java - + core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateContext.java - + core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateEngine.java - core/services/test/src/main/java/fr/ird/observe/services/service/data/ps/ConsolidateDataServiceFixtures.java - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/data/ps/ConsolidateDataService.properties Changes: ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/consolidate/actions/Start.java ===================================== @@ -38,6 +38,7 @@ import fr.ird.observe.dto.ToolkitIdModifications; import fr.ird.observe.dto.data.TripAware; import fr.ird.observe.dto.data.ps.localmarket.BatchDto; import fr.ird.observe.dto.data.ps.logbook.SampleActivityDto; +import fr.ird.observe.dto.data.ps.logbook.SampleDto; import fr.ird.observe.dto.data.ps.observation.CatchDto; import fr.ird.observe.dto.data.ps.observation.FloatingObjectDto; import fr.ird.observe.dto.data.ps.observation.SampleMeasureDto; @@ -195,8 +196,8 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { for (fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult activityResult : result.getActivityLogbookResults()) { printResult(activityResult); } - for (ToolkitIdModifications modifications : result.getLogbookSampleActivityResults()) { - printResult(SampleActivityDto.class, modifications); + for (fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult sampleResult : result.getLogbookSampleResults()) { + printResult(sampleResult); } for (ToolkitIdModifications batchResult : result.getLocalmarketBatchResults()) { printResult(BatchDto.class, batchResult); @@ -234,6 +235,19 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { } } + void printResult(fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult sampleResult) { + if (sampleResult.withModifications()) { + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification", sampleResult.getSampleId(), sampleResult.getSampleLabel())); + } + if (sampleResult.withWarnings()) { + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning", sampleResult.getSampleId(), sampleResult.getSampleLabel())); + } + printResult(SampleDto.class, sampleResult.getModifications()); + for (ToolkitIdModifications modification : sampleResult.getSampleActivityModifications()) { + printResult(SampleActivityDto.class, modification); + } + } + private void printResult(Class<? extends BusinessDto> dataType, ToolkitIdModifications modifications) { if (modifications == null) { return; ===================================== client/runner/src/main/i18n/translations/client-runner_en_GB.properties ===================================== @@ -510,6 +510,8 @@ observe.ui.datasource.editor.actions.consolidate.description=Consolidate observe observe.ui.datasource.editor.actions.consolidate.end.trip=End consolidate data on trip %s / %s (%s) [duration\: %s] observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification=Some data were computed for Logbook sample [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning=Some warnings were found for Logbook sample [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Property %s, old value\: %s - new value\: %s observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s ===================================== client/runner/src/main/i18n/translations/client-runner_es_ES.properties ===================================== @@ -508,11 +508,13 @@ observe.ui.datasource.editor.actions.consolidate=Calcular los datos observe.ui.datasource.editor.actions.consolidate.config=Consolidate data configuration observe.ui.datasource.editor.actions.consolidate.description=Calcular los datos que no fueron observados observe.ui.datasource.editor.actions.consolidate.end.trip=End consolidate data on trip %s / %s (%s) [duration\: %s] \#TODO -observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s -observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s -observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification=Some data were computed for Logbook sample [%s] %s \#TODO +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning=Some warnings were found for Logbook sample [%s] %s \#TODO +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s \#TODO +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s \#TODO +observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s \#TODO observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Property %s, old value\: %s - new value\: %s \#TODO -observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s \#TODO observe.ui.datasource.editor.actions.consolidate.message.noChanges=No modificación de datos. observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification=Some data were computed for Observations activity [%s] %s observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning=Some warnings were found for Observations activity [%s] %s ===================================== client/runner/src/main/i18n/translations/client-runner_fr_FR.properties ===================================== @@ -509,7 +509,9 @@ observe.ui.datasource.editor.actions.consolidate.config=Configuration de la cons observe.ui.datasource.editor.actions.consolidate.description=Calculer les données non observées observe.ui.datasource.editor.actions.consolidate.end.trip=Consolidation terminée pour la marée %s / %s (%s) [durée \: %s] observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Des données ont été calculées pour l'activité (Livre de bord) [%s] %s -observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Des avertissements ont été détectés pour l'activité (Livre de bord) [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Des avertissements ont été détectés pour l'échantillon (Livre de bord) [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification=Des données ont été calculées pour l'échantillon (Livre de bord) [%s] %s +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning=Des avertissements ont été détectés pour l'activité (Livre de bord) [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d modification(s) pour la donnée de type %s [%s] %s observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Propriété %s, ancienne valeur \: %s - nouvelle valeur \: %s observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d avertissement(s) pour la donnée de type %s [%s] %s ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateRequest.java ===================================== @@ -49,6 +49,8 @@ public class TripConsolidateRequest implements JsonAware { private String speciesListForLogbookSampleActivityWeightedWeight; + private String speciesListForLogbookSampleWeights; + public boolean isFailIfLengthWeightParameterNotFound() { return failIfLengthWeightParameterNotFound; } @@ -80,4 +82,12 @@ public class TripConsolidateRequest implements JsonAware { public void setSpeciesListForLogbookSampleActivityWeightedWeight(String speciesListForLogbookSampleActivityWeightedWeight) { this.speciesListForLogbookSampleActivityWeightedWeight = speciesListForLogbookSampleActivityWeightedWeight; } + + public String getSpeciesListForLogbookSampleWeights() { + return speciesListForLogbookSampleWeights; + } + + public void setSpeciesListForLogbookSampleWeights(String speciesListForLogbookSampleWeights) { + this.speciesListForLogbookSampleWeights = speciesListForLogbookSampleWeights; + } } ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateResult.java ===================================== @@ -23,6 +23,8 @@ package fr.ird.observe.consolidation.data.ps.common; */ +import fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult; +import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult; import fr.ird.observe.dto.ToolkitIdModifications; import io.ultreia.java4all.util.json.JsonAware; @@ -54,9 +56,9 @@ public class TripConsolidateResult implements JsonAware { */ protected final Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityLogbookResults; /** - * Logbook sample activities results. + * Logbook sample results. */ - private final Set<ToolkitIdModifications> logbookSampleActivityResults; + private final Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> logbookSampleResults; /** * Local market batches results. */ @@ -64,15 +66,15 @@ public class TripConsolidateResult implements JsonAware { public TripConsolidateResult(String tripId, String tripLabel, - Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> activityObservationResults, + Set<ActivityConsolidateResult> activityObservationResults, Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityLogbookResults, - Set<ToolkitIdModifications> logbookSampleActivityResults, + Set<SampleConsolidateResult> logbookSampleResults, Set<ToolkitIdModifications> localmarketBatchResults) { this.tripId = tripId; this.tripLabel = tripLabel; this.activityObservationResults = activityObservationResults; this.activityLogbookResults = activityLogbookResults; - this.logbookSampleActivityResults = logbookSampleActivityResults; + this.logbookSampleResults = logbookSampleResults; this.localmarketBatchResults = localmarketBatchResults; } @@ -92,8 +94,8 @@ public class TripConsolidateResult implements JsonAware { return activityLogbookResults; } - public Set<ToolkitIdModifications> getLogbookSampleActivityResults() { - return logbookSampleActivityResults; + public Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> getLogbookSampleResults() { + return logbookSampleResults; } public Set<ToolkitIdModifications> getLocalmarketBatchResults() { @@ -103,14 +105,14 @@ public class TripConsolidateResult implements JsonAware { public boolean withModifications() { return activityObservationResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withModifications) || activityLogbookResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult::withModifications) || - logbookSampleActivityResults.stream().anyMatch(ToolkitIdModifications::withModifications) || + logbookSampleResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult::withModifications) || localmarketBatchResults.stream().anyMatch(ToolkitIdModifications::withModifications); } public boolean withWarnings() { return activityObservationResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withWarnings) || activityLogbookResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult::withWarnings) || - logbookSampleActivityResults.stream().anyMatch(ToolkitIdModifications::withWarnings) || + logbookSampleResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult::withWarnings) || localmarketBatchResults.stream().anyMatch(ToolkitIdModifications::withWarnings); } } ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateResult.java ===================================== @@ -0,0 +1,118 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: API :: Dto Consolidation + * %% + * Copyright (C) 2008 - 2024 IRD, 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.ToolkitIdModifications; +import io.ultreia.java4all.util.json.JsonAware; + +import java.util.Set; + +/** + * Created at 12/09/2024. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.4.0 + */ +public class SampleConsolidateResult implements JsonAware { + + /** + * Id of sample. + */ + protected String sampleId; + + /** + * Label of sample. + */ + private String sampleLabel; + + + /** + * All modifications on the sample (can be null if there is no modification on it). + */ + private ToolkitIdModifications modifications; + /** + * All modification on sample activities. + */ + private Set<ToolkitIdModifications> sampleActivityModifications; + + public String getSampleId() { + return sampleId; + } + + public void setSampleId(String sampleId) { + this.sampleId = sampleId; + } + + public String getSampleLabel() { + return sampleLabel; + } + + public void setSampleLabel(String sampleLabel) { + this.sampleLabel = sampleLabel; + } + + public ToolkitIdModifications getModifications() { + return modifications; + } + + public void setModifications(ToolkitIdModifications modifications) { + this.modifications = modifications; + } + + public Set<ToolkitIdModifications> getSampleActivityModifications() { + return sampleActivityModifications; + } + + public void setSampleActivityModifications(Set<ToolkitIdModifications> sampleActivityModifications) { + this.sampleActivityModifications = sampleActivityModifications; + } + + public boolean withModifications() { + if (getModifications()!=null) { + return getModifications().withModifications(); + } + if (getSampleActivityModifications() != null) { + for (ToolkitIdModifications modifications : getSampleActivityModifications()) { + if (modifications.withModifications()) { + return true; + } + } + } + return false; + } + + public boolean withWarnings() { + if (getModifications()!=null) { + return getModifications().withWarnings(); + } + if (getSampleActivityModifications() != null) { + for (ToolkitIdModifications modifications : getSampleActivityModifications()) { + if (modifications.withWarnings()) { + return true; + } + } + } + return false; + } +} + ===================================== core/api/dto-consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateResultBuilder.java ===================================== @@ -0,0 +1,70 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: API :: Dto Consolidation + * %% + * Copyright (C) 2008 - 2024 IRD, 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.ToolkitIdModifications; + +import java.util.LinkedHashSet; +import java.util.Optional; +import java.util.Set; + +/** + * Created at 12/09/2024. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.4.0 + */ +public class SampleConsolidateResultBuilder { + private final Set<ToolkitIdModifications> sampleActivityModificationBuilder = new LinkedHashSet<>(); + private final String sampleLabel; + private final String sampleId; + private ToolkitIdModifications modifications; + + public SampleConsolidateResultBuilder(String sampleId, String sampleLabel) { + this.sampleId = sampleId; + this.sampleLabel = sampleLabel; + } + + public Optional<SampleConsolidateResult> build() { + boolean noModification = sampleActivityModificationBuilder.isEmpty() && modifications == null; + if (noModification) { + return Optional.empty(); + } + SampleConsolidateResult result = new SampleConsolidateResult(); + result.setSampleId(sampleId); + result.setSampleLabel(sampleLabel); + result.setModifications(modifications); + result.setSampleActivityModifications(sampleActivityModificationBuilder); + return Optional.of(result); + } + + public void flushModification(ToolkitIdModifications modifications) { + this.modifications = modifications; + } + + public void flushSampleActivityModification(ToolkitIdModifications modifications) { + sampleActivityModificationBuilder.add(modifications); + } + +} + ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/common/TripConsolidateEngine.java ===================================== @@ -33,7 +33,6 @@ import fr.ird.observe.dto.referential.ReferentialLocale; import fr.ird.observe.entities.ObserveTopiaDaoSupplier; import fr.ird.observe.entities.data.ps.common.Trip; import fr.ird.observe.entities.data.ps.localmarket.Batch; -import fr.ird.observe.entities.data.ps.logbook.SampleActivity; import fr.ird.observe.entities.referential.common.LengthLengthParameterCache; import fr.ird.observe.entities.referential.common.LengthWeightParameterCache; import fr.ird.observe.entities.referential.common.Species; @@ -66,7 +65,7 @@ public class TripConsolidateEngine { private final BatchConsolidateEngine localmarketBatchEngine; private final fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateEngine observationActivityConsolidateEngine; private final fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateEngine logbookActivityConsolidateEngine; - private final fr.ird.observe.consolidation.data.ps.logbook.SampleActivityConsolidateEngine logbookSampleActivityConsolidateEngine; + private final fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateEngine logbookSampleConsolidateEngine; public TripConsolidateEngine(ServiceContext context, SimplifiedObjectTypeManager simplifiedObjectTypeManager) { this.context = context; @@ -77,7 +76,7 @@ public class TripConsolidateEngine { lengthWeightParameterCache, lengthLengthParameterCache); this.logbookActivityConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateEngine(context, simplifiedObjectTypeManager); - this.logbookSampleActivityConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.SampleActivityConsolidateEngine(context.getDecoratorService()); + this.logbookSampleConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateEngine(context.getDecoratorService()); this.localmarketBatchEngine = new BatchConsolidateEngine(new GetOptionalRtpMeanWeightImpl(context, lengthWeightParameterCache), context.getDecoratorService()); } @@ -91,22 +90,26 @@ public class TripConsolidateEngine { Trip trip = Trip.loadEntity(context, tripId); - String speciesListId = request.getSpeciesListForLogbookSampleActivityWeightedWeight(); - SpeciesList speciesList = SpeciesList.loadEntity(context, speciesListId); - Set<String> speciesListForLogbookSampleActivityWeightedWeight = speciesList.getSpecies().stream().map(Species ::getId).collect(Collectors.toSet()); - Set<ToolkitIdModifications> logbookSampleActivityResults = consolidateLogbookSampleActivities(trip, speciesListForLogbookSampleActivityWeightedWeight); + String sampleActivitySpeciesListId = request.getSpeciesListForLogbookSampleActivityWeightedWeight(); + String sampleSpeciesListId = request.getSpeciesListForLogbookSampleWeights(); + SpeciesList sampleActivitySpeciesList = SpeciesList.loadEntity(context, sampleActivitySpeciesListId); + SpeciesList sampleSpeciesList = SpeciesList.loadEntity(context, sampleSpeciesListId); + Set<String> speciesListForLogbookSampleActivityWeightedWeight = sampleActivitySpeciesList.getSpecies().stream().map(Species ::getId).collect(Collectors.toSet()); + Set<String> speciesListForLogbookSampleWeights = sampleSpeciesList.getSpecies().stream().map(Species ::getId).collect(Collectors.toSet()); + + Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> logbookSampleResults = consolidateLogbookSamples(trip, speciesListForLogbookSampleActivityWeightedWeight, speciesListForLogbookSampleWeights); Set<ToolkitIdModifications> localmarketBatchResults = consolidateLocalmarketBatches(trip, failIfLengthWeightParameterNotFound); Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> observationActivityConsolidateResults = consolidateObservationActivities(trip, failIfLengthWeightParameterNotFound, failIfLengthLengthParameterNotFound); Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> logbookActivityConsolidateResults = consolidateLogbookActivities(trip); - if (logbookSampleActivityResults.isEmpty() && observationActivityConsolidateResults.isEmpty() && localmarketBatchResults.isEmpty() && logbookActivityConsolidateResults.isEmpty()) { + if (logbookSampleResults.isEmpty() && observationActivityConsolidateResults.isEmpty() && localmarketBatchResults.isEmpty() && logbookActivityConsolidateResults.isEmpty()) { // no modification, nor warning on this trip return Optional.empty(); } decoratorService.installDecorator(Trip.class, trip); String tripLabel = trip.toString(); - TripConsolidateResult result = new TripConsolidateResult(tripId, tripLabel, observationActivityConsolidateResults, logbookActivityConsolidateResults, logbookSampleActivityResults, localmarketBatchResults); + TripConsolidateResult result = new TripConsolidateResult(tripId, tripLabel, observationActivityConsolidateResults, logbookActivityConsolidateResults, logbookSampleResults, localmarketBatchResults); boolean withModifications = result.withModifications(); if (withModifications) { log.info(String.format("Found some modifications on trip: %s - %s", tripId, result.getTripLabel())); @@ -131,23 +134,14 @@ public class TripConsolidateEngine { try (ToolkitIdModificationsToSql toolkitIdModificationsToSql = new ToolkitIdModificationsToSql(scriptPath, context.timestampNow(), entitySqlModel)) { observationActivityConsolidateEngine.toSql(result.getActivityObservationResults(), toolkitIdModificationsToSql); logbookActivityConsolidateEngine.toSql(result.getActivityLogbookResults(), toolkitIdModificationsToSql); + logbookSampleConsolidateEngine.toSql(result.getLogbookSampleResults(), toolkitIdModificationsToSql); toolkitIdModificationsToSql.toSql(Batch.SPI, result.getLocalmarketBatchResults()); - toolkitIdModificationsToSql.toSql(SampleActivity.SPI, result.getLogbookSampleActivityResults()); return toolkitIdModificationsToSql.build(); } catch (IOException e) { throw new IllegalStateException("Could not produce sql script to " + scriptPath, e); } } - private Set<ToolkitIdModifications> consolidateLogbookSampleActivities(Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight) { - Set<ToolkitIdModifications> result = new LinkedHashSet<>(); - if (trip.isWellEmpty() || trip.isSampleEmpty()) { - return result; - } - logbookSampleActivityConsolidateEngine.consolidateTrip(trip,speciesListForLogbookSampleActivityWeightedWeight, result); - return result; - } - private Set<ToolkitIdModifications> consolidateLocalmarketBatches(Trip trip, boolean failIfLengthWeightParameterNotFound) { ReferentialLocale referenceLocale = context.getReferentialLocale(); Set<ToolkitIdModifications> result = new LinkedHashSet<>(); @@ -237,4 +231,25 @@ public class TripConsolidateEngine { return result; } + private Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> consolidateLogbookSamples(Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, Set<String> speciesListForLogbookSampleWeights) { + Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> result = new LinkedHashSet<>(); + if (trip.isWellEmpty() || trip.isSampleEmpty()) { + return result; + } + int sampleIndex = 0; + int sampleMax = trip.getSampleSize(); + Decorator sampleDecorator = context.getDecoratorService().getDecoratorByType(fr.ird.observe.entities.data.ps.logbook.Sample.class); + for (fr.ird.observe.entities.data.ps.logbook.Sample sample : trip.getSample()) { + sample.registerDecorator(sampleDecorator); + String routePrefix = String.format("Logbook - Sample %s [%s/%s] ", sample, ++sampleIndex, sampleMax); + log.debug("{} Start consolidate sample: {}", routePrefix, sample.getTopiaId()); + Optional<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> sampleResult = logbookSampleConsolidateEngine.consolidateSample(trip, + sample, + speciesListForLogbookSampleActivityWeightedWeight, + speciesListForLogbookSampleWeights); + sampleResult.ifPresent(result::add); + } + return result; + } + } ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleActivityConsolidateContext.java ===================================== @@ -48,13 +48,13 @@ public class SampleActivityConsolidateContext implements ConsolidateContext<Samp private final Decorator decorator; private final Set<Well> tripWell; private final Set<String> speciesListForLogbookSampleActivityWeightedWeight; - private final Set<ToolkitIdModifications> resultBuilder; + private final SampleConsolidateResultBuilder resultBuilder; private final java.util.Set<String> warnings = new LinkedHashSet<>(); private final Set<String> sampledWellIds; private Sample sample; private SampleActivity datum; - public SampleActivityConsolidateContext(JavaBeanMonitor monitor, Decorator decorator, Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, Set<ToolkitIdModifications> resultBuilder) { + public SampleActivityConsolidateContext(JavaBeanMonitor monitor, Decorator decorator, Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, SampleConsolidateResultBuilder resultBuilder) { this.monitor = monitor; this.decorator = decorator; this.tripWell = trip.getWell(); @@ -80,10 +80,10 @@ public class SampleActivityConsolidateContext implements ConsolidateContext<Samp public void flush() { if (monitor.wasModified()) { datum.registerDecorator(decorator); - monitor.toModifications(modifications -> new ToolkitIdModifications(datum, modifications, warnings.isEmpty() ? null : warnings)).ifPresent(resultBuilder::add); + monitor.toModifications(modifications -> new ToolkitIdModifications(datum, modifications, warnings.isEmpty() ? null : warnings)).ifPresent(resultBuilder::flushSampleActivityModification); } else if (!warnings.isEmpty()) { datum.registerDecorator(decorator); - resultBuilder.add(new ToolkitIdModifications(datum, java.util.Set.of(), java.util.Set.copyOf(warnings))); + resultBuilder.flushSampleActivityModification(new ToolkitIdModifications(datum, java.util.Set.of(), java.util.Set.copyOf(warnings))); } monitor.setBean(null); this.datum = null; ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleActivityConsolidateEngine.java → core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateActions.java ===================================== @@ -4,7 +4,7 @@ package fr.ird.observe.consolidation.data.ps.logbook; * #%L * ObServe Core :: Persistence :: Consolidation * %% - * Copyright (C) 2008 - 2023 IRD, Ultreia.io + * Copyright (C) 2008 - 2024 IRD, 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 @@ -22,45 +22,43 @@ package fr.ird.observe.consolidation.data.ps.logbook; * #L% */ -import fr.ird.observe.decoration.DecoratorService; -import fr.ird.observe.dto.ToolkitIdModifications; -import fr.ird.observe.entities.data.ps.common.Trip; +import fr.ird.observe.consolidation.AtomicConsolidateAction; import fr.ird.observe.entities.data.ps.logbook.Sample; -import fr.ird.observe.entities.data.ps.logbook.SampleActivity; -import io.ultreia.java4all.bean.monitor.JavaBeanMonitor; -import io.ultreia.java4all.decoration.Decorator; +import java.util.List; import java.util.Set; /** - * Created on 14/04/2023. + * Created at 12/09/2024. * * @author Tony Chemit - dev@tchemit.fr - * @since 9.1.0 + * @since 9.4.0 */ -public class SampleActivityConsolidateEngine { - private final JavaBeanMonitor monitor; - private final Decorator decorator; +public enum SampleConsolidateActions implements AtomicConsolidateAction<SampleConsolidateContext, Sample> { - public SampleActivityConsolidateEngine(DecoratorService decoratorService) { - this.monitor = new JavaBeanMonitor(SampleActivity.PROPERTY_WEIGHTED_WEIGHT, SampleActivity.PROPERTY_WEIGHTED_WEIGHT_COMPUTED); - this.decorator = decoratorService.getDecoratorByType(SampleActivity.class); - } + /** + * Compute {@code Sample#weights}. + */ + ComputeWeights() { + @Override + public List<String> fieldNames() { + return List.of(Sample.PROPERTY_BIGS_WEIGHT, Sample.PROPERTY_SMALLS_WEIGHT, Sample.PROPERTY_TOTAL_WEIGHT, Sample.PROPERTY_WEIGHTS_COMPUTED); + } - public void consolidateTrip(Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, Set<ToolkitIdModifications> resultBuilder) { - SampleActivityConsolidateContext context = new SampleActivityConsolidateContext(monitor, decorator, trip, speciesListForLogbookSampleActivityWeightedWeight,resultBuilder); - for (Sample sample : trip.getSample()) { - if (sample.isSampleActivityEmpty()) { - continue; - } - for (SampleActivity sampleActivity : sample.getSampleActivity()) { - try { - context.watch(sample, sampleActivity); - SampleActivityConsolidateActions.ComputeWeightedWeight.execute(context, sampleActivity); - } finally { - context.flush(); - } - } + @Override + public boolean test(SampleConsolidateContext context, Sample datum) { + return datum.isWeightsComputed() || (datum.getBigsWeight() == null && datum.getSmallsWeight() == null && datum.getTotalWeight() == null); } + + @Override + public void accept(SampleConsolidateContext context, Sample datum) { + Set<String> speciesList = context.getSpeciesListForLogbookSampleWeights(); + //datum.setWeightsComputed(true); + } + }; + + @Override + public String toString() { + return "ps.logbook." + SampleConsolidateActions.class.getSimpleName() + "." + name(); } } ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateContext.java ===================================== @@ -0,0 +1,107 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: Persistence :: Consolidation + * %% + * Copyright (C) 2008 - 2024 IRD, 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.consolidation.ConsolidateContext; +import fr.ird.observe.dto.ToolkitIdModifications; +import fr.ird.observe.entities.data.ps.common.Trip; +import fr.ird.observe.entities.data.ps.logbook.Sample; +import fr.ird.observe.entities.data.ps.logbook.Well; +import io.ultreia.java4all.bean.monitor.JavaBeanMonitor; +import io.ultreia.java4all.decoration.Decorator; + +import java.util.LinkedHashSet; +import java.util.Objects; +import java.util.Set; +import java.util.function.ToDoubleFunction; +import java.util.stream.Collectors; + +/** + * Created at 12/09/2024. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.4.0 + */ +public class SampleConsolidateContext implements ConsolidateContext<Sample> { + private final JavaBeanMonitor monitor; + private final Decorator decorator; + private final Set<Well> tripWell; + private final Set<String> speciesListForLogbookSampleWeights; + private final SampleConsolidateResultBuilder resultBuilder; + private final java.util.Set<String> warnings = new LinkedHashSet<>(); + private final Set<String> sampledWellIds; + private Sample datum; + + public SampleConsolidateContext(JavaBeanMonitor monitor, + Decorator decorator, + Trip trip, + Set<String> speciesListForLogbookSampleWeights, + SampleConsolidateResultBuilder resultBuilder) { + this.monitor = monitor; + this.decorator = decorator; + this.tripWell = trip.getWell(); + this.sampledWellIds = trip.getSample().stream().map(Sample::getWell).collect(Collectors.toSet()); + this.speciesListForLogbookSampleWeights = speciesListForLogbookSampleWeights; + this.resultBuilder = resultBuilder; + } + + public Set<String> getSampledWellIds() { + return sampledWellIds; + } + + public Set<String> getSpeciesListForLogbookSampleWeights() { + return speciesListForLogbookSampleWeights; + } + + public void watch(Sample datum) { + this.datum = Objects.requireNonNull(datum); + monitor.setBean(datum); + } + + public void flush() { + if (monitor.wasModified()) { + datum.registerDecorator(decorator); + monitor.toModifications(modifications -> new ToolkitIdModifications(datum, modifications, warnings.isEmpty() ? null : warnings)).ifPresent(resultBuilder::flushModification); + } else if (!warnings.isEmpty()) { + datum.registerDecorator(decorator); + resultBuilder.flushModification(new ToolkitIdModifications(datum, java.util.Set.of(), java.util.Set.copyOf(warnings))); + } + monitor.setBean(null); + this.datum = null; + warnings.clear(); + } + + public double sumOnTripWell(ToDoubleFunction<Well> function) { + return tripWell.stream().mapToDouble(function).sum(); + } + + @Override + public JavaBeanMonitor monitor() { + return monitor; + } + + @Override + public Class<Sample> dataType() { + return Sample.class; + } +} ===================================== core/persistence/consolidation/src/main/java/fr/ird/observe/consolidation/data/ps/logbook/SampleConsolidateEngine.java ===================================== @@ -0,0 +1,105 @@ +package fr.ird.observe.consolidation.data.ps.logbook; + +/*- + * #%L + * ObServe Core :: Persistence :: Consolidation + * %% + * Copyright (C) 2008 - 2023 IRD, 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.decoration.DecoratorService; +import fr.ird.observe.entities.data.ps.common.Trip; +import fr.ird.observe.entities.data.ps.logbook.Sample; +import fr.ird.observe.entities.data.ps.logbook.SampleActivity; +import fr.ird.observe.spi.consolidation.ToolkitIdModificationsToSql; +import io.ultreia.java4all.bean.monitor.JavaBeanMonitor; +import io.ultreia.java4all.decoration.Decorator; + +import java.util.Optional; +import java.util.Set; + +/** + * Created on 14/04/2023. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.1.0 + */ +public class SampleConsolidateEngine { + private final JavaBeanMonitor sampleMonitor; + private final JavaBeanMonitor sampleActivityMonitor; + private final Decorator sampleDecorator; + private final Decorator sampleActivityDecorator; + + public SampleConsolidateEngine(DecoratorService decoratorService) { + this.sampleMonitor = new JavaBeanMonitor(Sample.PROPERTY_BIGS_WEIGHT, Sample.PROPERTY_SMALLS_WEIGHT, Sample.PROPERTY_TOTAL_WEIGHT, Sample.PROPERTY_WEIGHTS_COMPUTED); + this.sampleActivityMonitor = new JavaBeanMonitor(SampleActivity.PROPERTY_WEIGHTED_WEIGHT, SampleActivity.PROPERTY_WEIGHTED_WEIGHT_COMPUTED); + this.sampleDecorator = decoratorService.getDecoratorByType(Sample.class); + this.sampleActivityDecorator = decoratorService.getDecoratorByType(SampleActivity.class); + } + + public void toSql(java.util.Set<SampleConsolidateResult> samplesResults, ToolkitIdModificationsToSql toolkitIdModificationsToSql) { + for (SampleConsolidateResult sampleConsolidateResult : samplesResults) { + toolkitIdModificationsToSql.toSql(Sample.SPI, sampleConsolidateResult.getModifications()); + toolkitIdModificationsToSql.toSql(SampleActivity.SPI, sampleConsolidateResult.getSampleActivityModifications()); + } + } + + public Optional<SampleConsolidateResult> consolidateSample(Trip trip, + Sample sample, + Set<String> speciesListForLogbookSampleActivityWeightedWeight, + Set<String> speciesListForLogbookSampleWeights) { + SampleConsolidateResultBuilder resultBuilder = new SampleConsolidateResultBuilder(sample.getId(), sampleDecorator.decorate(sample)); + SampleConsolidateContext sampleConsolidateContext = new SampleConsolidateContext(sampleMonitor, + sampleDecorator, + trip, + speciesListForLogbookSampleWeights, + resultBuilder); + consolidateSample(sampleConsolidateContext, sample); + if (sample.isSampleActivityNotEmpty()) { + SampleActivityConsolidateContext sampleActivityConsolidateContext = new SampleActivityConsolidateContext(sampleActivityMonitor, + sampleActivityDecorator, + trip, + speciesListForLogbookSampleActivityWeightedWeight, + resultBuilder); + + for (SampleActivity sampleActivity : sample.getSampleActivity()) { + consolidateSampleActivity(sampleActivityConsolidateContext, sample, sampleActivity); + } + } + return resultBuilder.build(); + } + + private void consolidateSample(SampleConsolidateContext context, Sample sample) { + try { + context.watch(sample); + SampleConsolidateActions.ComputeWeights.execute(context, sample); + } finally { + context.flush(); + } + } + + private void consolidateSampleActivity(SampleActivityConsolidateContext context, Sample sample, SampleActivity sampleActivity) { + + try { + context.watch(sample, sampleActivity); + SampleActivityConsolidateActions.ComputeWeightedWeight.execute(context, sampleActivity); + } finally { + context.flush(); + } + } +} ===================================== core/services/test/src/main/java/fr/ird/observe/services/service/data/ps/ConsolidateDataServiceFixtures.java ===================================== @@ -206,14 +206,15 @@ public class ConsolidateDataServiceFixtures extends GeneratedConsolidateDataServ request.setTripId(getProperty("consolidateTrip.id")); request.setFailIfLengthWeightParameterNotFound(false); request.setSpeciesListForLogbookSampleActivityWeightedWeight(getProperty("consolidateTrip.speciesListForLogbookSampleActivityWeightedWeight")); + request.setSpeciesListForLogbookSampleWeights(getProperty("consolidateTrip.speciesListForLogbookSampleWeights")); TripConsolidateResult actual = service.consolidateTrip(simplifiedObjectTypeSpecializedRules, request); Assert.assertNotNull(actual); Assert.assertNotNull(actual.getActivityObservationResults()); Assert.assertNotNull(actual.getActivityLogbookResults()); - Assert.assertNotNull(actual.getLogbookSampleActivityResults()); + Assert.assertNotNull(actual.getLogbookSampleResults()); Assert.assertEquals(getIntegerProperty("consolidateTrip.logbookActivity.count"), actual.getActivityLogbookResults().size()); - Assert.assertEquals(getIntegerProperty("consolidateTrip.logbookSampleActivity.count"), actual.getLogbookSampleActivityResults().size()); + Assert.assertEquals(getIntegerProperty("consolidateTrip.logbookSampleActivity.count"), actual.getLogbookSampleResults().size()); Assert.assertEquals(getIntegerProperty("consolidateTrip.observationsActivityResult.count"), actual.getActivityObservationResults().size()); Assert.assertEquals(getIntegerProperty("consolidateTrip.observationsActivityResult.withModifications.count"), actual.getActivityObservationResults().stream().filter(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withModifications).count()); Assert.assertEquals(getIntegerProperty("consolidateTrip.observationsActivityResult.withWarnings.count"), actual.getActivityObservationResults().stream().filter(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withWarnings).count()); ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/data/ps/ConsolidateDataService.properties ===================================== @@ -30,3 +30,4 @@ consolidateTrip.observationsActivityResult.count=4 consolidateTrip.observationsActivityResult.withModifications.count=4 consolidateTrip.observationsActivityResult.withWarnings.count=4 consolidateTrip.speciesListForLogbookSampleActivityWeightedWeight=fr.ird.referential.common.SpeciesList#1464000000000#100 +consolidateTrip.speciesListForLogbookSampleWeights=fr.ird.referential.common.SpeciesList#1464000000000#101 View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/a502e4d0f7fcfa03ac3cb1f43a... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/commit/a502e4d0f7fcfa03ac3cb1f43a... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)