This is an automated email from the git hooks/post-receive script. New commit to branch feature/8204 in repository tutti. See https://gitlab.nuiton.org/codelutin/tutti.git commit 27b822c7bc9aaa205a1cf2b081c9f8f1224e33fb Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Apr 4 14:48:23 2016 +0200 Ajout d'une méthode sur la persistence pour tester qu'on peut utiliser un code de prélèvement (See #8204) --- .../tutti/persistence/TuttiPersistenceImpl.java | 5 ++ .../persistence/TuttiPersistenceNoDbImpl.java | 5 ++ ...dividualObservationBatchPersistenceService.java | 10 +++ ...dualObservationBatchPersistenceServiceImpl.java | 49 +++++++++++++ .../service/util/SamplePersistenceHelper.java | 82 +++++++++++++++++----- .../src/main/resources/queries-failsafe.hbm.xml | 36 ++++++++++ .../ifremer/tutti/service/PersistenceService.java | 5 ++ .../tutti/service/sampling/SamplingCodePrefix.java | 4 ++ 8 files changed, 177 insertions(+), 19 deletions(-) diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java index 5cf2795..a319038 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceImpl.java @@ -1373,6 +1373,11 @@ public class TuttiPersistenceImpl implements TuttiPersistence { } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + return getIndividualObservationBatchService().isSamplingCodeAvailable(cruiseId, referenceTaxonId, samplingCodeSuffix); + } + + @Override public Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations) { return getIndividualObservationBatchService().createIndividualObservationBatches(individualObservations); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java index c839c6d..abf9daa 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/TuttiPersistenceNoDbImpl.java @@ -922,6 +922,11 @@ public class TuttiPersistenceNoDbImpl implements TuttiPersistence { } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + throw notImplemented(); + } + + @Override public Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations) { throw notImplemented(); } diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java index 9498897..75b27f2 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceService.java @@ -44,6 +44,16 @@ public interface IndividualObservationBatchPersistenceService extends TuttiPersi List<IndividualObservationBatch> getAllIndividualObservationBatchsForCruise(Integer cruiseId); + /** + * Test if a sampling code suffix is available for a given cruise and species all over the existing individual observations. + * + * @param cruiseId id of the cruise of individual observations to test + * @param referenceTaxonId id of the species used in individual observations to test + * @param samplingCodeSuffix the sampling code suffix to test + * @return {@code true} if given sampling code is not already used in database, {@code false} otherwise. + */ + boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix); + @Transactional(readOnly = false) Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java index 7c274b5..3af20f5 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/IndividualObservationBatchPersistenceServiceImpl.java @@ -63,6 +63,7 @@ import org.hibernate.type.IntegerType; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -106,6 +107,15 @@ public class IndividualObservationBatchPersistenceServiceImpl extends AbstractPe @Resource(name = "fishingOperationPersistenceService") protected FishingOperationPersistenceService fishingOperationPersistenceService; + protected Caracteristic sampleCodeCaracteristic; + + @Override + public void init() { + super.init(); + + sampleCodeCaracteristic = caracteristicService.getSampleCodeCaracteristic(); + } + @Override public List<IndividualObservationBatch> getAllIndividualObservationBatchsForCruise(Integer cruiseId) { Preconditions.checkNotNull(cruiseId); @@ -126,6 +136,45 @@ public class IndividualObservationBatchPersistenceServiceImpl extends AbstractPe } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + + Preconditions.checkNotNull(cruiseId); + Preconditions.checkNotNull(referenceTaxonId); + Preconditions.checkNotNull(samplingCodeSuffix); + + List<Integer> allFishingOperationIds = fishingOperationPersistenceService.getAllFishingOperationIds(cruiseId); + for (Integer fishingOperationId : allFishingOperationIds) { + + Iterator<Integer> list = queryListTyped("allFishingOperationSampleIdsWithBatchForSpecies", + "fishingOperationId", IntegerType.INSTANCE, fishingOperationId, + "referenceTaxonId", IntegerType.INSTANCE, referenceTaxonId); + + while (list.hasNext()) { + + Integer sampleId = list.next(); + + Serializable sampleMeasurementValue = samplePersistenceHelper.getSampleMeasurementValue(sampleId, sampleCodeCaracteristic); + if (sampleMeasurementValue != null) { + + if (sampleMeasurementValue.toString().endsWith(samplingCodeSuffix)) { + + // sampling code suffix found, stop NOW! + return false; + + } + + } + + } + + } + + // Free to use + return true; + + } + + @Override public List<IndividualObservationBatch> getAllIndividualObservationBatchsForFishingOperation(Integer fishingOperationId) { Preconditions.checkNotNull(fishingOperationId); diff --git a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java index 36c2ddc..239c78a 100644 --- a/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java +++ b/tutti-persistence/src/main/java/fr/ifremer/tutti/persistence/service/util/SamplePersistenceHelper.java @@ -140,27 +140,30 @@ public class SamplePersistenceHelper extends AbstractPersistenceService { CaracteristicMap caracteristicMap = sample.getCaracteristics(); while (list.hasNext()) { - int colIndex = 0; +// int colIndex = 0; Object[] source = list.next(); - Integer pmfmId = (Integer) source[colIndex++]; - Float numericalValue = (Float) source[colIndex++]; - String alphanumericalValue = (String) source[colIndex++]; - Integer qualitativeValueId = (Integer) source[colIndex]; - + Integer pmfmId = (Integer) source[0]; Caracteristic caracteristic = caracteristicService.getCaracteristic(pmfmId); - Serializable value = null; - switch (caracteristic.getCaracteristicType()) { - - case NUMBER: - value = numericalValue; - break; - case QUALITATIVE: - value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId); - break; - case TEXT: - value = alphanumericalValue; - break; - } + Serializable value = getMeasurementValue(caracteristic, source); + +// Float numericalValue = (Float) source[colIndex++]; +// String alphanumericalValue = (String) source[colIndex++]; +// Integer qualitativeValueId = (Integer) source[colIndex]; +// +// +// Serializable value = null; +// switch (caracteristic.getCaracteristicType()) { +// +// case NUMBER: +// value = numericalValue; +// break; +// case QUALITATIVE: +// value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId); +// break; +// case TEXT: +// value = alphanumericalValue; +// break; +// } caracteristicMap.put(caracteristic, value); } @@ -180,6 +183,20 @@ public class SamplePersistenceHelper extends AbstractPersistenceService { } + public <S extends SampleEntity> Serializable getSampleMeasurementValue(Integer sampleId, Caracteristic caracteristic) { + + Object[] source = queryUnique("sampleMeasurement", + "sampleId", IntegerType.INSTANCE, sampleId, + "pmfmId", IntegerType.INSTANCE, caracteristic.getIdAsInt()); + + Serializable value = null; + if (source != null) { + value = getMeasurementValue(caracteristic, source); + } + + return value; + } + public <S extends SampleEntity> CaracteristicMap extractCommonSampleCaracteristics(S sample) { CaracteristicMap caracteristics = CaracteristicMap.copy(sample.getCaracteristics()); @@ -233,4 +250,31 @@ public class SamplePersistenceHelper extends AbstractPersistenceService { return result; } + protected Serializable getMeasurementValue(Caracteristic caracteristic, Object[] source) { + + Serializable value; + // On commence à 1 car à 0 il y a le pmfmId + int colIndex = 1; +// Integer pmfmId = (Integer) source[colIndex++]; + Float numericalValue = (Float) source[colIndex++]; + String alphanumericalValue = (String) source[colIndex++]; + Integer qualitativeValueId = (Integer) source[colIndex]; + + switch (caracteristic.getCaracteristicType()) { + + case NUMBER: + value = numericalValue; + break; + case QUALITATIVE: + value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId); + break; + case TEXT: + value = alphanumericalValue; + break; + default: + throw new IllegalStateException("Can't deal with caracteristicType: " + caracteristic.getCaracteristicType()); + } + return value; + } + } diff --git a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml index 4d1c4a0..464fa47 100644 --- a/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml +++ b/tutti-persistence/src/main/resources/queries-failsafe.hbm.xml @@ -511,6 +511,24 @@ <query-param name="fishingOperationId" type="java.lang.Integer"/> </query> + <!-- [DAT-23] Get all fishing operations sample ids with a batch for a given taxon (they are all individual observations in Tutti) --> + <query cacheable="true" name="allFishingOperationSampleIdsWithBatchForSpecies"> + <![CDATA[ + SELECT + s.id AS id + FROM + SampleImpl s + WHERE + s.fishingOperation.id = :fishingOperationId + AND s.referenceTaxon.id = :referenceTaxonId + AND s.batch IS NOT NULL + ORDER BY + s.id + ]]> + <query-param name="fishingOperationId" type="java.lang.Integer"/> + <query-param name="referenceTaxonId" type="java.lang.Integer"/> + </query> + <!-- [DAT-23-1] Get all fishing operations samples for a given batch --> <query cacheable="true" name="allFishingOperationSamplesForBatch"> <![CDATA[ @@ -577,6 +595,24 @@ <query-param name="sampleId" type="java.lang.Integer"/> </query> + <!-- [DAT-24] Get sample measurement of a given sample id and pmfm id --> + <query cacheable="true" name="sampleMeasurement"> + <![CDATA[ + SELECT + sm.pmfm.id as pmfmId, + sm.numericalValue as numericalValue, + sm.alphanumericalValue as alphanumericalValue, + sm.qualitativeValue.id as qualitativeValueId + from + SampleMeasurementImpl sm + WHERE + sm.sample.id = :sampleId + AND sm.pmfm.id = :pmfmId + ]]> + <query-param name="sampleId" type="java.lang.Integer"/> + <query-param name="pmfmId" type="java.lang.Integer"/> + </query> + <!--query cacheable="true" name="catchBatch"> <![CDATA[ SELECT diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java index 439a17b..6616593 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/PersistenceService.java @@ -1665,6 +1665,11 @@ public class PersistenceService extends AbstractTuttiService implements TuttiPer } @Override + public boolean isSamplingCodeAvailable(Integer cruiseId, Integer referenceTaxonId, String samplingCodeSuffix) { + return driver.isSamplingCodeAvailable(cruiseId, referenceTaxonId, samplingCodeSuffix); + } + + @Override public Collection<IndividualObservationBatch> createIndividualObservationBatches(Collection<IndividualObservationBatch> individualObservations) { return driver.createIndividualObservationBatches(individualObservations); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java index 3c65cd2..2e29d42 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/sampling/SamplingCodePrefix.java @@ -64,6 +64,10 @@ public class SamplingCodePrefix { return toString() + samplingCodeId; } + public String toSpeciesOnlySamplingCode(int samplingCodeId) { + return species + SEPARATOR + samplingCodeId; + } + /** * Extrait l'id du code (le nombre à la fin) * @param samplingCode -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.