r1246 - in trunk/tutti-service/src: main/java/fr/ifremer/tutti/service/catches main/java/fr/ifremer/tutti/service/sumatra test/java/fr/ifremer/tutti/service/sumatra
Author: tchemit Date: 2013-09-27 18:12:11 +0200 (Fri, 27 Sep 2013) New Revision: 1246 Url: http://forge.codelutin.com/projects/tutti/repository/revisions/1246 Log: fixes #2908: [EXPORT SUMATRA] le nombre d'individus dans la capture est faux Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportService.java trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportServiceTest.java Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-09-27 16:06:45 UTC (rev 1245) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/catches/TuttiWeightComputingService.java 2013-09-27 16:12:11 UTC (rev 1246) @@ -518,6 +518,14 @@ result = categoryWeight; } + // compute number from frequencies + Integer frequencyNumber = 0; + for (SpeciesBatchFrequency frequency : frequencies) { + Integer c = frequency.getNumber(); + frequencyNumber += c; + } + batch.setComputedNumber(frequencyNumber); + } else { result = categoryWeight; } @@ -702,6 +710,13 @@ result = categoryWeight; } + // compute number from frequencies + Integer frequencyNumber = 0; + for (BenthosBatchFrequency frequency : frequencies) { + Integer c = frequency.getNumber(); + frequencyNumber += c; + } + batch.setComputedNumber(frequencyNumber); } else { result = categoryWeight; } Modified: trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportService.java =================================================================== --- trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportService.java 2013-09-27 16:06:45 UTC (rev 1245) +++ trunk/tutti-service/src/main/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportService.java 2013-09-27 16:12:11 UTC (rev 1246) @@ -35,6 +35,7 @@ import fr.ifremer.tutti.persistence.entities.data.BenthosBatch; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.FishingOperation; +import fr.ifremer.tutti.persistence.entities.data.SpeciesAbleBatch; import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch; import fr.ifremer.tutti.persistence.entities.referential.Species; import fr.ifremer.tutti.service.AbstractTuttiService; @@ -99,43 +100,36 @@ BatchContainer<SpeciesBatch> speciesBatchContainer = tuttiWeightComputingService.getComputedSpeciesBatches(operation); - Map<Species, CatchRow> rowMap = Maps.newHashMap(); + Map<Species, CatchRow> rowMap = Maps.newLinkedHashMap(); if (speciesBatchContainer != null) { List<SpeciesBatch> speciesBatches = speciesBatchContainer.getChildren(); for (SpeciesBatch batch : speciesBatches) { Species sp = batch.getSpecies(); - Float weight = batch.getSampleCategoryWeight(); - if (weight == null) { - weight = batch.getSampleCategoryComputedWeight(); - } + int number = Math.round(computeNumber(batch, 1.0f)); - Integer nb = batch.getNumber(); - if (nb == null) { - nb = batch.getComputedNumber(); - } - if (nb == null) { - nb = 0; - } + Float weight = TuttiEntities.getValueOrComputedValue( + batch.getSampleCategoryWeight(), + batch.getSampleCategoryComputedWeight()); + CatchRow row = rowMap.get(sp); if (row == null) { row = new CatchRow(); row.setFishingOperation(operation); row.setSpecies(sp); row.setWeight(weight); - row.setNumber(nb); + row.setNumber(number); } else { row.setWeight(row.getWeight() + weight); - row.setNumber(row.getNumber() + nb); + row.setNumber(row.getNumber() + number); } rowMap.put(sp, row); } rows.addAll(rowMap.values()); } - // add benthos rows BatchContainer<BenthosBatch> benthosBatchContainer = @@ -151,25 +145,19 @@ batch.getSampleCategoryWeight(), batch.getSampleCategoryComputedWeight()); - Integer nb = TuttiEntities.getValueOrComputedValue( - batch.getNumber(), - batch.getComputedNumber()); + int number = Math.round(computeNumber(batch, 1.0f)); - if (nb == null) { - nb = 0; - } - CatchRow row = rowMap.get(sp); if (row == null) { row = new CatchRow(); row.setFishingOperation(operation); row.setSpecies(sp); row.setWeight(weight); - row.setNumber(nb); + row.setNumber(number); } else { row.setWeight(row.getWeight() + weight); - row.setNumber(row.getNumber() + nb); + row.setNumber(row.getNumber() + number); } rowMap.put(sp, row); } @@ -192,4 +180,70 @@ IOUtils.closeQuietly(writer); } } + + protected float computeNumber(SpeciesAbleBatch batch, float rf) { + float result; + + float weight = TuttiEntities.getValueOrComputedValue( + batch.getSampleCategoryWeight(), + batch.getSampleCategoryComputedWeight()); + + if (batch.isChildBatchsEmpty()) { + + // on a leaf, get his weight + + Integer number = TuttiEntities.getValueOrComputedValue( + batch.getNumber(), + batch.getComputedNumber()); + if (number == null) { + + // no count + number = 0; + +// // try to get frequency +// List<SpeciesBatchFrequency> frequencies = +// persistenceService.getAllSpeciesBatchFrequency(batch.getId()); +// if (CollectionUtils.isNotEmpty(frequencies)) { +// +// for (SpeciesBatchFrequency frequency : frequencies) { +// number += frequency.getNumber(); +// } +// } + } + + // get the sample weight + Float subweight = TuttiEntities.getValueOrComputedValue( + batch.getWeight(), + batch.getComputedWeight()); + + if (subweight != null) { + + // with sub sample, update the raising factor + rf *= weight / subweight; + } + + result = number.floatValue() * rf; + } else { + + // get total weight of all childs + float totalWeight = 0.f; + for (SpeciesAbleBatch child : batch.getChildBatchs()) { + totalWeight += TuttiEntities.getValueOrComputedValue( + child.getSampleCategoryWeight(), + child.getSampleCategoryComputedWeight()); + } + + result = 0f; + + float rf2 = rf * weight / totalWeight; + // sum result of each child + for (SpeciesAbleBatch child : batch.getChildBatchs()) { + + result += computeNumber(child, rf2); + } + + } + return result; + } + } Modified: trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportServiceTest.java =================================================================== --- trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportServiceTest.java 2013-09-27 16:06:45 UTC (rev 1245) +++ trunk/tutti-service/src/test/java/fr/ifremer/tutti/service/sumatra/TuttiCatchesSumatraExportServiceTest.java 2013-09-27 16:12:11 UTC (rev 1246) @@ -45,22 +45,23 @@ public static final String PROGRAM_ID = "CAM-TEST_ELEVATION"; - public static final String CRUISE_ID = "100003"; + public static final String CRUISE_BAD_ID = "100003"; - public static final String OPERATION_1_ID = "100112"; + public static final String CRUISE_ID = "100004"; - public static final String OPERATION_2_ID = "100113"; + public static final String OPERATION_1_ID = "100116"; - public static final String OPERATION_3_ID = "100115"; + public static final String OPERATION_BAD_1_ID = "100112"; + public static final String OPERATION_BAD_2_ID = "100113"; + + public static final String OPERATION_BAD_3_ID = "100115"; + public static final String EXPORT_CONTENT = "Station;Espèce;Total;NbIndividus\n" + - "A;Agonus cataphractus;100.0;0;\n" + - "A;Alosa alosa;100.0;0;\n" + - "B;Agonus cataphractus;100.0;0;\n" + - "B;Alosa alosa;100.0;0;\n" + - "B;Abietinaria abietina;30.0;0;\n" + - "B;Acanthocardia echinata;18.0;0;"; + "A;Chama magna;100.0;40;\n" + + "A;Echinogammarus;100.0;416;\n" + + "A;Brissopsis atlantica;100.0;94;"; protected TuttiCatchesSumatraExportService service; @@ -78,17 +79,27 @@ dbResource.openDataContext(); service = serviceContext.getService(TuttiCatchesSumatraExportService.class); + } - dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_ID, 3, - OPERATION_2_ID, - OPERATION_1_ID, - OPERATION_3_ID); + @Test(expected = TuttiWeightComputingException.class) + public void testExportCruiseForSumatraBadCruise() throws Exception { + + dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_BAD_ID, 3, + OPERATION_BAD_2_ID, + OPERATION_BAD_1_ID, + OPERATION_BAD_3_ID); + + File exportFile = new File(dataDirectory, "exportSumatra.csv"); + + service.exportCruiseForSumatra(exportFile, CRUISE_BAD_ID); } - //FIXME Should be able to export sumatra with bad computing weight ? - @Test(expected = TuttiWeightComputingException.class) + @Test public void testExportCruiseForSumatra() throws Exception { + dataContext = dbResource.loadContext(PROGRAM_ID, CRUISE_ID, 1, + OPERATION_1_ID); + File exportFile = new File(dataDirectory, "exportSumatra.csv"); service.exportCruiseForSumatra(exportFile, CRUISE_ID);
participants (1)
-
tchemit@users.forge.codelutin.com