branch feature/8228 updated (dd2d7b6 -> 0a7c166)
This is an automated email from the git hooks/post-receive script. New change to branch feature/8228 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git from dd2d7b6 Fix npe quand recopie poids + suppression méthode inutile new 0a7c166 Revue du code du cache et de l'export des pièces calcifiées The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 0a7c16644010ec2f880ee263739ea18d63a465f9 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 12 12:28:35 2016 +0200 Revue du code du cache et de l'export des pièces calcifiées Summary of changes: .../service/export/cps/SamplingNumberRowModel.java | 13 +- .../tutti/service/sampling/CacheExtractedKey.java | 18 +- .../service/sampling/CruiseSamplingCache.java | 816 ++++++++++++--------- .../sampling/CruiseSamplingCacheLoader.java | 16 +- .../sampling/CruiseSamplingInternalCache.java | 9 +- 5 files changed, 476 insertions(+), 396 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/8228 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 0a7c16644010ec2f880ee263739ea18d63a465f9 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Apr 12 12:28:35 2016 +0200 Revue du code du cache et de l'export des pièces calcifiées --- .../service/export/cps/SamplingNumberRowModel.java | 13 +- .../tutti/service/sampling/CacheExtractedKey.java | 18 +- .../service/sampling/CruiseSamplingCache.java | 816 ++++++++++++--------- .../sampling/CruiseSamplingCacheLoader.java | 16 +- .../sampling/CruiseSamplingInternalCache.java | 9 +- 5 files changed, 476 insertions(+), 396 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java index 0410b48..c4601ef 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/export/cps/SamplingNumberRowModel.java @@ -24,7 +24,7 @@ package fr.ifremer.tutti.service.export.cps; * #L% */ -import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.csv.AbstractTuttiImportExportModel; import fr.ifremer.tutti.service.csv.TuttiCsvUtil; @@ -68,17 +68,12 @@ public class SamplingNumberRowModel extends AbstractTuttiImportExportModel<Cache return maturity ? t("tutti.maturity.mature") : t("tutti.maturity.immature"); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CacheExtractedKey.PROPERTY_SEX, new ValueFormatter<QualitativeValueId>() { - + newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.gender"), CacheExtractedKey.PROPERTY_SEX, new ValueFormatter<CaracteristicQualitativeValue>() { @Override - public String format(QualitativeValueId sex) { - if (sex == null) { - return ""; - } - return t(sex.getDescription()); + public String format(CaracteristicQualitativeValue value) { + return t(value.getDescription()); } }); - newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.observationNb"), CacheExtractedKey.PROPERTY_OBSERVATION_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.samplingNb"), CacheExtractedKey.PROPERTY_SAMPLING_NB, TuttiCsvUtil.PRIMITIVE_INTEGER); newColumnForExport(t("tutti.service.calcifiedPiecesSamplingReport.header.maxByLengthStep"), CacheExtractedKey.PROPERTY_MAX_BY_LENGTH_STEP, TuttiCsvUtil.INTEGER); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java index 325c5fe..d0af86d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CacheExtractedKey.java @@ -24,7 +24,7 @@ package fr.ifremer.tutti.service.sampling; * #L% */ -import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; +import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import java.io.Serializable; @@ -39,15 +39,13 @@ public class CacheExtractedKey implements Serializable { public static final String PROPERTY_LENGTH_STEP = "lengthStep"; public static final String PROPERTY_MATURITY = "maturity"; public static final String PROPERTY_SEX = "sex"; - public static final String PROPERTY_OBSERVATION_NB = "observationNb"; public static final String PROPERTY_SAMPLING_NB = "samplingNb"; public static final String PROPERTY_MAX_BY_LENGTH_STEP = "maxByLengthStep"; protected Species species; protected int lengthStep; protected Boolean maturity; - protected QualitativeValueId sex; - protected int observationNb; + protected CaracteristicQualitativeValue sex; protected int samplingNb; protected Integer maxByLengthStep; @@ -75,14 +73,6 @@ public class CacheExtractedKey implements Serializable { this.maxByLengthStep = maxByLengthStep; } - public int getObservationNb() { - return observationNb; - } - - public void setObservationNb(int observationNb) { - this.observationNb = observationNb; - } - public int getSamplingNb() { return samplingNb; } @@ -91,11 +81,11 @@ public class CacheExtractedKey implements Serializable { this.samplingNb = samplingNb; } - public QualitativeValueId getSex() { + public CaracteristicQualitativeValue getSex() { return sex; } - public void setSex(QualitativeValueId sex) { + public void setSex(CaracteristicQualitativeValue sex) { this.sex = sex; } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java index 0ff282b..6ce0fd0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCache.java @@ -26,6 +26,7 @@ package fr.ifremer.tutti.service.sampling; import com.google.common.base.MoreObjects; import com.google.common.collect.HashMultimap; +import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import fr.ifremer.tutti.persistence.entities.TuttiEntities; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; @@ -91,10 +92,14 @@ public class CruiseSamplingCache implements Closeable { */ private final Multimap<String, String> matureStatesByMaturityCracteristic = HashMultimap.create(); /** - * La caractéristic qui définie le sexe dans une observation individuelle. + * La caractéristique qui définie le sexe dans une observation individuelle. */ private final Caracteristic sexCaracteristic; /** + * Les valeurs qualitatives de la caractéristique de Sexe indexées par leur identifiant. + */ + private final Map<Integer, CaracteristicQualitativeValue> sexQualitativeValues; + /** * La liste des listeners. */ private final EventListenerList listeners = new EventListenerList(); @@ -111,13 +116,14 @@ public class CruiseSamplingCache implements Closeable { */ private boolean loading; /** - * Le code prélèvement le plus grand pour chaque espèce + * Le code prélèvement le plus grand pour chaque espèce. */ private final Map<Integer, MutableInt> highestSamplingCodeBySpecies = new HashMap<>(); public CruiseSamplingCache(int cruiseId, TuttiProtocol protocol, Caracteristic sexCaracteristic, Collection<Caracteristic> maturityCaracteristics) { this.cruiseId = cruiseId; this.sexCaracteristic = sexCaracteristic; + this.sexQualitativeValues = Maps.uniqueIndex(sexCaracteristic.getQualitativeValue(), TuttiEntities.GET_ID_AS_INT); this.protocolId = protocol.getId(); locationIdsPerZone = HashMultimap.create(); @@ -162,6 +168,7 @@ public class CruiseSamplingCache implements Closeable { locationIdsPerZone.clear(); cpsDefinitionsBySpecies.clear(); maturityCaracteristicBySpecies.clear(); + sexQualitativeValues.clear(); matureStatesByMaturityCracteristic.clear(); SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); for (SamplingListener listener : samplingListeners) { @@ -183,226 +190,90 @@ public class CruiseSamplingCache implements Closeable { /** * Ajout d'un échantillon dans le cache. * - * @param fishingOperationId l'identifiant de l'opération de pêche concernée - * @param optionalZone la zone (facultative) de l'opération de pêche concernée - * @param individualObservationBatch l'observation individuelle à ajouter au cache - */ - public void addIndividualObservation(int fishingOperationId, - Zone optionalZone, - IndividualObservationBatch individualObservationBatch) { - - Objects.requireNonNull(fishingOperationId); - Objects.requireNonNull(optionalZone); - Objects.requireNonNull(individualObservationBatch); - - Species species = individualObservationBatch.getSpecies(); - Objects.requireNonNull(species); - - Boolean maturity = getMaturity(individualObservationBatch); - - // l'observation peut ne pas avoir de taille si elle a un code de prélèvement - float lengthStep = individualObservationBatch.getSize(); - int lengthStepInMm = Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); - - CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); - - String samplingCode = individualObservationBatch.getSamplingCode(); - if (samplingCode != null) { - int code = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); - - MutableInt highestSamplingCode = highestSamplingCodeBySpecies.get(species.getReferenceTaxonId()); - if (highestSamplingCode == null) { - highestSamplingCode = new MutableInt(); - highestSamplingCodeBySpecies.put(species.getReferenceTaxonId(), highestSamplingCode); - } - if (code > highestSamplingCode.intValue()) { - highestSamplingCode.setValue(code); - } - - addSampling(fishingOperationId, optionalZone, species, gender, maturity, lengthStepInMm, samplingCode); - } - - addIndividualObservation(fishingOperationId, optionalZone, species, gender, maturity, lengthStepInMm); - } - - /** - * Ajout d'un observation dans le cache. - * - * @param fishingOperation l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - */ - public void addIndividualObservation(FishingOperation fishingOperation, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { - - Objects.requireNonNull(fishingOperation); - Objects.requireNonNull(species); - - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - - addIndividualObservation(fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep); - - } - - /** - * Ajout d'une observation dans le cache. - * - * @param fishingOperationId l'identifiant de l'opération de pêche concernée - * @param zone la zone (facultative) de l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) + * @param fishingOperationId l'identifiant de l'opération de pêche concernée + * @param optionalZone la zone (facultative) de l'opération de pêche concernée + * @param individualObservationBatchs les observations à ajouter au cache */ - public void addIndividualObservation(int fishingOperationId, - Zone zone, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { + public void addIndividualObservations(int fishingOperationId, + Zone optionalZone, + List<IndividualObservationBatch> individualObservationBatchs) { Objects.requireNonNull(fishingOperationId); - Objects.requireNonNull(species); +// Objects.requireNonNull(optionalZone); + Objects.requireNonNull(individualObservationBatchs); + for (IndividualObservationBatch individualObservationBatch : individualObservationBatchs) { - Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = + tryToFindCalcifiedPiecesSamplingDefinition(individualObservationBatch); - if (cpsDefinitionOpt.isPresent()) { + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { - CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); - - if (log.isInfoEnabled()) { - log.info("Found matching sampling definition: " + cpsDefinition); + // pas dans l'algorithme, one ne tient pas compte de cette observation + continue; } - if (!canUseCalcifiedPiecesSamplingDefinition(cpsDefinition, gender)) { + Species species = individualObservationBatch.getSpecies(); + Objects.requireNonNull(species); - if (log.isInfoEnabled()) { - log.info("No using the calcified pieces sampling definition for previous reasons."); - } - return; - } - int samplingInterval = cpsDefinition.getSamplingInterval(); + // l'observation a forcement une taille + Float lengthStep = individualObservationBatch.getSize(); + Objects.requireNonNull(lengthStep); - if (!cpsDefinition.isSex()) { - gender = null; - } + Boolean maturity = getMaturity(individualObservationBatch); - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + int lengthStepInMm = Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); - int totalValue = totalCruiseCache.incrementObservationNb(samplingKey); - int totalSamplingNb = totalCruiseCache.getSamplingNb(samplingKey); + CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); - int zoneValue = 0; - int zoneSamplingNb = 0; - if (zone != null) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); - zoneValue = zoneCache.incrementObservationNb(zoneKey); - zoneSamplingNb = zoneCache.getSamplingNb(zoneKey); - } - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); - int operationValue = operationCache.incrementObservationNb(operationKey); - int operationSamplingNb = operationCache.getSamplingNb(operationKey); + addIndividualObservation(calcifiedPiecesSamplingDefinition, fishingOperationId, optionalZone, species, gender, maturity, lengthStepInMm); - if (log.isInfoEnabled()) { - log.info("add Individual Observation " + samplingKey + " => op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); - } + String samplingCode = individualObservationBatch.getSamplingCode(); + if (samplingCode != null) { - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, zone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + addSampling(calcifiedPiecesSamplingDefinition, fishingOperationId, optionalZone, species, gender, maturity, lengthStepInMm, samplingCode); - if (!isLoading() && (totalValue == 1 || samplingInterval == 1 || totalValue % samplingInterval == 1)) { - if (log.isInfoEnabled()) { - log.info("-> needs sampling"); - } - fireSamplingNeeded(event); } - fireSummaryUpdated(event); - } + } /** - * Ajout d'un prélèvement dans le cache. + * Ajout d'un observation dans le cache. * * @param fishingOperation l'opération de pêche concernée * @param species l'espèces concernée * @param gender le sexe de l'échantillon (peut-être null) * @param maturity la maturité de l'échantillon (peut-être null) * @param lengthStep la classe de taille de l'échantillon (en mm) - * @param samplingCode le code de prélèvement ajouté */ - public void addSampling(FishingOperation fishingOperation, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep, - String samplingCode) { + public void addIndividualObservation(FishingOperation fishingOperation, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + int lengthStep) { Objects.requireNonNull(fishingOperation); Objects.requireNonNull(species); - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - - addSampling(fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep, samplingCode); - } - - /** - * Ajout d'un prélèvement dans le cache. - * - * @param fishingOperationId l'identifiant de l'opération de pêche concernée - * @param zone la zone (facultative) de l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - * @param samplingCode le code de prélèvement ajouté - */ - public void addSampling(int fishingOperationId, - Zone zone, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep, - String samplingCode) { - - Objects.requireNonNull(fishingOperationId); - Objects.requireNonNull(species); - - Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); - - if (cpsDefinitionOpt.isPresent() && !cpsDefinitionOpt.get().isSex()) { - gender = null; - } - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = + tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); - int totalSamplingNb = totalCruiseCache.incrementSamplingNb(samplingKey); + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { - int zoneSamplingNb = 0; - if (zone != null) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); - zoneSamplingNb = zoneCache.incrementSamplingNb(zoneKey); + // pas dans l'algorithme, one ne tient pas compte de cette observation + return; } - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); - int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); - if (log.isInfoEnabled()) { - log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); - } + Optional<Zone> optionalZone = tryFindZone(fishingOperation); - if (cpsDefinitionOpt.isPresent()) { - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinitionOpt.get(), zone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); - fireSummaryUpdated(event); - } + addIndividualObservation(calcifiedPiecesSamplingDefinition, fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep); - addSamplingCode(species.getReferenceTaxonId(), samplingCode); } /** @@ -420,8 +291,16 @@ public class CruiseSamplingCache implements Closeable { Objects.requireNonNull(zone); Objects.requireNonNull(individualObservationBatches); - individualObservationBatches.stream() - .filter(individualObservationBatch -> individualObservationBatch.getSize() != null).forEach(individualObservationBatch -> { + for (IndividualObservationBatch individualObservationBatch : individualObservationBatches) { + + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = + tryToFindCalcifiedPiecesSamplingDefinition(individualObservationBatch); + + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + + // pas dans l'algorithme, one ne tient pas compte de cette observation + continue; + } Species species = individualObservationBatch.getSpecies(); Objects.requireNonNull(species); @@ -433,16 +312,18 @@ public class CruiseSamplingCache implements Closeable { CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); + String samplingCode = individualObservationBatch.getSamplingCode(); if (samplingCode != null) { - removeSampling(fishingOperationId, zone, species, gender, maturity, lengthStepInMm, samplingCode); + removeSampling(calcifiedPiecesSamplingDefinition, fishingOperationId, zone, species, gender, maturity, lengthStepInMm, samplingCode); } - removeIndividualObservation(fishingOperationId, zone, species, gender, maturity, lengthStepInMm); + removeIndividualObservation(calcifiedPiecesSamplingDefinition, fishingOperationId, zone, species, gender, maturity, lengthStepInMm); - }); + } } @@ -466,68 +347,55 @@ public class CruiseSamplingCache implements Closeable { Optional<Zone> optionalZone = tryFindZone(fishingOperation); - removeIndividualObservation(fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep); + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = + tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); + + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + return; + } + + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); + + removeIndividualObservation(calcifiedPiecesSamplingDefinition, fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep); } /** - * Suppression d'un échantillon du cache. + * Ajout d'un prélèvement dans le cache. * - * @param fishingOperationId l'identifiant de l'opération de pêche concernée - * @param zone la zone (facultative) de l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) + * @param fishingOperation l'opération de pêche concernée + * @param species l'espèces concernée + * @param gender le sexe de l'échantillon (peut-être null) + * @param maturity la maturité de l'échantillon (peut-être null) + * @param lengthStep la classe de taille de l'échantillon (en mm) + * @param samplingCode le code de prélèvement ajouté */ - public void removeIndividualObservation(int fishingOperationId, - Zone zone, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep) { + public void addSampling(FishingOperation fishingOperation, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + int lengthStep, + String samplingCode) { - Objects.requireNonNull(fishingOperationId); + Objects.requireNonNull(fishingOperation); Objects.requireNonNull(species); - Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); - - if (cpsDefinitionOpt.isPresent()) { - - CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); - if (log.isInfoEnabled()) { - log.info("Found matching sampling definition: " + cpsDefinition); - } - - if (!canUseCalcifiedPiecesSamplingDefinition(cpsDefinition, gender)) { - if (log.isInfoEnabled()) { - log.info("No using the calcified pieces sampling definition for previous reasons."); - } - return; - } - - if (!cpsDefinition.isSex()) { - gender = null; - } - - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + Optional<Zone> optionalZone = tryFindZone(fishingOperation); - int totalValue = totalCruiseCache.decrementObservationNb(samplingKey); - int zoneValue = 0; - if (zone != null) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); - zoneValue = zoneCache.decrementObservationNb(zoneKey); - } - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = + tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); - int operationValue = operationCache.decrementObservationNb(operationKey); + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { if (log.isInfoEnabled()) { - log.info("remove individual observation " + samplingKey + " ⇒ op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); + log.info("Do not record sampling code in cache, definition not matched."); } - + return; } + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); + + addSampling(calcifiedPiecesSamplingDefinition, fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep, samplingCode); } /** @@ -552,60 +420,15 @@ public class CruiseSamplingCache implements Closeable { Optional<Zone> optionalZone = tryFindZone(fishingOperation); - removeSampling(fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep, samplingCode); - } - - /** - * Suppression d'un prélèvement dans le cache. - * - * @param fishingOperationId l'identifiant de l'opération de pêche concernée - * @param zone la zone (facultative) de l'opération de pêche concernée - * @param species l'espèces concernée - * @param gender le sexe de l'échantillon (peut-être null) - * @param maturity la maturité de l'échantillon (peut-être null) - * @param lengthStep la classe de taille de l'échantillon (en mm) - * @param samplingCode le code de prélèvement supprimé - */ - public void removeSampling(int fishingOperationId, - Zone zone, - Species species, - CaracteristicQualitativeValue gender, - Boolean maturity, - int lengthStep, - String samplingCode) { - - Objects.requireNonNull(fishingOperationId); - Objects.requireNonNull(species); - - Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); - - if (cpsDefinitionOpt.isPresent() && !cpsDefinitionOpt.get().isSex()) { - gender = null; - } - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - - int totalSamplingNb = totalCruiseCache.decrementSamplingNb(samplingKey); - - int zoneSamplingNb = 0; - if (zone != null) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); - zoneSamplingNb = zoneCache.decrementSamplingNb(zoneKey); - } - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); - - int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); - if (log.isInfoEnabled()) { - log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + if (!optionalCalcifiedPiecesSamplingDefinition.isPresent()) { + return; } - if (cpsDefinitionOpt.isPresent()) { - - SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinitionOpt.get(), zone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); - fireSummaryUpdated(event); - } + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); - removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + removeSampling(calcifiedPiecesSamplingDefinition, fishingOperation.getIdAsInt(), optionalZone.orElse(null), species, gender, maturity, lengthStep, samplingCode); } @@ -663,59 +486,51 @@ public class CruiseSamplingCache implements Closeable { Objects.requireNonNull(fishingOperation); Objects.requireNonNull(species); - Optional<CalcifiedPiecesSamplingDefinition> cpsDefinitionOpt = getCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep); + Optional<CalcifiedPiecesSamplingDefinition> optionalCalcifiedPiecesSamplingDefinition = tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStep, gender); SamplingEvent event = null; - if (cpsDefinitionOpt.isPresent()) { + if (optionalCalcifiedPiecesSamplingDefinition.isPresent()) { - CalcifiedPiecesSamplingDefinition cpsDefinition = cpsDefinitionOpt.get(); + CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition = optionalCalcifiedPiecesSamplingDefinition.get(); if (log.isInfoEnabled()) { - log.info("Found matching sampling definition: " + cpsDefinition); + log.info("Found matching sampling definition: " + calcifiedPiecesSamplingDefinition); } - if (!canUseCalcifiedPiecesSamplingDefinition(cpsDefinition, gender)) { - - if (log.isInfoEnabled()) { - log.info("No using the calcified pieces sampling definition for previous reasons."); - } - - } else { - - if (!cpsDefinition.isSex()) { - gender = null; - } - String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - - int totalValue = totalCruiseCache.getObservationNb(samplingKey); - int totalSamplingNb = totalCruiseCache.getSamplingNb(samplingKey); + if (!calcifiedPiecesSamplingDefinition.isSex()) { + gender = null; + } - int zoneValue = 0; - int zoneSamplingNb = 0; + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); - Optional<Zone> optionalZone = tryFindZone(fishingOperation); - if (optionalZone.isPresent()) { - String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); - zoneValue = zoneCache.getObservationNb(zoneKey); - zoneSamplingNb = zoneCache.getSamplingNb(zoneKey); - } + int totalValue = totalCruiseCache.getObservationNb(samplingKey); + int totalSamplingNb = totalCruiseCache.getSamplingNb(samplingKey); - String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperation.getIdAsInt(), samplingKey); + int zoneValue = 0; + int zoneSamplingNb = 0; - int operationValue = operationCache.getObservationNb(operationKey); - int operationSamplingNb = operationCache.getSamplingNb(operationKey); + Optional<Zone> optionalZone = tryFindZone(fishingOperation); + if (optionalZone.isPresent()) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(optionalZone.get().getId(), samplingKey); + zoneValue = zoneCache.getObservationNb(zoneKey); + zoneSamplingNb = zoneCache.getSamplingNb(zoneKey); + } - if (log.isInfoEnabled()) { - log.info("add Individual Observation " + samplingKey + " => op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); - } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperation.getIdAsInt(), samplingKey); - event = new SamplingEvent(this, lengthStep, gender, maturity, cpsDefinition, optionalZone.orElse(null), totalSamplingNb, zoneSamplingNb, operationSamplingNb); + int operationValue = operationCache.getObservationNb(operationKey); + int operationSamplingNb = operationCache.getSamplingNb(operationKey); + if (log.isInfoEnabled()) { + log.info("add Individual Observation " + samplingKey + " ⇒ op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); } + event = new SamplingEvent(this, lengthStep, gender, maturity, calcifiedPiecesSamplingDefinition, optionalZone.orElse(null), totalSamplingNb, zoneSamplingNb, operationSamplingNb); + } return Optional.ofNullable(event); + } public Optional<Zone> tryFindZone(FishingOperation operation) { @@ -730,6 +545,21 @@ public class CruiseSamplingCache implements Closeable { return result; } + public Boolean getMaturity(int speciesId, CaracteristicQualitativeValue maturityQualitativeValue) { + Boolean maturity = null; + Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(speciesId); + if (maturityCaracteristic != null && maturityQualitativeValue != null) { + maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.getId(), maturityQualitativeValue.getId()); + } + return maturity; + } + + public int getNextSamplingCodeId(int speciesId) { + MutableInt samplingCode = highestSamplingCodeBySpecies.get(speciesId); + return (samplingCode == null ? 0 : samplingCode.intValue()) + 1; +// return highestSamplingCodeBySpecies.getOrDefault(speciesId, 0) + 1; + } + public void addSamplingListener(SamplingListener listener) { listeners.add(SamplingListener.class, listener); } @@ -738,17 +568,7 @@ public class CruiseSamplingCache implements Closeable { listeners.remove(SamplingListener.class, listener); } - public Optional<CalcifiedPiecesSamplingDefinition> getCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, int lengthStep) { - Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); - return cpsDefinitions.stream() - .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) - && lengthStep >= cpsDef.getMinSize() - && (cpsDef.getMaxSize() == null - || lengthStep <= cpsDef.getMaxSize())) - .findFirst(); - } - - protected void fireSamplingNeeded(SamplingEvent event) { + private void fireSamplingNeeded(SamplingEvent event) { SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); if (samplingListeners.length > 0) { @@ -759,7 +579,7 @@ public class CruiseSamplingCache implements Closeable { } } - protected void fireSummaryUpdated(SamplingEvent event) { + private void fireSummaryUpdated(SamplingEvent event) { SamplingListener[] samplingListeners = listeners.getListeners(SamplingListener.class); if (samplingListeners.length > 0) { @@ -770,7 +590,7 @@ public class CruiseSamplingCache implements Closeable { } } - protected Optional<Zone> tryFindZone(TuttiLocation location) { + private Optional<Zone> tryFindZone(TuttiLocation location) { Integer locationId = location.getIdAsInt(); return locationIdsPerZone.keySet() @@ -779,7 +599,7 @@ public class CruiseSamplingCache implements Closeable { .findFirst(); } - protected Boolean getMaturity(IndividualObservationBatch individualObservationBatch) { + private Boolean getMaturity(IndividualObservationBatch individualObservationBatch) { Boolean maturity = null; Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(individualObservationBatch.getSpecies().getReferenceTaxonId()); // if a maturity caracteristic is defined in the protocol for this species @@ -793,24 +613,183 @@ public class CruiseSamplingCache implements Closeable { return maturity; } - public Boolean getMaturity(int speciesId, CaracteristicQualitativeValue maturityQualitativeValue) { - Boolean maturity = null; - Caracteristic maturityCaracteristic = maturityCaracteristicBySpecies.get(speciesId); - if (maturityCaracteristic != null && maturityQualitativeValue != null) { - maturity = matureStatesByMaturityCracteristic.containsEntry(maturityCaracteristic.getId(), maturityQualitativeValue.getId()); + public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { + List<CacheExtractedKey> result = totalCruiseCache.getSamplingNumbers(speciesById, sexQualitativeValues); + result.forEach(key -> { + Optional<CalcifiedPiecesSamplingDefinition> cpsDef = tryToFindCalcifiedPiecesSamplingDefinition(key.getSpecies(), key.getMaturity(), key.getLengthStep(), key.getSex()); + if (cpsDef.isPresent()) { + key.setMaxByLengthStep(cpsDef.get().getMaxByLenghtStep()); + } + }); + return result; + } + + private void addIndividualObservation(CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition, + int fishingOperationId, + Zone zone, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + int lengthStep) { + + if (!calcifiedPiecesSamplingDefinition.isSex()) { + gender = null; } - return maturity; + + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + + if (isLoading()) { + + int totalValue = totalCruiseCache.incrementObservationNb(samplingKey); + + int zoneValue = 0; + if (zone != null) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); + zoneValue = zoneCache.incrementObservationNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationValue = operationCache.incrementObservationNb(operationKey); + + if (log.isInfoEnabled()) { + log.info("add individual observation " + samplingKey + " ⇒ op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); + } + + } else { + + int totalValue = totalCruiseCache.incrementObservationNb(samplingKey); + int totalSamplingNb = totalCruiseCache.getSamplingNb(samplingKey); + + int zoneValue = 0; + int zoneSamplingNb = 0; + if (zone != null) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); + zoneValue = zoneCache.incrementObservationNb(zoneKey); + zoneSamplingNb = zoneCache.getSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationValue = operationCache.incrementObservationNb(operationKey); + int operationSamplingNb = operationCache.getSamplingNb(operationKey); + + if (log.isInfoEnabled()) { + log.info("add individual observation " + samplingKey + " ⇒ op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); + } + + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, calcifiedPiecesSamplingDefinition, zone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + + int samplingInterval = calcifiedPiecesSamplingDefinition.getSamplingInterval(); + if (totalValue == 1 || samplingInterval == 1 || totalValue % samplingInterval == 1) { + if (log.isInfoEnabled()) { + log.info("-> needs sampling"); + } + fireSamplingNeeded(event); + } + + fireSummaryUpdated(event); + + } + } - public int getNextSamplingCodeId(int speciesId) { - MutableInt samplingCode = highestSamplingCodeBySpecies.get(speciesId); - return (samplingCode == null ? 0 : samplingCode.intValue()) + 1; -// return highestSamplingCodeBySpecies.getOrDefault(speciesId, 0) + 1; + /** + * Suppression d'un échantillon du cache. + * + * @param calcifiedPiecesSamplingDefinition la définition de l'alrithme à utiliser + * @param fishingOperationId l'identifiant de l'opération de pêche concernée + * @param zone la zone (facultative) de l'opération de pêche concernée + * @param species l'espèces concernée + * @param gender le sexe de l'échantillon (peut-être null) + * @param maturity la maturité de l'échantillon (peut-être null) + * @param lengthStep la classe de taille de l'échantillon (en mm) + */ + private void removeIndividualObservation(CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition, + int fishingOperationId, + Zone zone, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + int lengthStep) { + + Objects.requireNonNull(calcifiedPiecesSamplingDefinition); + Objects.requireNonNull(fishingOperationId); + Objects.requireNonNull(species); + + if (!calcifiedPiecesSamplingDefinition.isSex()) { + gender = null; + } + + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + + int totalValue = totalCruiseCache.decrementObservationNb(samplingKey); + int zoneValue = 0; + if (zone != null) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); + zoneValue = zoneCache.decrementObservationNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationValue = operationCache.decrementObservationNb(operationKey); + + if (log.isInfoEnabled()) { + log.info("remove individual observation " + samplingKey + " ⇒ op " + operationValue + " / zone " + zoneValue + " / cruise " + totalValue); + } + + } + + /** + * Ajout d'un prélèvement dans le cache. + * + * @param fishingOperationId l'identifiant de l'opération de pêche concernée + * @param zone la zone (facultative) de l'opération de pêche concernée + * @param species l'espèces concernée + * @param gender le sexe de l'échantillon (peut-être null) + * @param maturity la maturité de l'échantillon (peut-être null) + * @param lengthStep la classe de taille de l'échantillon (en mm) + * @param samplingCode le code de prélèvement ajouté + */ + private void addSampling(CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition, + int fishingOperationId, + Zone zone, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + int lengthStep, + String samplingCode) { + + Objects.requireNonNull(calcifiedPiecesSamplingDefinition); + Objects.requireNonNull(fishingOperationId); + Objects.requireNonNull(species); + + if (!calcifiedPiecesSamplingDefinition.isSex()) { + gender = null; + } + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + + int totalSamplingNb = totalCruiseCache.incrementSamplingNb(samplingKey); + + int zoneSamplingNb = 0; + if (zone != null) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); + zoneSamplingNb = zoneCache.incrementSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationSamplingNb = operationCache.incrementSamplingNb(operationKey); + + if (log.isInfoEnabled()) { + log.info("add Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } + + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, calcifiedPiecesSamplingDefinition, zone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + fireSummaryUpdated(event); + + addSamplingCode(species.getReferenceTaxonId(), samplingCode); + } - protected int addSamplingCode(int speciesId, String samplingCode) { - String[] codeParts = samplingCode.split("#"); - int code = Integer.parseInt(codeParts[codeParts.length - 1]); + private int addSamplingCode(int speciesId, String samplingCode) { + int code = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); // increment the highest sampling code if it is this code // return highestSamplingCodeBySpecies.compute(speciesId, @@ -828,8 +807,60 @@ public class CruiseSamplingCache implements Closeable { }).intValue(); } + /** + * Suppression d'un prélèvement dans le cache. + * + * @param fishingOperationId l'identifiant de l'opération de pêche concernée + * @param zone la zone (facultative) de l'opération de pêche concernée + * @param species l'espèces concernée + * @param gender le sexe de l'échantillon (peut-être null) + * @param maturity la maturité de l'échantillon (peut-être null) + * @param lengthStep la classe de taille de l'échantillon (en mm) + * @param samplingCode le code de prélèvement supprimé + */ + private void removeSampling(CalcifiedPiecesSamplingDefinition calcifiedPiecesSamplingDefinition, + int fishingOperationId, + Zone zone, + Species species, + CaracteristicQualitativeValue gender, + Boolean maturity, + int lengthStep, + String samplingCode) { + + Objects.requireNonNull(calcifiedPiecesSamplingDefinition); + Objects.requireNonNull(fishingOperationId); + Objects.requireNonNull(species); + + if (!calcifiedPiecesSamplingDefinition.isSex()) { + gender = null; + } + + String samplingKey = CruiseSamplingInternalCache.createSamplingKey(species, gender, maturity, lengthStep); + + int totalSamplingNb = totalCruiseCache.decrementSamplingNb(samplingKey); + + int zoneSamplingNb = 0; + if (zone != null) { + String zoneKey = CruiseSamplingInternalCache.addPrefixKey(zone.getId(), samplingKey); + zoneSamplingNb = zoneCache.decrementSamplingNb(zoneKey); + } + String operationKey = CruiseSamplingInternalCache.addPrefixKey(fishingOperationId, samplingKey); + + int operationSamplingNb = operationCache.decrementSamplingNb(operationKey); + + if (log.isInfoEnabled()) { + log.info("remove Sampling " + samplingKey + " => op " + operationSamplingNb + " / zone " + zoneSamplingNb + " / cruise " + totalSamplingNb); + } + + SamplingEvent event = new SamplingEvent(this, lengthStep, gender, maturity, calcifiedPiecesSamplingDefinition, zone, totalSamplingNb, zoneSamplingNb, operationSamplingNb); + fireSummaryUpdated(event); + + removeSamplingCode(species.getReferenceTaxonId(), samplingCode); + + } + - protected void removeSamplingCode(int speciesId, String samplingCode) { + private void removeSamplingCode(int speciesId, String samplingCode) { int code = SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(samplingCode); // decrement the highest sampling code if it is this code @@ -841,37 +872,94 @@ public class CruiseSamplingCache implements Closeable { // (key, highestSamplingCode) -> code.equals(highestSamplingCode) ? code - 1 : highestSamplingCode); } - public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { - List<CacheExtractedKey> result = totalCruiseCache.getSamplingNumbers(speciesById); - result.forEach(key -> { - Optional<CalcifiedPiecesSamplingDefinition> cpsDef = getCalcifiedPiecesSamplingDefinition(key.getSpecies(), key.getMaturity(), key.getLengthStep()); - if (cpsDef.isPresent()) { - key.setMaxByLengthStep(cpsDef.get().getMaxByLenghtStep()); - } - }); + private Optional<CalcifiedPiecesSamplingDefinition> tryToFindCalcifiedPiecesSamplingDefinition(IndividualObservationBatch individualObservationBatch) { + + Species species = individualObservationBatch.getSpecies(); + Objects.requireNonNull(species); + + Float lengthStep = individualObservationBatch.getSize(); + + Optional<CalcifiedPiecesSamplingDefinition> result; + if (lengthStep == null) { + + // on ne cherche pas sur une observation sans taille + result = Optional.empty(); + + } else { + + Boolean maturity = getMaturity(individualObservationBatch); + + int lengthStepInMm = Numbers.convertToMm(lengthStep, individualObservationBatch.getLengthStepCaracteristic().getUnit()); + + CaracteristicQualitativeValue gender = individualObservationBatch.getCaracteristics().getQualitativeValue(sexCaracteristic); + + result = tryToFindCalcifiedPiecesSamplingDefinition(species, maturity, lengthStepInMm, gender); + + } + + return result; + } + + private Optional<CalcifiedPiecesSamplingDefinition> tryToFindCalcifiedPiecesSamplingDefinition(Species species, Boolean maturity, int lengthStep, CaracteristicQualitativeValue gender) { - protected boolean canUseCalcifiedPiecesSamplingDefinition(CalcifiedPiecesSamplingDefinition cpsDefinition, CaracteristicQualitativeValue gender) { + Collection<CalcifiedPiecesSamplingDefinition> cpsDefinitions = cpsDefinitionsBySpecies.get(species.getReferenceTaxonId()); + + CalcifiedPiecesSamplingDefinition result = null; - int samplingInterval = cpsDefinition.getSamplingInterval(); + if (cpsDefinitions == null) { - // on ne prend pas en compte les intervales à 0 - if (samplingInterval == 0) { if (log.isInfoEnabled()) { - log.info("Reject matching sampling definition (sampling interval is zero)"); + log.info(species + " not found in any calcified pieces sampling definitions"); } - return false; - } - // on ne prend pas en compte quand l'espece doit etre sexee et que le sexe est nul - if (cpsDefinition.isSex() && gender == null) { - if (log.isInfoEnabled()) { - log.info("Reject matching sampling definition (sampling should be sexed, but observation was not)"); + + } else { + + Optional<CalcifiedPiecesSamplingDefinition> optionalDefinition = + cpsDefinitions.stream() + .filter(cpsDef -> Objects.equals(cpsDef.getMaturity(), maturity) + && lengthStep >= cpsDef.getMinSize() + && (cpsDef.getMaxSize() == null || lengthStep <= cpsDef.getMaxSize())) + .findFirst(); + + if (!optionalDefinition.isPresent()) { + + if (log.isInfoEnabled()) { + log.info(species + " - maturity " + maturity + " length step " + lengthStep + " not found in calcified pieces sampling definitions"); + } + + } else { + + result = optionalDefinition.get(); + + if (result.getSamplingInterval() == 0) { + + if (log.isInfoEnabled()) { + log.info("Can't use definition with no sampling interval: " + result); + } + result = null; + + } else if ((result.isSex() && gender == null)) { + + if (log.isInfoEnabled()) { + log.info("Can't use definition (sex is required, but none was given): " + result); + } + result = null; + + } else { + + if (log.isInfoEnabled()) { + log.info("Found matching definition: " + result); + } + + } + } - return false; + } - return true; + return Optional.ofNullable(result); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java index c9a702e..ebe3107 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingCacheLoader.java @@ -94,8 +94,12 @@ public class CruiseSamplingCacheLoader { Zone optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation).orElse(null); - allIndividualObservationBatchsForFishingOperation.stream().filter(obs -> obs.getSize() != null).forEach( - individualObservationBatch -> cruiseSamplingCache.addIndividualObservation(fishingOperationId, optionalZone, individualObservationBatch)); + cruiseSamplingCache.addIndividualObservations(fishingOperationId, + optionalZone, + allIndividualObservationBatchsForFishingOperation); + +// allIndividualObservationBatchsForFishingOperation.stream().filter(obs -> obs.getSize() != null).forEach( +// individualObservationBatch -> cruiseSamplingCache.addIndividualObservation(fishingOperationId, optionalZone, individualObservationBatch)); }); @@ -130,8 +134,12 @@ public class CruiseSamplingCacheLoader { List<IndividualObservationBatch> allIndividualObservationBatchsForFishingOperation = persistenceService.getAllIndividualObservationBatchsForFishingOperation(fishingOperationId); - allIndividualObservationBatchsForFishingOperation.forEach( - individualObservationBatch -> cruiseSamplingCache.addIndividualObservation(fishingOperationId, optionalZone, individualObservationBatch)); + cruiseSamplingCache.addIndividualObservations(fishingOperationId, + optionalZone, + allIndividualObservationBatchsForFishingOperation); + +// allIndividualObservationBatchsForFishingOperation.forEach( +// individualObservationBatch -> cruiseSamplingCache.addIndividualObservation(fishingOperationId, optionalZone, individualObservationBatch)); if (log.isInfoEnabled()) { log.info("Cruise sampling cache loaded for fishing operation: " + fishingOperationId + " - " + cruiseSamplingCache); diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java index c679876..1ac750f 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/CruiseSamplingInternalCache.java @@ -26,7 +26,6 @@ package fr.ifremer.tutti.service.sampling; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; -import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId; import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue; import fr.ifremer.tutti.persistence.entities.referential.Species; import org.apache.commons.lang3.StringUtils; @@ -191,7 +190,7 @@ class CruiseSamplingInternalCache implements Closeable { * * @return a map of the number of samplings for each lengthstep in millimeters */ - public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById) { + public List<CacheExtractedKey> getSamplingNumbers(Map<String, Species> speciesById, Map<Integer, CaracteristicQualitativeValue> sexQualitativeValues) { List<CacheExtractedKey> result = new LinkedList<>(); @@ -213,8 +212,9 @@ class CruiseSamplingInternalCache implements Closeable { nextToken = keyTokens[i++]; if (!StringUtils.isEmpty(nextToken)) { - QualitativeValueId sex = QualitativeValueId.fromValue(Integer.parseInt(nextToken)); - key.setSex(sex); + Integer sexId = Integer.parseInt(nextToken); + CaracteristicQualitativeValue sexQualitativeValue = sexQualitativeValues.get(sexId); + key.setSex(sexQualitativeValue); } nextToken = keyTokens[i++]; @@ -230,7 +230,6 @@ class CruiseSamplingInternalCache implements Closeable { } key.setSamplingNb(samplingData.getSamplingNb()); - key.setObservationNb(samplingData.getObservationNb()); result.add(key); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.
participants (1)
-
codelutin.com scm