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
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:
| ... | ... | @@ -38,6 +38,7 @@ import fr.ird.observe.dto.ToolkitIdModifications; |
| 38 | 38 | import fr.ird.observe.dto.data.TripAware;
|
| 39 | 39 | import fr.ird.observe.dto.data.ps.localmarket.BatchDto;
|
| 40 | 40 | import fr.ird.observe.dto.data.ps.logbook.SampleActivityDto;
|
| 41 | +import fr.ird.observe.dto.data.ps.logbook.SampleDto;
|
|
| 41 | 42 | import fr.ird.observe.dto.data.ps.observation.CatchDto;
|
| 42 | 43 | import fr.ird.observe.dto.data.ps.observation.FloatingObjectDto;
|
| 43 | 44 | import fr.ird.observe.dto.data.ps.observation.SampleMeasureDto;
|
| ... | ... | @@ -195,8 +196,8 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { |
| 195 | 196 | for (fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult activityResult : result.getActivityLogbookResults()) {
|
| 196 | 197 | printResult(activityResult);
|
| 197 | 198 | }
|
| 198 | - for (ToolkitIdModifications modifications : result.getLogbookSampleActivityResults()) {
|
|
| 199 | - printResult(SampleActivityDto.class, modifications);
|
|
| 199 | + for (fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult sampleResult : result.getLogbookSampleResults()) {
|
|
| 200 | + printResult(sampleResult);
|
|
| 200 | 201 | }
|
| 201 | 202 | for (ToolkitIdModifications batchResult : result.getLocalmarketBatchResults()) {
|
| 202 | 203 | printResult(BatchDto.class, batchResult);
|
| ... | ... | @@ -234,6 +235,19 @@ public class Start extends AdminTabUIActionSupport<ConsolidateUI> { |
| 234 | 235 | }
|
| 235 | 236 | }
|
| 236 | 237 | |
| 238 | + void printResult(fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult sampleResult) {
|
|
| 239 | + if (sampleResult.withModifications()) {
|
|
| 240 | + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification", sampleResult.getSampleId(), sampleResult.getSampleLabel()));
|
|
| 241 | + }
|
|
| 242 | + if (sampleResult.withWarnings()) {
|
|
| 243 | + sendMessage(" " + t("observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning", sampleResult.getSampleId(), sampleResult.getSampleLabel()));
|
|
| 244 | + }
|
|
| 245 | + printResult(SampleDto.class, sampleResult.getModifications());
|
|
| 246 | + for (ToolkitIdModifications modification : sampleResult.getSampleActivityModifications()) {
|
|
| 247 | + printResult(SampleActivityDto.class, modification);
|
|
| 248 | + }
|
|
| 249 | + }
|
|
| 250 | + |
|
| 237 | 251 | private void printResult(Class<? extends BusinessDto> dataType, ToolkitIdModifications modifications) {
|
| 238 | 252 | if (modifications == null) {
|
| 239 | 253 | return;
|
| ... | ... | @@ -510,6 +510,8 @@ observe.ui.datasource.editor.actions.consolidate.description=Consolidate observe |
| 510 | 510 | observe.ui.datasource.editor.actions.consolidate.end.trip=End consolidate data on trip %s / %s (%s) [duration\: %s]
|
| 511 | 511 | observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s
|
| 512 | 512 | observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s
|
| 513 | +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification=Some data were computed for Logbook sample [%s] %s
|
|
| 514 | +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning=Some warnings were found for Logbook sample [%s] %s
|
|
| 513 | 515 | observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s
|
| 514 | 516 | observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Property %s, old value\: %s - new value\: %s
|
| 515 | 517 | observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s
|
| ... | ... | @@ -508,11 +508,13 @@ observe.ui.datasource.editor.actions.consolidate=Calcular los datos |
| 508 | 508 | observe.ui.datasource.editor.actions.consolidate.config=Consolidate data configuration
|
| 509 | 509 | observe.ui.datasource.editor.actions.consolidate.description=Calcular los datos que no fueron observados
|
| 510 | 510 | observe.ui.datasource.editor.actions.consolidate.end.trip=End consolidate data on trip %s / %s (%s) [duration\: %s] \#TODO
|
| 511 | -observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s
|
|
| 512 | -observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s
|
|
| 513 | -observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s
|
|
| 511 | +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.modification=Some data were computed for Logbook sample [%s] %s \#TODO
|
|
| 512 | +observe.ui.datasource.editor.actions.consolidate.message.logbook.sample.warning=Some warnings were found for Logbook sample [%s] %s \#TODO
|
|
| 513 | +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.modification=Some data were computed for Logbook activity [%s] %s \#TODO
|
|
| 514 | +observe.ui.datasource.editor.actions.consolidate.message.logbook.activity.warning=Some warnings were found for Logbook activity [%s] %s \#TODO
|
|
| 515 | +observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d change(s) for data of type %s [%s] %s \#TODO
|
|
| 514 | 516 | observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Property %s, old value\: %s - new value\: %s \#TODO
|
| 515 | -observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s
|
|
| 517 | +observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d warning(s) for data of type %s [%s] %s \#TODO
|
|
| 516 | 518 | observe.ui.datasource.editor.actions.consolidate.message.noChanges=No modificación de datos.
|
| 517 | 519 | observe.ui.datasource.editor.actions.consolidate.message.observation.activity.modification=Some data were computed for Observations activity [%s] %s
|
| 518 | 520 | observe.ui.datasource.editor.actions.consolidate.message.observation.activity.warning=Some warnings were found for Observations activity [%s] %s
|
| ... | ... | @@ -509,7 +509,9 @@ observe.ui.datasource.editor.actions.consolidate.config=Configuration de la cons |
| 509 | 509 | observe.ui.datasource.editor.actions.consolidate.description=Calculer les données non observées
|
| 510 | 510 | observe.ui.datasource.editor.actions.consolidate.end.trip=Consolidation terminée pour la marée %s / %s (%s) [durée \: %s]
|
| 511 | 511 | 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
|
| 512 | -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
|
|
| 512 | +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
|
|
| 513 | +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
|
|
| 514 | +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
|
|
| 513 | 515 | observe.ui.datasource.editor.actions.consolidate.message.modifications.modification=%d modification(s) pour la donnée de type %s [%s] %s
|
| 514 | 516 | observe.ui.datasource.editor.actions.consolidate.message.modifications.property=Propriété %s, ancienne valeur \: %s - nouvelle valeur \: %s
|
| 515 | 517 | observe.ui.datasource.editor.actions.consolidate.message.modifications.warning=%d avertissement(s) pour la donnée de type %s [%s] %s
|
| ... | ... | @@ -49,6 +49,8 @@ public class TripConsolidateRequest implements JsonAware { |
| 49 | 49 | |
| 50 | 50 | private String speciesListForLogbookSampleActivityWeightedWeight;
|
| 51 | 51 | |
| 52 | + private String speciesListForLogbookSampleWeights;
|
|
| 53 | + |
|
| 52 | 54 | public boolean isFailIfLengthWeightParameterNotFound() {
|
| 53 | 55 | return failIfLengthWeightParameterNotFound;
|
| 54 | 56 | }
|
| ... | ... | @@ -80,4 +82,12 @@ public class TripConsolidateRequest implements JsonAware { |
| 80 | 82 | public void setSpeciesListForLogbookSampleActivityWeightedWeight(String speciesListForLogbookSampleActivityWeightedWeight) {
|
| 81 | 83 | this.speciesListForLogbookSampleActivityWeightedWeight = speciesListForLogbookSampleActivityWeightedWeight;
|
| 82 | 84 | }
|
| 85 | + |
|
| 86 | + public String getSpeciesListForLogbookSampleWeights() {
|
|
| 87 | + return speciesListForLogbookSampleWeights;
|
|
| 88 | + }
|
|
| 89 | + |
|
| 90 | + public void setSpeciesListForLogbookSampleWeights(String speciesListForLogbookSampleWeights) {
|
|
| 91 | + this.speciesListForLogbookSampleWeights = speciesListForLogbookSampleWeights;
|
|
| 92 | + }
|
|
| 83 | 93 | } |
| ... | ... | @@ -23,6 +23,8 @@ package fr.ird.observe.consolidation.data.ps.common; |
| 23 | 23 | */
|
| 24 | 24 | |
| 25 | 25 | |
| 26 | +import fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult;
|
|
| 27 | +import fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult;
|
|
| 26 | 28 | import fr.ird.observe.dto.ToolkitIdModifications;
|
| 27 | 29 | import io.ultreia.java4all.util.json.JsonAware;
|
| 28 | 30 | |
| ... | ... | @@ -54,9 +56,9 @@ public class TripConsolidateResult implements JsonAware { |
| 54 | 56 | */
|
| 55 | 57 | protected final Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityLogbookResults;
|
| 56 | 58 | /**
|
| 57 | - * Logbook sample activities results.
|
|
| 59 | + * Logbook sample results.
|
|
| 58 | 60 | */
|
| 59 | - private final Set<ToolkitIdModifications> logbookSampleActivityResults;
|
|
| 61 | + private final Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> logbookSampleResults;
|
|
| 60 | 62 | /**
|
| 61 | 63 | * Local market batches results.
|
| 62 | 64 | */
|
| ... | ... | @@ -64,15 +66,15 @@ public class TripConsolidateResult implements JsonAware { |
| 64 | 66 | |
| 65 | 67 | public TripConsolidateResult(String tripId,
|
| 66 | 68 | String tripLabel,
|
| 67 | - Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> activityObservationResults,
|
|
| 69 | + Set<ActivityConsolidateResult> activityObservationResults,
|
|
| 68 | 70 | Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> activityLogbookResults,
|
| 69 | - Set<ToolkitIdModifications> logbookSampleActivityResults,
|
|
| 71 | + Set<SampleConsolidateResult> logbookSampleResults,
|
|
| 70 | 72 | Set<ToolkitIdModifications> localmarketBatchResults) {
|
| 71 | 73 | this.tripId = tripId;
|
| 72 | 74 | this.tripLabel = tripLabel;
|
| 73 | 75 | this.activityObservationResults = activityObservationResults;
|
| 74 | 76 | this.activityLogbookResults = activityLogbookResults;
|
| 75 | - this.logbookSampleActivityResults = logbookSampleActivityResults;
|
|
| 77 | + this.logbookSampleResults = logbookSampleResults;
|
|
| 76 | 78 | this.localmarketBatchResults = localmarketBatchResults;
|
| 77 | 79 | }
|
| 78 | 80 | |
| ... | ... | @@ -92,8 +94,8 @@ public class TripConsolidateResult implements JsonAware { |
| 92 | 94 | return activityLogbookResults;
|
| 93 | 95 | }
|
| 94 | 96 | |
| 95 | - public Set<ToolkitIdModifications> getLogbookSampleActivityResults() {
|
|
| 96 | - return logbookSampleActivityResults;
|
|
| 97 | + public Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> getLogbookSampleResults() {
|
|
| 98 | + return logbookSampleResults;
|
|
| 97 | 99 | }
|
| 98 | 100 | |
| 99 | 101 | public Set<ToolkitIdModifications> getLocalmarketBatchResults() {
|
| ... | ... | @@ -103,14 +105,14 @@ public class TripConsolidateResult implements JsonAware { |
| 103 | 105 | public boolean withModifications() {
|
| 104 | 106 | return activityObservationResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withModifications) ||
|
| 105 | 107 | activityLogbookResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult::withModifications) ||
|
| 106 | - logbookSampleActivityResults.stream().anyMatch(ToolkitIdModifications::withModifications) ||
|
|
| 108 | + logbookSampleResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult::withModifications) ||
|
|
| 107 | 109 | localmarketBatchResults.stream().anyMatch(ToolkitIdModifications::withModifications);
|
| 108 | 110 | }
|
| 109 | 111 | |
| 110 | 112 | public boolean withWarnings() {
|
| 111 | 113 | return activityObservationResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withWarnings) ||
|
| 112 | 114 | activityLogbookResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult::withWarnings) ||
|
| 113 | - logbookSampleActivityResults.stream().anyMatch(ToolkitIdModifications::withWarnings) ||
|
|
| 115 | + logbookSampleResults.stream().anyMatch(fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult::withWarnings) ||
|
|
| 114 | 116 | localmarketBatchResults.stream().anyMatch(ToolkitIdModifications::withWarnings);
|
| 115 | 117 | }
|
| 116 | 118 | } |
| 1 | +package fr.ird.observe.consolidation.data.ps.logbook;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Core :: API :: Dto Consolidation
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import fr.ird.observe.dto.ToolkitIdModifications;
|
|
| 26 | +import io.ultreia.java4all.util.json.JsonAware;
|
|
| 27 | + |
|
| 28 | +import java.util.Set;
|
|
| 29 | + |
|
| 30 | +/**
|
|
| 31 | + * Created at 12/09/2024.
|
|
| 32 | + *
|
|
| 33 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 34 | + * @since 9.4.0
|
|
| 35 | + */
|
|
| 36 | +public class SampleConsolidateResult implements JsonAware {
|
|
| 37 | + |
|
| 38 | + /**
|
|
| 39 | + * Id of sample.
|
|
| 40 | + */
|
|
| 41 | + protected String sampleId;
|
|
| 42 | + |
|
| 43 | + /**
|
|
| 44 | + * Label of sample.
|
|
| 45 | + */
|
|
| 46 | + private String sampleLabel;
|
|
| 47 | + |
|
| 48 | + |
|
| 49 | + /**
|
|
| 50 | + * All modifications on the sample (can be null if there is no modification on it).
|
|
| 51 | + */
|
|
| 52 | + private ToolkitIdModifications modifications;
|
|
| 53 | + /**
|
|
| 54 | + * All modification on sample activities.
|
|
| 55 | + */
|
|
| 56 | + private Set<ToolkitIdModifications> sampleActivityModifications;
|
|
| 57 | + |
|
| 58 | + public String getSampleId() {
|
|
| 59 | + return sampleId;
|
|
| 60 | + }
|
|
| 61 | + |
|
| 62 | + public void setSampleId(String sampleId) {
|
|
| 63 | + this.sampleId = sampleId;
|
|
| 64 | + }
|
|
| 65 | + |
|
| 66 | + public String getSampleLabel() {
|
|
| 67 | + return sampleLabel;
|
|
| 68 | + }
|
|
| 69 | + |
|
| 70 | + public void setSampleLabel(String sampleLabel) {
|
|
| 71 | + this.sampleLabel = sampleLabel;
|
|
| 72 | + }
|
|
| 73 | + |
|
| 74 | + public ToolkitIdModifications getModifications() {
|
|
| 75 | + return modifications;
|
|
| 76 | + }
|
|
| 77 | + |
|
| 78 | + public void setModifications(ToolkitIdModifications modifications) {
|
|
| 79 | + this.modifications = modifications;
|
|
| 80 | + }
|
|
| 81 | + |
|
| 82 | + public Set<ToolkitIdModifications> getSampleActivityModifications() {
|
|
| 83 | + return sampleActivityModifications;
|
|
| 84 | + }
|
|
| 85 | + |
|
| 86 | + public void setSampleActivityModifications(Set<ToolkitIdModifications> sampleActivityModifications) {
|
|
| 87 | + this.sampleActivityModifications = sampleActivityModifications;
|
|
| 88 | + }
|
|
| 89 | + |
|
| 90 | + public boolean withModifications() {
|
|
| 91 | + if (getModifications()!=null) {
|
|
| 92 | + return getModifications().withModifications();
|
|
| 93 | + }
|
|
| 94 | + if (getSampleActivityModifications() != null) {
|
|
| 95 | + for (ToolkitIdModifications modifications : getSampleActivityModifications()) {
|
|
| 96 | + if (modifications.withModifications()) {
|
|
| 97 | + return true;
|
|
| 98 | + }
|
|
| 99 | + }
|
|
| 100 | + }
|
|
| 101 | + return false;
|
|
| 102 | + }
|
|
| 103 | + |
|
| 104 | + public boolean withWarnings() {
|
|
| 105 | + if (getModifications()!=null) {
|
|
| 106 | + return getModifications().withWarnings();
|
|
| 107 | + }
|
|
| 108 | + if (getSampleActivityModifications() != null) {
|
|
| 109 | + for (ToolkitIdModifications modifications : getSampleActivityModifications()) {
|
|
| 110 | + if (modifications.withWarnings()) {
|
|
| 111 | + return true;
|
|
| 112 | + }
|
|
| 113 | + }
|
|
| 114 | + }
|
|
| 115 | + return false;
|
|
| 116 | + }
|
|
| 117 | +}
|
|
| 118 | + |
| 1 | +package fr.ird.observe.consolidation.data.ps.logbook;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Core :: API :: Dto Consolidation
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import fr.ird.observe.dto.ToolkitIdModifications;
|
|
| 26 | + |
|
| 27 | +import java.util.LinkedHashSet;
|
|
| 28 | +import java.util.Optional;
|
|
| 29 | +import java.util.Set;
|
|
| 30 | + |
|
| 31 | +/**
|
|
| 32 | + * Created at 12/09/2024.
|
|
| 33 | + *
|
|
| 34 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 35 | + * @since 9.4.0
|
|
| 36 | + */
|
|
| 37 | +public class SampleConsolidateResultBuilder {
|
|
| 38 | + private final Set<ToolkitIdModifications> sampleActivityModificationBuilder = new LinkedHashSet<>();
|
|
| 39 | + private final String sampleLabel;
|
|
| 40 | + private final String sampleId;
|
|
| 41 | + private ToolkitIdModifications modifications;
|
|
| 42 | + |
|
| 43 | + public SampleConsolidateResultBuilder(String sampleId, String sampleLabel) {
|
|
| 44 | + this.sampleId = sampleId;
|
|
| 45 | + this.sampleLabel = sampleLabel;
|
|
| 46 | + }
|
|
| 47 | + |
|
| 48 | + public Optional<SampleConsolidateResult> build() {
|
|
| 49 | + boolean noModification = sampleActivityModificationBuilder.isEmpty() && modifications == null;
|
|
| 50 | + if (noModification) {
|
|
| 51 | + return Optional.empty();
|
|
| 52 | + }
|
|
| 53 | + SampleConsolidateResult result = new SampleConsolidateResult();
|
|
| 54 | + result.setSampleId(sampleId);
|
|
| 55 | + result.setSampleLabel(sampleLabel);
|
|
| 56 | + result.setModifications(modifications);
|
|
| 57 | + result.setSampleActivityModifications(sampleActivityModificationBuilder);
|
|
| 58 | + return Optional.of(result);
|
|
| 59 | + }
|
|
| 60 | + |
|
| 61 | + public void flushModification(ToolkitIdModifications modifications) {
|
|
| 62 | + this.modifications = modifications;
|
|
| 63 | + }
|
|
| 64 | + |
|
| 65 | + public void flushSampleActivityModification(ToolkitIdModifications modifications) {
|
|
| 66 | + sampleActivityModificationBuilder.add(modifications);
|
|
| 67 | + }
|
|
| 68 | + |
|
| 69 | +}
|
|
| 70 | + |
| ... | ... | @@ -33,7 +33,6 @@ import fr.ird.observe.dto.referential.ReferentialLocale; |
| 33 | 33 | import fr.ird.observe.entities.ObserveTopiaDaoSupplier;
|
| 34 | 34 | import fr.ird.observe.entities.data.ps.common.Trip;
|
| 35 | 35 | import fr.ird.observe.entities.data.ps.localmarket.Batch;
|
| 36 | -import fr.ird.observe.entities.data.ps.logbook.SampleActivity;
|
|
| 37 | 36 | import fr.ird.observe.entities.referential.common.LengthLengthParameterCache;
|
| 38 | 37 | import fr.ird.observe.entities.referential.common.LengthWeightParameterCache;
|
| 39 | 38 | import fr.ird.observe.entities.referential.common.Species;
|
| ... | ... | @@ -66,7 +65,7 @@ public class TripConsolidateEngine { |
| 66 | 65 | private final BatchConsolidateEngine localmarketBatchEngine;
|
| 67 | 66 | private final fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateEngine observationActivityConsolidateEngine;
|
| 68 | 67 | private final fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateEngine logbookActivityConsolidateEngine;
|
| 69 | - private final fr.ird.observe.consolidation.data.ps.logbook.SampleActivityConsolidateEngine logbookSampleActivityConsolidateEngine;
|
|
| 68 | + private final fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateEngine logbookSampleConsolidateEngine;
|
|
| 70 | 69 | |
| 71 | 70 | public TripConsolidateEngine(ServiceContext context, SimplifiedObjectTypeManager simplifiedObjectTypeManager) {
|
| 72 | 71 | this.context = context;
|
| ... | ... | @@ -77,7 +76,7 @@ public class TripConsolidateEngine { |
| 77 | 76 | lengthWeightParameterCache,
|
| 78 | 77 | lengthLengthParameterCache);
|
| 79 | 78 | this.logbookActivityConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateEngine(context, simplifiedObjectTypeManager);
|
| 80 | - this.logbookSampleActivityConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.SampleActivityConsolidateEngine(context.getDecoratorService());
|
|
| 79 | + this.logbookSampleConsolidateEngine = new fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateEngine(context.getDecoratorService());
|
|
| 81 | 80 | this.localmarketBatchEngine = new BatchConsolidateEngine(new GetOptionalRtpMeanWeightImpl(context, lengthWeightParameterCache), context.getDecoratorService());
|
| 82 | 81 | }
|
| 83 | 82 | |
| ... | ... | @@ -91,22 +90,26 @@ public class TripConsolidateEngine { |
| 91 | 90 | |
| 92 | 91 | Trip trip = Trip.loadEntity(context, tripId);
|
| 93 | 92 | |
| 94 | - String speciesListId = request.getSpeciesListForLogbookSampleActivityWeightedWeight();
|
|
| 95 | - SpeciesList speciesList = SpeciesList.loadEntity(context, speciesListId);
|
|
| 96 | - Set<String> speciesListForLogbookSampleActivityWeightedWeight = speciesList.getSpecies().stream().map(Species ::getId).collect(Collectors.toSet());
|
|
| 97 | - Set<ToolkitIdModifications> logbookSampleActivityResults = consolidateLogbookSampleActivities(trip, speciesListForLogbookSampleActivityWeightedWeight);
|
|
| 93 | + String sampleActivitySpeciesListId = request.getSpeciesListForLogbookSampleActivityWeightedWeight();
|
|
| 94 | + String sampleSpeciesListId = request.getSpeciesListForLogbookSampleWeights();
|
|
| 95 | + SpeciesList sampleActivitySpeciesList = SpeciesList.loadEntity(context, sampleActivitySpeciesListId);
|
|
| 96 | + SpeciesList sampleSpeciesList = SpeciesList.loadEntity(context, sampleSpeciesListId);
|
|
| 97 | + Set<String> speciesListForLogbookSampleActivityWeightedWeight = sampleActivitySpeciesList.getSpecies().stream().map(Species ::getId).collect(Collectors.toSet());
|
|
| 98 | + Set<String> speciesListForLogbookSampleWeights = sampleSpeciesList.getSpecies().stream().map(Species ::getId).collect(Collectors.toSet());
|
|
| 99 | + |
|
| 100 | + Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> logbookSampleResults = consolidateLogbookSamples(trip, speciesListForLogbookSampleActivityWeightedWeight, speciesListForLogbookSampleWeights);
|
|
| 98 | 101 | Set<ToolkitIdModifications> localmarketBatchResults = consolidateLocalmarketBatches(trip, failIfLengthWeightParameterNotFound);
|
| 99 | 102 | |
| 100 | 103 | Set<fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult> observationActivityConsolidateResults = consolidateObservationActivities(trip, failIfLengthWeightParameterNotFound, failIfLengthLengthParameterNotFound);
|
| 101 | 104 | Set<fr.ird.observe.consolidation.data.ps.logbook.ActivityConsolidateResult> logbookActivityConsolidateResults = consolidateLogbookActivities(trip);
|
| 102 | 105 | |
| 103 | - if (logbookSampleActivityResults.isEmpty() && observationActivityConsolidateResults.isEmpty() && localmarketBatchResults.isEmpty() && logbookActivityConsolidateResults.isEmpty()) {
|
|
| 106 | + if (logbookSampleResults.isEmpty() && observationActivityConsolidateResults.isEmpty() && localmarketBatchResults.isEmpty() && logbookActivityConsolidateResults.isEmpty()) {
|
|
| 104 | 107 | // no modification, nor warning on this trip
|
| 105 | 108 | return Optional.empty();
|
| 106 | 109 | }
|
| 107 | 110 | decoratorService.installDecorator(Trip.class, trip);
|
| 108 | 111 | String tripLabel = trip.toString();
|
| 109 | - TripConsolidateResult result = new TripConsolidateResult(tripId, tripLabel, observationActivityConsolidateResults, logbookActivityConsolidateResults, logbookSampleActivityResults, localmarketBatchResults);
|
|
| 112 | + TripConsolidateResult result = new TripConsolidateResult(tripId, tripLabel, observationActivityConsolidateResults, logbookActivityConsolidateResults, logbookSampleResults, localmarketBatchResults);
|
|
| 110 | 113 | boolean withModifications = result.withModifications();
|
| 111 | 114 | if (withModifications) {
|
| 112 | 115 | log.info(String.format("Found some modifications on trip: %s - %s", tripId, result.getTripLabel()));
|
| ... | ... | @@ -131,23 +134,14 @@ public class TripConsolidateEngine { |
| 131 | 134 | try (ToolkitIdModificationsToSql toolkitIdModificationsToSql = new ToolkitIdModificationsToSql(scriptPath, context.timestampNow(), entitySqlModel)) {
|
| 132 | 135 | observationActivityConsolidateEngine.toSql(result.getActivityObservationResults(), toolkitIdModificationsToSql);
|
| 133 | 136 | logbookActivityConsolidateEngine.toSql(result.getActivityLogbookResults(), toolkitIdModificationsToSql);
|
| 137 | + logbookSampleConsolidateEngine.toSql(result.getLogbookSampleResults(), toolkitIdModificationsToSql);
|
|
| 134 | 138 | toolkitIdModificationsToSql.toSql(Batch.SPI, result.getLocalmarketBatchResults());
|
| 135 | - toolkitIdModificationsToSql.toSql(SampleActivity.SPI, result.getLogbookSampleActivityResults());
|
|
| 136 | 139 | return toolkitIdModificationsToSql.build();
|
| 137 | 140 | } catch (IOException e) {
|
| 138 | 141 | throw new IllegalStateException("Could not produce sql script to " + scriptPath, e);
|
| 139 | 142 | }
|
| 140 | 143 | }
|
| 141 | 144 | |
| 142 | - private Set<ToolkitIdModifications> consolidateLogbookSampleActivities(Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight) {
|
|
| 143 | - Set<ToolkitIdModifications> result = new LinkedHashSet<>();
|
|
| 144 | - if (trip.isWellEmpty() || trip.isSampleEmpty()) {
|
|
| 145 | - return result;
|
|
| 146 | - }
|
|
| 147 | - logbookSampleActivityConsolidateEngine.consolidateTrip(trip,speciesListForLogbookSampleActivityWeightedWeight, result);
|
|
| 148 | - return result;
|
|
| 149 | - }
|
|
| 150 | - |
|
| 151 | 145 | private Set<ToolkitIdModifications> consolidateLocalmarketBatches(Trip trip, boolean failIfLengthWeightParameterNotFound) {
|
| 152 | 146 | ReferentialLocale referenceLocale = context.getReferentialLocale();
|
| 153 | 147 | Set<ToolkitIdModifications> result = new LinkedHashSet<>();
|
| ... | ... | @@ -237,4 +231,25 @@ public class TripConsolidateEngine { |
| 237 | 231 | return result;
|
| 238 | 232 | }
|
| 239 | 233 | |
| 234 | + private Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> consolidateLogbookSamples(Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, Set<String> speciesListForLogbookSampleWeights) {
|
|
| 235 | + Set<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> result = new LinkedHashSet<>();
|
|
| 236 | + if (trip.isWellEmpty() || trip.isSampleEmpty()) {
|
|
| 237 | + return result;
|
|
| 238 | + }
|
|
| 239 | + int sampleIndex = 0;
|
|
| 240 | + int sampleMax = trip.getSampleSize();
|
|
| 241 | + Decorator sampleDecorator = context.getDecoratorService().getDecoratorByType(fr.ird.observe.entities.data.ps.logbook.Sample.class);
|
|
| 242 | + for (fr.ird.observe.entities.data.ps.logbook.Sample sample : trip.getSample()) {
|
|
| 243 | + sample.registerDecorator(sampleDecorator);
|
|
| 244 | + String routePrefix = String.format("Logbook - Sample %s [%s/%s] ", sample, ++sampleIndex, sampleMax);
|
|
| 245 | + log.debug("{} Start consolidate sample: {}", routePrefix, sample.getTopiaId());
|
|
| 246 | + Optional<fr.ird.observe.consolidation.data.ps.logbook.SampleConsolidateResult> sampleResult = logbookSampleConsolidateEngine.consolidateSample(trip,
|
|
| 247 | + sample,
|
|
| 248 | + speciesListForLogbookSampleActivityWeightedWeight,
|
|
| 249 | + speciesListForLogbookSampleWeights);
|
|
| 250 | + sampleResult.ifPresent(result::add);
|
|
| 251 | + }
|
|
| 252 | + return result;
|
|
| 253 | + }
|
|
| 254 | + |
|
| 240 | 255 | } |
| ... | ... | @@ -48,13 +48,13 @@ public class SampleActivityConsolidateContext implements ConsolidateContext<Samp |
| 48 | 48 | private final Decorator decorator;
|
| 49 | 49 | private final Set<Well> tripWell;
|
| 50 | 50 | private final Set<String> speciesListForLogbookSampleActivityWeightedWeight;
|
| 51 | - private final Set<ToolkitIdModifications> resultBuilder;
|
|
| 51 | + private final SampleConsolidateResultBuilder resultBuilder;
|
|
| 52 | 52 | private final java.util.Set<String> warnings = new LinkedHashSet<>();
|
| 53 | 53 | private final Set<String> sampledWellIds;
|
| 54 | 54 | private Sample sample;
|
| 55 | 55 | private SampleActivity datum;
|
| 56 | 56 | |
| 57 | - public SampleActivityConsolidateContext(JavaBeanMonitor monitor, Decorator decorator, Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, Set<ToolkitIdModifications> resultBuilder) {
|
|
| 57 | + public SampleActivityConsolidateContext(JavaBeanMonitor monitor, Decorator decorator, Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, SampleConsolidateResultBuilder resultBuilder) {
|
|
| 58 | 58 | this.monitor = monitor;
|
| 59 | 59 | this.decorator = decorator;
|
| 60 | 60 | this.tripWell = trip.getWell();
|
| ... | ... | @@ -80,10 +80,10 @@ public class SampleActivityConsolidateContext implements ConsolidateContext<Samp |
| 80 | 80 | public void flush() {
|
| 81 | 81 | if (monitor.wasModified()) {
|
| 82 | 82 | datum.registerDecorator(decorator);
|
| 83 | - monitor.toModifications(modifications -> new ToolkitIdModifications(datum, modifications, warnings.isEmpty() ? null : warnings)).ifPresent(resultBuilder::add);
|
|
| 83 | + monitor.toModifications(modifications -> new ToolkitIdModifications(datum, modifications, warnings.isEmpty() ? null : warnings)).ifPresent(resultBuilder::flushSampleActivityModification);
|
|
| 84 | 84 | } else if (!warnings.isEmpty()) {
|
| 85 | 85 | datum.registerDecorator(decorator);
|
| 86 | - resultBuilder.add(new ToolkitIdModifications(datum, java.util.Set.of(), java.util.Set.copyOf(warnings)));
|
|
| 86 | + resultBuilder.flushSampleActivityModification(new ToolkitIdModifications(datum, java.util.Set.of(), java.util.Set.copyOf(warnings)));
|
|
| 87 | 87 | }
|
| 88 | 88 | monitor.setBean(null);
|
| 89 | 89 | this.datum = null;
|
| ... | ... | @@ -4,7 +4,7 @@ package fr.ird.observe.consolidation.data.ps.logbook; |
| 4 | 4 | * #%L
|
| 5 | 5 | * ObServe Core :: Persistence :: Consolidation
|
| 6 | 6 | * %%
|
| 7 | - * Copyright (C) 2008 - 2023 IRD, Ultreia.io
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | 8 | * %%
|
| 9 | 9 | * This program is free software: you can redistribute it and/or modify
|
| 10 | 10 | * it under the terms of the GNU General Public License as
|
| ... | ... | @@ -22,45 +22,43 @@ package fr.ird.observe.consolidation.data.ps.logbook; |
| 22 | 22 | * #L%
|
| 23 | 23 | */
|
| 24 | 24 | |
| 25 | -import fr.ird.observe.decoration.DecoratorService;
|
|
| 26 | -import fr.ird.observe.dto.ToolkitIdModifications;
|
|
| 27 | -import fr.ird.observe.entities.data.ps.common.Trip;
|
|
| 25 | +import fr.ird.observe.consolidation.AtomicConsolidateAction;
|
|
| 28 | 26 | import fr.ird.observe.entities.data.ps.logbook.Sample;
|
| 29 | -import fr.ird.observe.entities.data.ps.logbook.SampleActivity;
|
|
| 30 | -import io.ultreia.java4all.bean.monitor.JavaBeanMonitor;
|
|
| 31 | -import io.ultreia.java4all.decoration.Decorator;
|
|
| 32 | 27 | |
| 28 | +import java.util.List;
|
|
| 33 | 29 | import java.util.Set;
|
| 34 | 30 | |
| 35 | 31 | /**
|
| 36 | - * Created on 14/04/2023.
|
|
| 32 | + * Created at 12/09/2024.
|
|
| 37 | 33 | *
|
| 38 | 34 | * @author Tony Chemit - dev@tchemit.fr
|
| 39 | - * @since 9.1.0
|
|
| 35 | + * @since 9.4.0
|
|
| 40 | 36 | */
|
| 41 | -public class SampleActivityConsolidateEngine {
|
|
| 42 | - private final JavaBeanMonitor monitor;
|
|
| 43 | - private final Decorator decorator;
|
|
| 37 | +public enum SampleConsolidateActions implements AtomicConsolidateAction<SampleConsolidateContext, Sample> {
|
|
| 44 | 38 | |
| 45 | - public SampleActivityConsolidateEngine(DecoratorService decoratorService) {
|
|
| 46 | - this.monitor = new JavaBeanMonitor(SampleActivity.PROPERTY_WEIGHTED_WEIGHT, SampleActivity.PROPERTY_WEIGHTED_WEIGHT_COMPUTED);
|
|
| 47 | - this.decorator = decoratorService.getDecoratorByType(SampleActivity.class);
|
|
| 48 | - }
|
|
| 39 | + /**
|
|
| 40 | + * Compute {@code Sample#weights}.
|
|
| 41 | + */
|
|
| 42 | + ComputeWeights() {
|
|
| 43 | + @Override
|
|
| 44 | + public List<String> fieldNames() {
|
|
| 45 | + return List.of(Sample.PROPERTY_BIGS_WEIGHT, Sample.PROPERTY_SMALLS_WEIGHT, Sample.PROPERTY_TOTAL_WEIGHT, Sample.PROPERTY_WEIGHTS_COMPUTED);
|
|
| 46 | + }
|
|
| 49 | 47 | |
| 50 | - public void consolidateTrip(Trip trip, Set<String> speciesListForLogbookSampleActivityWeightedWeight, Set<ToolkitIdModifications> resultBuilder) {
|
|
| 51 | - SampleActivityConsolidateContext context = new SampleActivityConsolidateContext(monitor, decorator, trip, speciesListForLogbookSampleActivityWeightedWeight,resultBuilder);
|
|
| 52 | - for (Sample sample : trip.getSample()) {
|
|
| 53 | - if (sample.isSampleActivityEmpty()) {
|
|
| 54 | - continue;
|
|
| 55 | - }
|
|
| 56 | - for (SampleActivity sampleActivity : sample.getSampleActivity()) {
|
|
| 57 | - try {
|
|
| 58 | - context.watch(sample, sampleActivity);
|
|
| 59 | - SampleActivityConsolidateActions.ComputeWeightedWeight.execute(context, sampleActivity);
|
|
| 60 | - } finally {
|
|
| 61 | - context.flush();
|
|
| 62 | - }
|
|
| 63 | - }
|
|
| 48 | + @Override
|
|
| 49 | + public boolean test(SampleConsolidateContext context, Sample datum) {
|
|
| 50 | + return datum.isWeightsComputed() || (datum.getBigsWeight() == null && datum.getSmallsWeight() == null && datum.getTotalWeight() == null);
|
|
| 64 | 51 | }
|
| 52 | + |
|
| 53 | + @Override
|
|
| 54 | + public void accept(SampleConsolidateContext context, Sample datum) {
|
|
| 55 | + Set<String> speciesList = context.getSpeciesListForLogbookSampleWeights();
|
|
| 56 | + //datum.setWeightsComputed(true);
|
|
| 57 | + }
|
|
| 58 | + };
|
|
| 59 | + |
|
| 60 | + @Override
|
|
| 61 | + public String toString() {
|
|
| 62 | + return "ps.logbook." + SampleConsolidateActions.class.getSimpleName() + "." + name();
|
|
| 65 | 63 | }
|
| 66 | 64 | } |
| 1 | +package fr.ird.observe.consolidation.data.ps.logbook;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Core :: Persistence :: Consolidation
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2024 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import fr.ird.observe.consolidation.ConsolidateContext;
|
|
| 26 | +import fr.ird.observe.dto.ToolkitIdModifications;
|
|
| 27 | +import fr.ird.observe.entities.data.ps.common.Trip;
|
|
| 28 | +import fr.ird.observe.entities.data.ps.logbook.Sample;
|
|
| 29 | +import fr.ird.observe.entities.data.ps.logbook.Well;
|
|
| 30 | +import io.ultreia.java4all.bean.monitor.JavaBeanMonitor;
|
|
| 31 | +import io.ultreia.java4all.decoration.Decorator;
|
|
| 32 | + |
|
| 33 | +import java.util.LinkedHashSet;
|
|
| 34 | +import java.util.Objects;
|
|
| 35 | +import java.util.Set;
|
|
| 36 | +import java.util.function.ToDoubleFunction;
|
|
| 37 | +import java.util.stream.Collectors;
|
|
| 38 | + |
|
| 39 | +/**
|
|
| 40 | + * Created at 12/09/2024.
|
|
| 41 | + *
|
|
| 42 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 43 | + * @since 9.4.0
|
|
| 44 | + */
|
|
| 45 | +public class SampleConsolidateContext implements ConsolidateContext<Sample> {
|
|
| 46 | + private final JavaBeanMonitor monitor;
|
|
| 47 | + private final Decorator decorator;
|
|
| 48 | + private final Set<Well> tripWell;
|
|
| 49 | + private final Set<String> speciesListForLogbookSampleWeights;
|
|
| 50 | + private final SampleConsolidateResultBuilder resultBuilder;
|
|
| 51 | + private final java.util.Set<String> warnings = new LinkedHashSet<>();
|
|
| 52 | + private final Set<String> sampledWellIds;
|
|
| 53 | + private Sample datum;
|
|
| 54 | + |
|
| 55 | + public SampleConsolidateContext(JavaBeanMonitor monitor,
|
|
| 56 | + Decorator decorator,
|
|
| 57 | + Trip trip,
|
|
| 58 | + Set<String> speciesListForLogbookSampleWeights,
|
|
| 59 | + SampleConsolidateResultBuilder resultBuilder) {
|
|
| 60 | + this.monitor = monitor;
|
|
| 61 | + this.decorator = decorator;
|
|
| 62 | + this.tripWell = trip.getWell();
|
|
| 63 | + this.sampledWellIds = trip.getSample().stream().map(Sample::getWell).collect(Collectors.toSet());
|
|
| 64 | + this.speciesListForLogbookSampleWeights = speciesListForLogbookSampleWeights;
|
|
| 65 | + this.resultBuilder = resultBuilder;
|
|
| 66 | + }
|
|
| 67 | + |
|
| 68 | + public Set<String> getSampledWellIds() {
|
|
| 69 | + return sampledWellIds;
|
|
| 70 | + }
|
|
| 71 | + |
|
| 72 | + public Set<String> getSpeciesListForLogbookSampleWeights() {
|
|
| 73 | + return speciesListForLogbookSampleWeights;
|
|
| 74 | + }
|
|
| 75 | + |
|
| 76 | + public void watch(Sample datum) {
|
|
| 77 | + this.datum = Objects.requireNonNull(datum);
|
|
| 78 | + monitor.setBean(datum);
|
|
| 79 | + }
|
|
| 80 | + |
|
| 81 | + public void flush() {
|
|
| 82 | + if (monitor.wasModified()) {
|
|
| 83 | + datum.registerDecorator(decorator);
|
|
| 84 | + monitor.toModifications(modifications -> new ToolkitIdModifications(datum, modifications, warnings.isEmpty() ? null : warnings)).ifPresent(resultBuilder::flushModification);
|
|
| 85 | + } else if (!warnings.isEmpty()) {
|
|
| 86 | + datum.registerDecorator(decorator);
|
|
| 87 | + resultBuilder.flushModification(new ToolkitIdModifications(datum, java.util.Set.of(), java.util.Set.copyOf(warnings)));
|
|
| 88 | + }
|
|
| 89 | + monitor.setBean(null);
|
|
| 90 | + this.datum = null;
|
|
| 91 | + warnings.clear();
|
|
| 92 | + }
|
|
| 93 | + |
|
| 94 | + public double sumOnTripWell(ToDoubleFunction<Well> function) {
|
|
| 95 | + return tripWell.stream().mapToDouble(function).sum();
|
|
| 96 | + }
|
|
| 97 | + |
|
| 98 | + @Override
|
|
| 99 | + public JavaBeanMonitor monitor() {
|
|
| 100 | + return monitor;
|
|
| 101 | + }
|
|
| 102 | + |
|
| 103 | + @Override
|
|
| 104 | + public Class<Sample> dataType() {
|
|
| 105 | + return Sample.class;
|
|
| 106 | + }
|
|
| 107 | +} |
| 1 | +package fr.ird.observe.consolidation.data.ps.logbook;
|
|
| 2 | + |
|
| 3 | +/*-
|
|
| 4 | + * #%L
|
|
| 5 | + * ObServe Core :: Persistence :: Consolidation
|
|
| 6 | + * %%
|
|
| 7 | + * Copyright (C) 2008 - 2023 IRD, Ultreia.io
|
|
| 8 | + * %%
|
|
| 9 | + * This program is free software: you can redistribute it and/or modify
|
|
| 10 | + * it under the terms of the GNU General Public License as
|
|
| 11 | + * published by the Free Software Foundation, either version 3 of the
|
|
| 12 | + * License, or (at your option) any later version.
|
|
| 13 | + *
|
|
| 14 | + * This program is distributed in the hope that it will be useful,
|
|
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| 17 | + * GNU General Public License for more details.
|
|
| 18 | + *
|
|
| 19 | + * You should have received a copy of the GNU General Public
|
|
| 20 | + * License along with this program. If not, see
|
|
| 21 | + * <http://www.gnu.org/licenses/gpl-3.0.html>.
|
|
| 22 | + * #L%
|
|
| 23 | + */
|
|
| 24 | + |
|
| 25 | +import fr.ird.observe.decoration.DecoratorService;
|
|
| 26 | +import fr.ird.observe.entities.data.ps.common.Trip;
|
|
| 27 | +import fr.ird.observe.entities.data.ps.logbook.Sample;
|
|
| 28 | +import fr.ird.observe.entities.data.ps.logbook.SampleActivity;
|
|
| 29 | +import fr.ird.observe.spi.consolidation.ToolkitIdModificationsToSql;
|
|
| 30 | +import io.ultreia.java4all.bean.monitor.JavaBeanMonitor;
|
|
| 31 | +import io.ultreia.java4all.decoration.Decorator;
|
|
| 32 | + |
|
| 33 | +import java.util.Optional;
|
|
| 34 | +import java.util.Set;
|
|
| 35 | + |
|
| 36 | +/**
|
|
| 37 | + * Created on 14/04/2023.
|
|
| 38 | + *
|
|
| 39 | + * @author Tony Chemit - dev@tchemit.fr
|
|
| 40 | + * @since 9.1.0
|
|
| 41 | + */
|
|
| 42 | +public class SampleConsolidateEngine {
|
|
| 43 | + private final JavaBeanMonitor sampleMonitor;
|
|
| 44 | + private final JavaBeanMonitor sampleActivityMonitor;
|
|
| 45 | + private final Decorator sampleDecorator;
|
|
| 46 | + private final Decorator sampleActivityDecorator;
|
|
| 47 | + |
|
| 48 | + public SampleConsolidateEngine(DecoratorService decoratorService) {
|
|
| 49 | + this.sampleMonitor = new JavaBeanMonitor(Sample.PROPERTY_BIGS_WEIGHT, Sample.PROPERTY_SMALLS_WEIGHT, Sample.PROPERTY_TOTAL_WEIGHT, Sample.PROPERTY_WEIGHTS_COMPUTED);
|
|
| 50 | + this.sampleActivityMonitor = new JavaBeanMonitor(SampleActivity.PROPERTY_WEIGHTED_WEIGHT, SampleActivity.PROPERTY_WEIGHTED_WEIGHT_COMPUTED);
|
|
| 51 | + this.sampleDecorator = decoratorService.getDecoratorByType(Sample.class);
|
|
| 52 | + this.sampleActivityDecorator = decoratorService.getDecoratorByType(SampleActivity.class);
|
|
| 53 | + }
|
|
| 54 | + |
|
| 55 | + public void toSql(java.util.Set<SampleConsolidateResult> samplesResults, ToolkitIdModificationsToSql toolkitIdModificationsToSql) {
|
|
| 56 | + for (SampleConsolidateResult sampleConsolidateResult : samplesResults) {
|
|
| 57 | + toolkitIdModificationsToSql.toSql(Sample.SPI, sampleConsolidateResult.getModifications());
|
|
| 58 | + toolkitIdModificationsToSql.toSql(SampleActivity.SPI, sampleConsolidateResult.getSampleActivityModifications());
|
|
| 59 | + }
|
|
| 60 | + }
|
|
| 61 | + |
|
| 62 | + public Optional<SampleConsolidateResult> consolidateSample(Trip trip,
|
|
| 63 | + Sample sample,
|
|
| 64 | + Set<String> speciesListForLogbookSampleActivityWeightedWeight,
|
|
| 65 | + Set<String> speciesListForLogbookSampleWeights) {
|
|
| 66 | + SampleConsolidateResultBuilder resultBuilder = new SampleConsolidateResultBuilder(sample.getId(), sampleDecorator.decorate(sample));
|
|
| 67 | + SampleConsolidateContext sampleConsolidateContext = new SampleConsolidateContext(sampleMonitor,
|
|
| 68 | + sampleDecorator,
|
|
| 69 | + trip,
|
|
| 70 | + speciesListForLogbookSampleWeights,
|
|
| 71 | + resultBuilder);
|
|
| 72 | + consolidateSample(sampleConsolidateContext, sample);
|
|
| 73 | + if (sample.isSampleActivityNotEmpty()) {
|
|
| 74 | + SampleActivityConsolidateContext sampleActivityConsolidateContext = new SampleActivityConsolidateContext(sampleActivityMonitor,
|
|
| 75 | + sampleActivityDecorator,
|
|
| 76 | + trip,
|
|
| 77 | + speciesListForLogbookSampleActivityWeightedWeight,
|
|
| 78 | + resultBuilder);
|
|
| 79 | + |
|
| 80 | + for (SampleActivity sampleActivity : sample.getSampleActivity()) {
|
|
| 81 | + consolidateSampleActivity(sampleActivityConsolidateContext, sample, sampleActivity);
|
|
| 82 | + }
|
|
| 83 | + }
|
|
| 84 | + return resultBuilder.build();
|
|
| 85 | + }
|
|
| 86 | + |
|
| 87 | + private void consolidateSample(SampleConsolidateContext context, Sample sample) {
|
|
| 88 | + try {
|
|
| 89 | + context.watch(sample);
|
|
| 90 | + SampleConsolidateActions.ComputeWeights.execute(context, sample);
|
|
| 91 | + } finally {
|
|
| 92 | + context.flush();
|
|
| 93 | + }
|
|
| 94 | + }
|
|
| 95 | + |
|
| 96 | + private void consolidateSampleActivity(SampleActivityConsolidateContext context, Sample sample, SampleActivity sampleActivity) {
|
|
| 97 | + |
|
| 98 | + try {
|
|
| 99 | + context.watch(sample, sampleActivity);
|
|
| 100 | + SampleActivityConsolidateActions.ComputeWeightedWeight.execute(context, sampleActivity);
|
|
| 101 | + } finally {
|
|
| 102 | + context.flush();
|
|
| 103 | + }
|
|
| 104 | + }
|
|
| 105 | +} |
| ... | ... | @@ -206,14 +206,15 @@ public class ConsolidateDataServiceFixtures extends GeneratedConsolidateDataServ |
| 206 | 206 | request.setTripId(getProperty("consolidateTrip.id"));
|
| 207 | 207 | request.setFailIfLengthWeightParameterNotFound(false);
|
| 208 | 208 | request.setSpeciesListForLogbookSampleActivityWeightedWeight(getProperty("consolidateTrip.speciesListForLogbookSampleActivityWeightedWeight"));
|
| 209 | + request.setSpeciesListForLogbookSampleWeights(getProperty("consolidateTrip.speciesListForLogbookSampleWeights"));
|
|
| 209 | 210 | |
| 210 | 211 | TripConsolidateResult actual = service.consolidateTrip(simplifiedObjectTypeSpecializedRules, request);
|
| 211 | 212 | Assert.assertNotNull(actual);
|
| 212 | 213 | Assert.assertNotNull(actual.getActivityObservationResults());
|
| 213 | 214 | Assert.assertNotNull(actual.getActivityLogbookResults());
|
| 214 | - Assert.assertNotNull(actual.getLogbookSampleActivityResults());
|
|
| 215 | + Assert.assertNotNull(actual.getLogbookSampleResults());
|
|
| 215 | 216 | Assert.assertEquals(getIntegerProperty("consolidateTrip.logbookActivity.count"), actual.getActivityLogbookResults().size());
|
| 216 | - Assert.assertEquals(getIntegerProperty("consolidateTrip.logbookSampleActivity.count"), actual.getLogbookSampleActivityResults().size());
|
|
| 217 | + Assert.assertEquals(getIntegerProperty("consolidateTrip.logbookSampleActivity.count"), actual.getLogbookSampleResults().size());
|
|
| 217 | 218 | Assert.assertEquals(getIntegerProperty("consolidateTrip.observationsActivityResult.count"), actual.getActivityObservationResults().size());
|
| 218 | 219 | Assert.assertEquals(getIntegerProperty("consolidateTrip.observationsActivityResult.withModifications.count"), actual.getActivityObservationResults().stream().filter(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withModifications).count());
|
| 219 | 220 | Assert.assertEquals(getIntegerProperty("consolidateTrip.observationsActivityResult.withWarnings.count"), actual.getActivityObservationResults().stream().filter(fr.ird.observe.consolidation.data.ps.observation.ActivityConsolidateResult::withWarnings).count());
|
| ... | ... | @@ -30,3 +30,4 @@ consolidateTrip.observationsActivityResult.count=4 |
| 30 | 30 | consolidateTrip.observationsActivityResult.withModifications.count=4
|
| 31 | 31 | consolidateTrip.observationsActivityResult.withWarnings.count=4
|
| 32 | 32 | consolidateTrip.speciesListForLogbookSampleActivityWeightedWeight=fr.ird.referential.common.SpeciesList#1464000000000#100
|
| 33 | +consolidateTrip.speciesListForLogbookSampleWeights=fr.ird.referential.common.SpeciesList#1464000000000#101 |