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>.