Tony CHEMIT pushed to branch develop-9.0.x at ultreiaio / ird-observe Commits: 4fcb9612 by Tony Chemit at 2022-11-13T15:28:50+01:00 Rapport Liste des captures de faune accessoire selon le type de banc, filtrées par groupe - Closes #2532 - - - - - ec5fe21b by Tony Chemit at 2022-11-13T15:28:50+01:00 GUI - use resetEdit state when reset entry on content table - - - - - 0ae68cbf by Tony Chemit at 2022-11-13T15:28:50+01:00 GUI - Sur échantillons PS observations saisis par lots, migrés vers 9.0, valeurs étranges sur le champ poids individuel - Closes #2503 - - - - - 18be9c7c by Tony Chemit at 2022-11-13T15:28:50+01:00 Rapports Captures/Rejets selon le type d'association - Closes #2530 - - - - - eadf39d0 by Tony Chemit at 2022-11-13T16:05:04+01:00 Rapport Dénombrement des captures accessoires et devenir, filtrées par groupe - Closes #2534 - - - - - 6cc3444c by Tony Chemit at 2022-11-14T07:34:11+01:00 Tck Report - columnHeaders can be null Tck Report - Improve when to deliver asserts - - - - - 6a3376f9 by Tony Chemit at 2022-11-14T13:21:55+01:00 Rapports Distributions de tailles - Closes #2533 - - - - - 6534f2a5 by Tony Chemit at 2022-11-14T13:22:16+01:00 Report API - add safe guard tests (to be able to copy partial matrix) - - - - - c81cfbc3 by Tony Chemit at 2022-11-14T13:22:16+01:00 Report GUI - Manage report with no columns and row headers (everything is coming from the report result to be able to manage dynamic columns) - - - - - 63946e03 by Tony Chemit at 2022-11-14T13:22:16+01:00 Report model - Fix psObservationFobUsageMinimal report (one line escape was missing) - - - - - 4ae9268b by Tony Chemit at 2022-11-14T13:22:16+01:00 Report API - Be able to order variables and repeat variables - - - - - 29db74f1 by Tony Chemit at 2022-11-14T13:22:16+01:00 Report GUI - Respect report variables order in Report model - - - - - 17 changed files: - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/ResetEntry.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SampleUIHandler.java - core/api/dto/src/main/resources/observe-reports.properties - + core/persistence/java/src/main/java/fr/ird/observe/spi/report/ComputePsObservationLengthsDistribution.java - core/services/test/src/main/java/fr/ird/observe/services/service/ReportFixture.java - core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationAccessoryCatchByGroupReportFixture.java → core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationCatchByGroupReportFixture.java - core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationAccessoryCatchReportFixture.java → core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationCatchReportFixture.java - core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportServiceLocalReadTest.java → core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationLengthsDistributionReportFixture.java - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationAccessoryCatch.properties → core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationCatch.properties - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationAccessoryCatchByGroup.properties → core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationCatchByGroup.properties - + core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationLengthsDistribution.properties - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationTargetCatchByAssociation.properties - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationTargetDiscardedByAssociation.properties - toolkit/api/src/main/java/fr/ird/observe/dto/report/DataMatrix.java - toolkit/api/src/main/java/fr/ird/observe/dto/report/ReportBuilder.java Changes: ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java ===================================== @@ -43,10 +43,10 @@ import java.net.URL; import java.nio.file.Files; import java.util.Collections; import java.util.Date; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.TreeMap; import java.util.stream.Collectors; /** @@ -81,7 +81,7 @@ public class ReportModel extends AdminActionModel { /** * les variables utilisées pour le report. */ - protected final Map<String, Object> variables; + protected final Map<String, Object> variables = new LinkedHashMap<>(); /** * la fichier contenant la définition des reports. */ @@ -128,7 +128,6 @@ public class ReportModel extends AdminActionModel { public ReportModel() { super(AdminStep.REPORT); - variables = new TreeMap<>(); // quand le type de modèle change, on mets à jour les rapports disponibles addPropertyChangeListener(REPORT_FILE_PROPERTY_NAME, evt -> updateReports()); } ===================================== client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ResultTableModel.java ===================================== @@ -149,12 +149,11 @@ public class ResultTableModel extends AbstractTableModel { rowNames.addAll(Arrays.asList(report.getRowHeaders())); } - withColumnHeader = !columnNames.isEmpty(); - withRowHeader = !rowNames.isEmpty(); - table.setTableHeader(!withColumnHeader ? null : tableHeader); - table.createDefaultColumnsFromModel(); int nbRows = incomingData.getHeight(); int nbCols = incomingData.getWidth(); + + withColumnHeader = !columnNames.isEmpty(); + withRowHeader = !rowNames.isEmpty(); if (withRowHeader) { // on ajoute une première colonne aux données nbCols += 1; @@ -162,6 +161,22 @@ public class ResultTableModel extends AbstractTableModel { incomingData.setX(1); } + if (!withColumnHeader && !withRowHeader) { + // let's say we always use columns from incomingData + table.setTableHeader(tableHeader); + for (int i = 0; i < nbCols; i++) { + columnNames.add((String) incomingData.getValue(i, 0)); + } + incomingData.setY(-1); + withColumnHeader = true; + nbRows--; + + } else { + table.setTableHeader(!withColumnHeader ? null : tableHeader); + } + table.createDefaultColumnsFromModel(); + + data.setHeight(nbRows); data.setWidth(nbCols); @@ -185,7 +200,9 @@ public class ResultTableModel extends AbstractTableModel { } else if (withColumnHeader) { } - data.copyData(incomingData); + if (nbCols > 0) { + data.copyData(incomingData); + } fireTableStructureChanged(); table.revalidate(); table.repaint(); @@ -220,7 +237,7 @@ public class ResultTableModel extends AbstractTableModel { } public String getClipboardContent(boolean copyRowHeaders, boolean copyColumnHeaders) { - return getDataContent(copyRowHeaders, copyColumnHeaders, true,'\t'); + return getDataContent(copyRowHeaders, copyColumnHeaders, true, '\t'); } public String getCsvContent() { ===================================== client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/actions/entry/ResetEntry.java ===================================== @@ -59,7 +59,12 @@ public final class ResetEntry extends ContentTableUIActionSupport<ContentTableUI } } else { // reset existing entry - tableModel.resetEditBean(); + ui.getStates().setResetEdit(true); + try { + tableModel.resetEditBean(); + } finally { + ui.getStates().setResetEdit(false); + } } } ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SampleUIHandler.java ===================================== @@ -72,12 +72,11 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { private final PropertyChangeListener speciesChanged; public SampleUIHandler() { - weightChanged = evt -> onWeightChanged((Float) evt.getNewValue()); - lengthChanged = evt -> onLengthChanged((Float) evt.getNewValue()); + weightChanged = evt -> onWeightChanged((Float) evt.getNewValue(), !ui.getStates().isResetEdit()); + lengthChanged = evt -> onLengthChanged((Float) evt.getNewValue(), !ui.getStates().isResetEdit()); speciesChanged = evt -> onSpeciesChanged((SpeciesReference) evt.getNewValue()); } - @Override public void onInit(SampleUI ui) { super.onInit(ui); @@ -97,8 +96,8 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { public void onSelectedRowChanged(SampleMeasureDto tableEditBean, SampleMeasureDto previousRowBean, boolean notPersisted, boolean newRow) { - onLengthChanged(tableEditBean.getLength()); - onWeightChanged(tableEditBean.getWeight()); + onLengthChanged(tableEditBean.getLength(), false); + onWeightChanged(tableEditBean.getWeight(), false); SampleUIModel sampleModel = getModel(); @@ -209,6 +208,9 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { } public void startEditTableEditBean(SampleMeasureDto tableEditBean) { + tableEditBean.removePropertyChangeListener(SampleMeasureDto.PROPERTY_WEIGHT, weightChanged); + tableEditBean.removePropertyChangeListener(SampleMeasureDto.PROPERTY_LENGTH, lengthChanged); + tableEditBean.removePropertyChangeListener(SampleMeasureDto.PROPERTY_SPECIES, speciesChanged); tableEditBean.addPropertyChangeListener(SampleMeasureDto.PROPERTY_WEIGHT, weightChanged); tableEditBean.addPropertyChangeListener(SampleMeasureDto.PROPERTY_LENGTH, lengthChanged); tableEditBean.addPropertyChangeListener(SampleMeasureDto.PROPERTY_SPECIES, speciesChanged); @@ -249,9 +251,9 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { acquisitionModeGroup.setSelectedValue(acquisitionMode); } - protected void onWeightChanged(Float newValue) { + protected void onWeightChanged(Float newValue, boolean realChange) { SampleMeasureDto tableEditBean = ui.getModel().getStates().getTableEditBean(); - if (tableEditBean.getAcquisitionMode() == 1) { + if (realChange && tableEditBean.getAcquisitionMode() == 1) { tableEditBean.setIsWeightComputed(false); } if (newValue == null) { @@ -259,9 +261,11 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { } } - protected void onLengthChanged(Float newValue) { + protected void onLengthChanged(Float newValue, boolean realChange) { SampleMeasureDto tableEditBean = ui.getModel().getStates().getTableEditBean(); - tableEditBean.setIsLengthComputed(false); + if (realChange) { + tableEditBean.setIsLengthComputed(false); + } if (newValue == null) { tableEditBean.setLengthMeasureMethod(null); } ===================================== core/api/dto/src/main/resources/observe-reports.properties ===================================== @@ -157,8 +157,8 @@ report.psObservationFobUsageMinimal.request.3=2,0|row|\ Where \ m.id In :tripId \ and dcp.computedWhenArrivingSimplifiedObjectType = :typeObjetId \ - and a.vesselActivity.id != 'fr.ird.referential.ps.common.VesselActivity#1239832675369#0.12552908048322586' -and (dcp.objectOperation.id = 'fr.ird.referential.ps.common.ObjectOperation#0#2' \ + and a.vesselActivity.id != 'fr.ird.referential.ps.common.VesselActivity#1239832675369#0.12552908048322586' \ + and (dcp.objectOperation.id = 'fr.ird.referential.ps.common.ObjectOperation#0#2' \ or dcp.objectOperation.id = 'fr.ird.referential.ps.common.ObjectOperation#0#8' \ or dcp.objectOperation.id = 'fr.ird.referential.ps.common.ObjectOperation#0#4' \ or dcp.objectOperation.id = 'fr.ird.referential.ps.common.ObjectOperation#0#5' \ @@ -567,6 +567,140 @@ report.psObservationSetByAssociation.request.8=3,1|column|\ and os.topiaId = 'fr.ird.referential.ps.common.ObservedSystem#1239832686428#0.9217864901728908' \ and os not in elements(a.observedSystem) ################################################################################ +## Captures thons selon le type d'association +################################################################################ +report.psObservationTargetCatchByAssociation.modelType=PS +report.psObservationTargetCatchByAssociation.name=Observations - Captures de thons selon le type d’association (en t) +report.psObservationTargetCatchByAssociation.description=Afficher la répartitions des captures de thons selon le type d'association +report.psObservationTargetCatchByAssociation.columns=YFT, SKJ, BET, LTA, FRI, Autres, Total +report.psObservationTargetCatchByAssociation.rows=BL sans baleine, BL avec baleine, BO avec requin-baleine, BO sans requin-baleine, Total +report.psObservationTargetCatchByAssociation.operations.1=SumRow +report.psObservationTargetCatchByAssociation.operations.2=SumColumn +# ligne 1 +report.psObservationTargetCatchByAssociation.request.1=0,0|row|\ + Select \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then 0.0 \ + Else ct.catchWeight End) \ + From TripImpl m \ + Join m.routeObs r \ + Join r.activity a \ + Join a.set c \ + with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#2' \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = FALSE, \ + ObservedSystemImpl os \ + Where \ + m.id In :tripId \ + and os.topiaId = 'fr.ird.referential.ps.common.ObservedSystem#1239832686428#0.9395222812356602' \ + and os not in elements(a.observedSystem) +# ligne 2 +report.psObservationTargetCatchByAssociation.request.7=0,1|row|\ + Select \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then 0.0 \ + Else ct.catchWeight End) \ + From TripImpl m \ + Join m.routeObs r \ + Join r.activity a \ + Join a.set c \ + with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#2' \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = FALSE, \ + ObservedSystemImpl os \ + Where \ + m.id In :tripId \ + and os.topiaId = 'fr.ird.referential.ps.common.ObservedSystem#1239832686428#0.9395222812356602' \ + and os in elements(a.observedSystem) +# ligne 3 +report.psObservationTargetCatchByAssociation.request.13=0,2|row|\ + Select \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then 0.0 \ + Else ct.catchWeight End) \ + From TripImpl m \ + Join m.routeObs r \ + Join r.activity a \ + Join a.set c \ + with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#1' \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = FALSE, \ + ObservedSystemImpl os \ + Where \ + m.id In :tripId \ + and os.topiaId = 'fr.ird.referential.ps.common.ObservedSystem#1239832686428#0.9217864901728908' \ + and os in elements(a.observedSystem) +# ligne 4 +report.psObservationTargetCatchByAssociation.request.19=0,3|row|\ + Select \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then ct.catchWeight \ + Else 0.0 End), \ + Sum(CASE ct.species.topiaId When 'fr.ird.referential.common.Species#1239832685474#0.8943253454598569' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685474#0.975344121171992' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685475#0.13349466123905152' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.8024257002747615' Then 0.0 \ + When 'fr.ird.referential.common.Species#1239832685477#0.3846921632590058' Then 0.0 \ + Else ct.catchWeight End) \ + From TripImpl m \ + Join m.routeObs r \ + Join r.activity a \ + Join a.set c \ + with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#1' \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = FALSE, \ + ObservedSystemImpl os \ + Where \ + m.id In :tripId \ + and os.topiaId = 'fr.ird.referential.ps.common.ObservedSystem#1239832686428#0.9217864901728908' \ + and os not in elements(a.observedSystem) +################################################################################ ## Rejets thons selon le type d'association ################################################################################ report.psObservationTargetDiscardedByAssociation.modelType=PS @@ -600,7 +734,8 @@ report.psObservationTargetDiscardedByAssociation.request.1=0,0|row|\ Join r.activity a \ Join a.set c \ with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#2' \ - Join c.catches ct, \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = TRUE, \ ObservedSystemImpl os \ Where \ m.id In :tripId \ @@ -630,7 +765,8 @@ report.psObservationTargetDiscardedByAssociation.request.7=0,1|row|\ Join r.activity a \ Join a.set c \ with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#2' \ - Join c.catches ct, \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = TRUE, \ ObservedSystemImpl os \ Where \ m.id In :tripId \ @@ -660,7 +796,8 @@ report.psObservationTargetDiscardedByAssociation.request.13=0,2|row|\ Join r.activity a \ Join a.set c \ with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#1' \ - Join c.catches ct, \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = TRUE, \ ObservedSystemImpl os \ Where \ m.id In :tripId \ @@ -690,33 +827,34 @@ report.psObservationTargetDiscardedByAssociation.request.19=0,3|row|\ Join r.activity a \ Join a.set c \ with c.schoolType.id = 'fr.ird.referential.ps.common.SchoolType#0#1' \ - Join c.catches ct, \ + Join c.catches ct \ + Join ct.speciesFate sf with sf.discard = TRUE, \ ObservedSystemImpl os \ Where \ m.id In :tripId \ and os.topiaId = 'fr.ird.referential.ps.common.ObservedSystem#1239832686428#0.9217864901728908' \ and os not in elements(a.observedSystem) ################################################################################ -## Captures accessoires observées +## Captures observées ################################################################################ -report.psObservationAccessoryCatch.modelType=PS -report.psObservationAccessoryCatch.name=Observations - Liste des captures accessoires selon le type de banc, filtrées par groupe -report.psObservationAccessoryCatch.description=Afficher les captures accessoires par groupe d'espèce\nLes poids sont exprimés en tonnes. -report.psObservationAccessoryCatch.columns=Espèce, Banc libre, Banc objet -report.psObservationAccessoryCatch.variable.speciesGroup=fr.ird.observe.dto.referential.common.SpeciesGroupDto|From SpeciesGroupImpl ge Order By ge.code -report.psObservationAccessoryCatch.repeatVariable.speciesId=java.lang.String|\ +report.psObservationCatch.modelType=PS +report.psObservationCatch.name=Observations - Liste des captures selon le type de banc, filtrées par groupe +report.psObservationCatch.description=Afficher les captures par groupe d'espèce\nLes poids sont exprimés en tonnes. +report.psObservationCatch.columns=Espèce, Banc libre, Banc objet +report.psObservationCatch.variable.speciesGroup=fr.ird.observe.dto.referential.common.SpeciesGroupDto|From SpeciesGroupImpl ge Order By ge.code +report.psObservationCatch.repeatVariable.speciesId=java.lang.String|\ Select e.id From SpeciesImpl e \ Where e.speciesGroup.id = :speciesGroup \ Order By e.homeId -report.psObservationAccessoryCatch.request.1=0,0|row|\ +report.psObservationCatch.request.1=0,0|row|\ Select \ concat('[FAO]', (case when e.faoCode is not null then e.faoCode else '-' end), \ ' [sc]', (case when e.scientificLabel is not null then e.scientificLabel else '-' end), \ ' [fr]', (case when e.label2 is not null then e.label2 else '-' end)) \ From SpeciesImpl e \ Where e.id = :speciesId -report.psObservationAccessoryCatch.request.1.repeat=speciesId|column -report.psObservationAccessoryCatch.request.2=1,0|row|\ +report.psObservationCatch.request.1.repeat=speciesId|column +report.psObservationCatch.request.2=1,0|row|\ Select \ case when Count(ca) > 0 then \ concat('+', \ @@ -731,8 +869,8 @@ report.psObservationAccessoryCatch.request.2=1,0|row|\ Join c.catches ca \ with ca.species.id = :speciesId \ Where m.id In :tripId -report.psObservationAccessoryCatch.request.2.repeat=speciesId|column -report.psObservationAccessoryCatch.request.3=2,0|row|\ +report.psObservationCatch.request.2.repeat=speciesId|column +report.psObservationCatch.request.3=2,0|row|\ Select \ case when Count(ca) > 0 then \ concat('+', \ @@ -747,16 +885,16 @@ report.psObservationAccessoryCatch.request.3=2,0|row|\ Join c.catches ca \ with ca.species.id = :speciesId \ Where m.id In :tripId -report.psObservationAccessoryCatch.request.3.repeat=speciesId|column +report.psObservationCatch.request.3.repeat=speciesId|column ################################################################################ -## Captures accessoires par speciesGroup d'espèces +## Captures par groupe d'espèces ################################################################################ -report.psObservationAccessoryCatchByGroup.modelType=PS -report.psObservationAccessoryCatchByGroup.name=Observations - Dénombrement des captures accessoires et devenir, filtrés par groupe -report.psObservationAccessoryCatchByGroup.description=Afficher les nombres de captures accessoires par groupe d'espèce selon le type de banc et le devenir -report.psObservationAccessoryCatchByGroup.columns=Espèce, Total BL, Total BO, Sorti vivant/échappé, Sorti mort, Rejeté vivant, Rejeté mort, Partiellement conservé, Cuve, Cuisine, Autre -report.psObservationAccessoryCatchByGroup.variable.speciesGroup=fr.ird.observe.dto.referential.common.SpeciesGroupDto|From SpeciesGroupImpl ge Order By ge.code -report.psObservationAccessoryCatchByGroup.request.1=0,0|row|\ +report.psObservationCatchByGroup.modelType=PS +report.psObservationCatchByGroup.name=Observations - Dénombrement des captures par devenir, filtrés par groupe +report.psObservationCatchByGroup.description=Afficher les nombres de captures par groupe d'espèce selon le type de banc et le devenir +report.psObservationCatchByGroup.columns=Espèce, Total BL, Total BO, Sorti vivant/échappé, Sorti mort, Rejeté vivant, Rejeté mort, Partiellement conservé, Cuve, Cuisine, Conservé pour le marché local ou poisson séché/salé à bord, Ailerons seulements, Rejeté statut inconnu (seulement pour l'observation électronique), Conservé à des fins scientifiques, Rejeté suffocant, Rejeté blessé, Autre +report.psObservationCatchByGroup.variable.speciesGroup=fr.ird.observe.dto.referential.common.SpeciesGroupDto|From SpeciesGroupImpl ge Order By ge.code +report.psObservationCatchByGroup.request.1=0,0|row|\ Select \ concat(\ '[FAO]', (case when e.faoCode is not null then e.faoCode else '-' end), \ @@ -779,6 +917,12 @@ report.psObservationAccessoryCatchByGroup.request.1=0,0|row|\ else 0.0 end), \ Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.6728026426066158' then ca.totalCount \ else 0.0 end), \ + Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1464000000000#15' then ca.totalCount else 0.0 end), \ + Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1467372855729#0.568287924081734' then ca.totalCount else 0.0 end), \ + Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1501492537510#0.9210847837998154' then ca.totalCount else 0.0 end), \ + Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1501492831539#0.9377232562184147' then ca.totalCount else 0.0 end), \ + Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1544448835551#0.620629930572886' then ca.totalCount else 0.0 end), \ + Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1544448977865#0.24265421995390768' then ca.totalCount else 0.0 end), \ Sum(case ca.speciesFate.id when 'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.9931091059863436' then 0.0 \ when 'fr.ird.referential.ps.common.SpeciesFate#1239832683618#0.06155887805368032' then 0.0 \ when 'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.11883784875534997' then 0.0 \ @@ -787,6 +931,12 @@ report.psObservationAccessoryCatchByGroup.request.1=0,0|row|\ when 'fr.ird.referential.ps.common.SpeciesFate#1239832683620#0.46609703818634485' then 0.0 \ when 'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.5722739932065866' then 0.0 \ when 'fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.6728026426066158' then 0.0 \ + when 'fr.ird.referential.ps.common.SpeciesFate#1464000000000#15' then 0.0 \ + when 'fr.ird.referential.ps.common.SpeciesFate#1467372855729#0.568287924081734' then 0.0 \ + when 'fr.ird.referential.ps.common.SpeciesFate#1501492537510#0.9210847837998154' then 0.0 \ + when 'fr.ird.referential.ps.common.SpeciesFate#1501492831539#0.9377232562184147' then 0.0 \ + when 'fr.ird.referential.ps.common.SpeciesFate#1544448835551#0.620629930572886' then 0.0 \ + when 'fr.ird.referential.ps.common.SpeciesFate#1544448977865#0.24265421995390768' then 0.0 \ else ca.totalCount end) \ From TripImpl m \ Join m.routeObs r \ @@ -799,6 +949,47 @@ report.psObservationAccessoryCatchByGroup.request.1=0,0|row|\ Group by e \ Order By e.homeId ########################################################### +## Distribution des tailles par espèces et type de mesure +########################################################### +report.psObservationLengthsDistribution.modelType=PS +report.psObservationLengthsDistribution.name=Observations - Distribution des tailles par espèces et type de mesure +report.psObservationLengthsDistribution.description=Afficher la nombre d'individus mesurés par classe de taille pour les espèces et le type de mesure +report.psObservationLengthsDistribution.operations.1=ComputePsObservationLengthsDistribution +report.psObservationLengthsDistribution.variable.1.species=fr.ird.observe.dto.referential.common.SpeciesDto|\ +Select distinct ntl.species \ +From TripImpl t \ +Join t.routeObs r \ +Join r.activity a \ +Join a.set.sample nts \ +Join nts.sampleMeasure ntl \ +Where t.id In :tripId +report.psObservationLengthsDistribution.variable.2.sizeMeasureType=fr.ird.observe.dto.referential.common.SizeMeasureTypeDto|\ +Select distinct ntl.sizeMeasureType \ +From TripImpl t \ +Join t.routeObs r \ +Join r.activity a \ +Join a.set.sample nts \ +Join nts.sampleMeasure ntl \ +Where t.id In :tripId +report.psObservationLengthsDistribution.repeatVariable.speciesFate=fr.ird.observe.entities.referential.ps.common.SpeciesFate|\ +Select distinct sf \ +From TripImpl t \ +Join t.routeObs r \ +Join r.activity a \ +Join a.set.sample nts \ +Join nts.sampleMeasure ntl with ntl.species.id = :species And ntl.sizeMeasureType.id = :sizeMeasureType \ +Left Join ntl.speciesFate sf \ +Where t.id In :tripId +report.psObservationLengthsDistribution.repeatVariable.length=java.lang.Float|\ +Select distinct ntl.length \ +From TripImpl t \ +Join t.routeObs r \ +Join r.activity a \ +Join a.set.sample nts \ +Join nts.sampleMeasure ntl with ntl.species.id = :species And ntl.sizeMeasureType.id = :sizeMeasureType \ +Where t.id In :tripId \ +Order By ntl.length +########################################################### ## Distribution des tailles par espèces non ciblées ########################################################### report.psObservationNonTargetDistributionLengths.modelType=PS ===================================== core/persistence/java/src/main/java/fr/ird/observe/spi/report/ComputePsObservationLengthsDistribution.java ===================================== @@ -0,0 +1,161 @@ +package fr.ird.observe.spi.report; + +/*- + * #%L + * ObServe Core :: Persistence :: Java + * %% + * Copyright (C) 2008 - 2022 IRD, Ultreia.io + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.auto.service.AutoService; +import fr.ird.observe.dto.report.DataMatrix; +import fr.ird.observe.dto.report.Report; +import fr.ird.observe.dto.report.ReportOperationConsumer; +import fr.ird.observe.dto.report.ReportRequestExecutor; +import fr.ird.observe.dto.report.ReportVariable; +import fr.ird.observe.entities.referential.ps.common.SpeciesFate; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.stream.Collectors; + +/** + * Created on 13/11/2022. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.17 + */ +@AutoService(ReportOperationConsumer.class) +public class ComputePsObservationLengthsDistribution implements ReportOperationConsumer { + + /** + * To get total count per length. + */ + public static final String TOTAL_COUNT_REQUEST = "" + + "Select sum(ntl.count) \n" + + "From TripImpl t \n" + + "Join t.routeObs r \n" + + "Join r.activity a \n" + + "Join a.set.sample nts \n" + + "Join nts.sampleMeasure ntl With ntl.species.id = :species And ntl.sizeMeasureType.id = :sizeMeasureType \n" + + "Where t.id In :tripId \n" + + "Group By ntl.length \n" + + "Order By ntl.length"; + + /** + * To get species fate count per length + */ + public static final String SPECIES_FATE_COUNT_REQUEST = "" + + "Select ntl.length, sum(ntl.count) \n" + + "From TripImpl t \n" + + "Join t.routeObs r \n" + + "Join r.activity a \n" + + "Join a.set.sample nts \n" + + "Join nts.sampleMeasure ntl With ntl.species.id = :species And ntl.sizeMeasureType.id = :sizeMeasureType And ntl.speciesFate.id = :speciesFate\n" + + "Where t.id In :tripId \n" + + "Group By ntl.length \n" + + "Order By ntl.length"; + + /** + * To get null species fate count per length + */ + public static final String NULL_SPECIES_FATE_COUNT_REQUEST = "" + + "Select ntl.length, sum(ntl.count) \n" + + "From TripImpl t \n" + + "Join t.routeObs r \n" + + "Join r.activity a \n" + + "Join a.set.sample nts \n" + + "Join nts.sampleMeasure ntl With ntl.species.id = :species And ntl.sizeMeasureType.id = :sizeMeasureType And ntl.speciesFate Is Null\n" + + "Where t.id In :tripId \n" + + "Group By ntl.length \n" + + "Order By ntl.length"; + + @Override + public DataMatrix consume(String parameters, ReportRequestExecutor requestExecutor, Report report, Set<String> tripId, DataMatrix incoming) { + + Map<String, Object> queryParameters = new TreeMap<>(); + queryParameters.put("tripId", tripId); + for (ReportVariable<?> variable : report.getVariables()) { + queryParameters.put(variable.getName(), variable.getSelectedValue()); + } + + Set<SpeciesFate> speciesFateList = report.<SpeciesFate>getRepeatVariable("speciesFate").getValues(); + List<String> lengthList = report.getRepeatVariable("length").getValues().stream().map(Object::toString).collect(Collectors.toList()); + + DataMatrix result = createTmpMatrix(0, 0, 2 + speciesFateList.size(), 1 + lengthList.size()); + boolean useNullSpeciesFate = speciesFateList.remove(null); + int columnIndex = 0; + fillLengthsColumn(result, columnIndex++, lengthList); + + for (SpeciesFate speciesFate : speciesFateList) { + fillSpeciesFateCountColumn(result, columnIndex++, queryParameters, speciesFate, lengthList, requestExecutor); + } + + if (useNullSpeciesFate) { + fillSpeciesFateCountColumn(result, columnIndex++, queryParameters, null, lengthList, requestExecutor); + } + + fillTotalCountColumn(result, columnIndex, queryParameters, requestExecutor); + + return result; + } + + private void fillLengthsColumn(DataMatrix result, int columnIndex, List<String> lengthList) { + int index = 0; + result.setValue(columnIndex, index++, "Classe de taille (cm)"); + for (String length : lengthList) { + result.setValue(columnIndex, index++, length); + } + } + + private void fillSpeciesFateCountColumn(DataMatrix result, int columnIndex, Map<String, Object> queryParameters, SpeciesFate speciesFate, List<String> lengthList, ReportRequestExecutor requestExecutor) { + String header; + List<Object[]> rows; + if (speciesFate == null) { + header = "Aucun"; + queryParameters.remove("speciesFate"); + rows = requestExecutor.executeRequest(NULL_SPECIES_FATE_COUNT_REQUEST, queryParameters); + } else { + header = speciesFate.getLabel2(); + queryParameters.put("speciesFate", speciesFate.getId()); + rows = requestExecutor.executeRequest(SPECIES_FATE_COUNT_REQUEST, queryParameters); + } + result.setValue(columnIndex, 0, String.format("Effectif ( devenir - %s )", header)); + + for (Object[] row : rows) { + String length = row[0].toString(); + Number count = (Number) row[1]; + int index = lengthList.indexOf(length); + result.setValue(columnIndex, index + 1, count); + } + } + + private void fillTotalCountColumn(DataMatrix result, int columnIndex, Map<String, Object> queryParameters, ReportRequestExecutor requestExecutor) { + result.setValue(columnIndex, 0, "Effectif total"); + List<Object> rows = requestExecutor.executeRequest(TOTAL_COUNT_REQUEST, queryParameters); + int index = 1; + for (Object row : rows) { + Number count = (Number) row; + result.setValue(columnIndex, index++, count); + } + } + +} + ===================================== core/services/test/src/main/java/fr/ird/observe/services/service/ReportFixture.java ===================================== @@ -76,6 +76,7 @@ public abstract class ReportFixture { } public final DataMatrix execute(ReportService service, Report report) { + log.warn("Starting report {}", report.getName()); return service.executeReport(report, getTripIds()); } @@ -127,6 +128,8 @@ public abstract class ReportFixture { for (int i = 0; i < rows; i++) { ReportServiceFixtures.writeArrayAssert(String.format("result.%d", i), actual.getData()[i]); } + System.out.println("New asserts:\n" + String.join("\n", ReportServiceFixtures.getAsserts())); + ReportServiceFixtures.getAsserts().clear(); } } @@ -159,7 +162,11 @@ public abstract class ReportFixture { Assert.assertEquals(rows, report.getRows()); Assert.assertEquals(columns, report.getColumns()); - Assert.assertArrayEquals(columnsHeader, report.getColumnHeaders()); + if (report.getColumnHeaders() == null) { + Assert.assertEquals(0, columnsHeader.length); + } else { + Assert.assertArrayEquals(columnsHeader, report.getColumnHeaders()); + } if (report.getRowHeaders() == null) { Assert.assertEquals(0, rowsHeader.length); } else { @@ -168,7 +175,11 @@ public abstract class ReportFixture { } else { ReportServiceFixtures.addAssert("syntax.rows", report.getRows()); ReportServiceFixtures.addAssert("syntax.columns", report.getColumns()); - ReportServiceFixtures.writeArrayAssert("syntax.columnsHeader", (Object[]) report.getColumnHeaders()); + if (report.getRowHeaders() == null) { + ReportServiceFixtures.writeArrayAssert("syntax.columnsHeader"); + } else { + ReportServiceFixtures.writeArrayAssert("syntax.columnsHeader", (Object[]) report.getColumnHeaders()); + } if (report.getRowHeaders() == null) { ReportServiceFixtures.writeArrayAssert("syntax.rowsHeader"); } else { ===================================== core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationAccessoryCatchByGroupReportFixture.java → core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationCatchByGroupReportFixture.java ===================================== @@ -35,7 +35,7 @@ import java.util.Iterator; * @since 1.9 */ @AutoService(ReportFixture.class) -public class PsObservationAccessoryCatchByGroupReportFixture extends ReportFixture { +public class PsObservationCatchByGroupReportFixture extends ReportFixture { @Override public void assertSyntax(Report report) { ===================================== core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationAccessoryCatchReportFixture.java → core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationCatchReportFixture.java ===================================== @@ -36,7 +36,7 @@ import java.util.Iterator; * @since 1.9 */ @AutoService(ReportFixture.class) -public class PsObservationAccessoryCatchReportFixture extends ReportFixture { +public class PsObservationCatchReportFixture extends ReportFixture { @Override public void assertSyntax(Report report) { ===================================== core/services/local/src/test/java/fr/ird/observe/services/local/service/ReportServiceLocalReadTest.java → core/services/test/src/main/java/fr/ird/observe/services/service/report/ps/PsObservationLengthsDistributionReportFixture.java ===================================== @@ -1,8 +1,8 @@ -package fr.ird.observe.services.local.service; +package fr.ird.observe.services.service.report.ps; /*- * #%L - * ObServe Core :: Services :: Local + * ObServe Core :: Services :: Test * %% * Copyright (C) 2008 - 2022 IRD, Ultreia.io * %% @@ -22,17 +22,23 @@ package fr.ird.observe.services.local.service; * #L% */ -import fr.ird.observe.services.service.ReportServiceFixtures; -import org.junit.AfterClass; +import com.google.auto.service.AutoService; +import fr.ird.observe.dto.report.Report; +import fr.ird.observe.services.service.ReportFixture; -public class ReportServiceLocalReadTest extends GeneratedReportServiceLocalReadTest { +/** + * Created on 13/11/2022. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.17 + */ +@AutoService(ReportFixture.class) +public class PsObservationLengthsDistributionReportFixture extends ReportFixture { - @AfterClass - public static void afterClass() { - if (!ReportServiceFixtures.WITH_ASSERT) { - System.out.println("New asserts:\n" + String.join("\n", ReportServiceFixtures.getAsserts())); - ReportServiceFixtures.getAsserts().clear(); - } + @Override + protected void setVariables(Report report) { + setVariableValue(report, "species", "fr.ird.referential.common.Species#1239832684537#0.2397229787936519"); + setVariableValue(report, "sizeMeasureType", "fr.ird.referential.common.SizeMeasureType#1433499465700#0.0902433863375336"); } - } + ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationAccessoryCatch.properties → core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationCatch.properties ===================================== @@ -19,8 +19,24 @@ # <http://www.gnu.org/licenses/gpl-3.0.html>. # #L% ### +syntax.name=Observations - Liste des captures selon le type de banc, filtrées par groupe +syntax.description=Afficher les captures par groupe d'espèce-Les poids sont exprimés en tonnes. +syntax.columns=3 +syntax.rows=-1 +syntax.columnsHeader=Espèce^Banc libre^Banc objet +syntax.nbRequests=3 +result.columns=3 +result.rows=49 result.0=[FAO]CCB [sc]Carcharhinus brevipinna [fr]Requin tisserand^-^- result.1=[FAO]ALS [sc]Carcharhinus albimarginatus [fr]Requin pointe blanche^-^- +result.2=[FAO]AML [sc]Carcharhinus amblyrhynchos [fr]Grey reef shark^-^- +result.3=[FAO]PTH [sc]Alopias pelagicus [fr]Renard pélagique^-^- +result.4=[FAO]BTH [sc]Alopias superciliosus [fr]Renard à gros yeux^-^- +result.5=[FAO]ALV [sc]Alopias vulpinus [fr]Renard^-^+ Effectif : 3 Poids total (t) : 12.0 +result.6=[FAO]BLR [sc]Carcharhinus melanopterus [fr]Requin pointes noires^-^- +result.7=[FAO]BRO [sc]Carcharhinus brachyurus [fr]Requin cuivre^-^- +result.8=[FAO]WSH [sc]Carcharodon carcharias [fr]Grand requin blanc^-^- +result.9=[FAO]CCE [sc]Carcharhinus leucas [fr]Requin bouledogue^-^- result.10=[FAO]CCL [sc]Carcharhinus limbatus [fr]Requin bordé^-^- result.11=[FAO]CCP [sc]Carcharhinus plumbeus [fr]Requin gris^-^- result.12=[FAO]FAL [sc]Carcharhinus falciformis [fr]Requin soyeux^-^- @@ -28,10 +44,9 @@ result.13=[FAO]OCS [sc]Carcharhinus longimanus [fr]Requin océanique^-^- result.14=[FAO]CWZ [sc]Carcharhinus spp [fr]Requins Carcharhinus nca^-^- result.15=[FAO]DUS [sc]Carcharhinus obscurus [fr]Requin sombre^-^- result.16=[FAO]SHL [sc]Etmopterus spp [fr]Genre Etmopterus^-^- -result.17=[FAO]THR [sc]Alopias spp [fr]Renards de mer nca ^-^- +result.17=[FAO]THR [sc]Alopias spp [fr]Renards de mer nca^-^- result.18=[FAO]RSK [sc]Carcharhinidae spp [fr]Famille Carcharhinidae^-^- result.19=[FAO]MSK [sc]Lamnidae [fr]Famille Lamnidae^-^- -result.2=[FAO]AML [sc]Carcharhinus amblyrhynchos [fr]Grey reef shark^-^- result.20=[FAO]2FOD [sc]Odontaspididae [fr]Odontaspididae^-^- result.21=[FAO]2FRH [sc]Rhincodontidae [fr]Famille Rhincodontidae^-^- result.22=[FAO]SPY [sc]Sphyrnidae [fr]Famille Sphyrnidae^-^- @@ -42,18 +57,16 @@ result.26=[FAO]LMA [sc]Isurus paucus [fr]Petite taupe, Mako^-^- result.27=[FAO]MAK [sc]Isurus spp [fr]Taupes^-^- result.28=[FAO]LMP [sc]Megachasma pelagios [fr]Requin grande gueule^-^- result.29=[FAO]CVX [sc]Carcharhiniformes [fr]Ordre Carcharhiniformes^-^- -result.3=[FAO]PTH [sc]Alopias pelagicus [fr]Renard pélagique^-^- result.30=[FAO]HDQ [sc]Heterodontiformes [fr]Ordre Heterodontiformes^-^- result.31=[FAO]HXW [sc]Hexanchiformes [fr]Ordre Hexanchiformes^-^- result.32=[FAO]LMZ [sc]Lamniformes [fr]Ordre Lamniformes^-^- result.33=[FAO]OCX [sc]Orectolobiformes [fr]Ordre Orectolobiformes^-^- -result.34=[FAO]PWS [sc]Pristiophorus spp [fr]Requins-scies nca ^-^- +result.34=[FAO]PWS [sc]Pristiophorus spp [fr]Requins-scies nca^-^- result.35=[FAO]OSF [sc]Stegostoma fasciatum [fr]Requin zèbre^-^- result.36=[FAO]SHX [sc]Squaliformes [fr]Ordre Squaliformes^-^- -result.37=[FAO]ASK [sc]Squatinidae [fr]Anges de mer nca ^-^- +result.37=[FAO]ASK [sc]Squatinidae [fr]Anges de mer nca^-^- result.38=[FAO]BSH [sc]Prionace glauca [fr]Peau bleue^-^- result.39=[FAO]POR [sc]Lamna nasus [fr]Requin taupe commun^-^- -result.4=[FAO]BTH [sc]Alopias superciliosus [fr]Renard à gros yeux^-^- result.40=[FAO]PSK [sc]Pseudocarcharias kamoharai [fr]Requin crocodile^-^- result.41=[FAO]2REX [sc]Requin non identifié [fr]Requin non identifié^-^- result.42=[FAO]BSK [sc]Cetorhinus maximus [fr]Requin pèlerin^-^- @@ -63,17 +76,3 @@ result.45=[FAO]SPL [sc]Sphyrna lewini [fr]Requin marteau halicorne^-^- result.46=[FAO]SPK [sc]Sphyrna mokarran [fr]Grand requin marteau^-^- result.47=[FAO]SPN [sc]Sphyrna spp [fr]Requins marteau nca^-^- result.48=[FAO]SPZ [sc]Sphyrna zygaena [fr]Requin marteau commun^-^- -result.5=[FAO]ALV [sc]Alopias vulpinus [fr]Renard^-^+ Effectif : 3 Poids total (t) : 12.0 -result.6=[FAO]BLR [sc]Carcharhinus melanopterus [fr]Requin pointes noires^-^- -result.7=[FAO]BRO [sc]Carcharhinus brachyurus [fr]Requin cuivre^-^- -result.8=[FAO]WSH [sc]Carcharodon carcharias [fr]Grand requin blanc^-^- -result.9=[FAO]CCE [sc]Carcharhinus leucas [fr]Requin bouledogue^-^- -result.columns=3 -result.rows=49 -syntax.columns=3 -syntax.columnsHeader=Espèce^Banc libre^Banc objet -syntax.description=Afficher les captures accessoires par groupe d'espèce-Les poids sont exprimés en tonnes. -syntax.name=Observations - Liste des captures accessoires selon le type de banc, filtrées par groupe -syntax.nbRequests=3 -syntax.rows=-1 -syntax.rowsHeader= ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationAccessoryCatchByGroup.properties → core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationCatchByGroup.properties ===================================== @@ -19,13 +19,13 @@ # <http://www.gnu.org/licenses/gpl-3.0.html>. # #L% ### -result.0=[FAO]ALV [sc]Alopias vulpinus [fr]Renard^0^3^3^0^0^0^0^0^0^0.0 -result.columns=11 +result.0=[FAO]ALV [sc]Alopias vulpinus [fr]Renard^0^3^3^0^0^0^0^0^0^0^0^0^0^0^0^0.0 +result.columns=17 result.rows=1 -syntax.columns=11 -syntax.columnsHeader=Espèce^Total BL^Total BO^Sorti vivant/échappé^Sorti mort^Rejeté vivant^Rejeté mort^Partiellement conservé^Cuve^Cuisine^Autre -syntax.description=Afficher les nombres de captures accessoires par groupe d'espèce selon le type de banc et le devenir -syntax.name=Observations - Dénombrement des captures accessoires et devenir, filtrés par groupe +syntax.columns=17 +syntax.columnsHeader=Espèce^Total BL^Total BO^Sorti vivant/échappé^Sorti mort^Rejeté vivant^Rejeté mort^Partiellement conservé^Cuve^Cuisine^Conservé pour le marché local ou poisson séché/salé à bord^Ailerons seulements^Rejeté statut inconnu (seulement pour l'observation électronique)^Conservé à des fins scientifiques^Rejeté suffocant^Rejeté blessé^Autre +syntax.description=Afficher les nombres de captures par groupe d'espèce selon le type de banc et le devenir +syntax.name=Observations - Dénombrement des captures par devenir, filtrés par groupe syntax.nbRequests=1 syntax.rows=-1 syntax.rowsHeader= ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationLengthsDistribution.properties ===================================== @@ -0,0 +1,35 @@ +### +# #%L +# ObServe Core :: Services :: Test +# %% +# Copyright (C) 2008 - 2022 IRD, Ultreia.io +# %% +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program. If not, see +# <http://www.gnu.org/licenses/gpl-3.0.html>. +# #L% +### +syntax.name=Observations - Distribution des tailles par espèces et type de mesure +syntax.description=Afficher la nombre d'individus mesurés par classe de taille pour les espèces et le type de mesure +syntax.rows=-1 +syntax.columns=-1 +syntax.columnsHeader= +syntax.rowsHeader= +syntax.nbRequests=0 +result.columns=3 +result.rows=5 +result.0=Classe de taille (cm)^Effectif ( devenir - Aucun )^Effectif total +result.1=50.0^2^2 +result.2=54.0^1^1 +result.3=68.0^1^1 +result.4=70.0^1^1 ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationTargetCatchByAssociation.properties ===================================== @@ -19,3 +19,17 @@ # <http://www.gnu.org/licenses/gpl-3.0.html>. # #L% ### +syntax.name=Observations - Captures de thons selon le type d’association (en t) +syntax.description=Afficher la répartitions des captures de thons selon le type d'association +syntax.rows=5 +syntax.columns=7 +syntax.columnsHeader=YFT^SKJ^BET^LTA^FRI^Autres^Total +syntax.rowsHeader=BL sans baleine^BL avec baleine^BO avec requin-baleine^BO sans requin-baleine^Total +syntax.nbRequests=4 +result.columns=7 +result.rows=5 +result.0=175.0^0.0^7.0^0.0^0.0^0.0^182.0 +result.1=null^null^null^null^null^null^0.0 +result.2=null^null^null^null^null^null^0.0 +result.3=0.0^1.0^0.0^0.0^1.0^12.1406^14.1406 +result.4=175.0^1.0^7.0^0.0^1.0^12.1406^196.1406 \ No newline at end of file ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/ReportService-psObservationTargetDiscardedByAssociation.properties ===================================== @@ -19,11 +19,11 @@ # <http://www.gnu.org/licenses/gpl-3.0.html>. # #L% ### -result.0=175.0^0.0^7.0^0.0^0.0^0.2882^182.2882 +result.0=0.0^0.0^0.0^0.0^0.0^0.2882^0.2882 result.1=null^null^null^null^null^null^0.0 result.2=null^null^null^null^null^null^0.0 -result.3=0.0^1.0^5.0^0.0^1.0^160.4436^167.4436 -result.4=175.0^1.0^12.0^0.0^1.0^160.7318^349.7318 +result.3=0.0^0.0^5.0^0.0^0.0^148.303^153.303 +result.4=0.0^0.0^5.0^0.0^0.0^148.5912^153.5912 result.columns=7 result.rows=5 syntax.columns=7 ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/report/DataMatrix.java ===================================== @@ -159,7 +159,13 @@ public class DataMatrix implements JsonAware { log.debug(String.format("copying incoming matrix (dim: %s, location: %s)", incoming.getDimension(), incoming.getLocation())); for (int i = 0; i < width; i++) { + if (x + i < 0) { + continue; + } for (int j = 0; j < height; j++) { + if (y + j < 0) { + continue; + } Serializable value = incoming.getValue(i, j); setValue(x + i, y + j, value); } ===================================== toolkit/api/src/main/java/fr/ird/observe/dto/report/ReportBuilder.java ===================================== @@ -319,12 +319,14 @@ public class ReportBuilder { Map.Entry<String, String> entry = itr.next(); String key = entry.getKey(); if (!key.startsWith(VARIABLE_PREFIX)) { - continue; } String operations = entry.getValue(); String id = key.substring(VARIABLE_PREFIX.length()); - + int indexOf = id.indexOf("."); + if (indexOf > -1) { + id = id.substring(indexOf + 1); + } // on interdit la surcharge d'une variable déjà trouvée pour le report if (ids.contains(id)) { throw new IllegalArgumentException("La variable " + id + " est déjà définie pour le report " + reportName); @@ -359,12 +361,14 @@ public class ReportBuilder { Map.Entry<String, String> entry = itr.next(); String key = entry.getKey(); if (!key.startsWith(REPEAT_VARIABLE_PREFIX)) { - continue; } String operations = entry.getValue(); String id = key.substring(REPEAT_VARIABLE_PREFIX.length()); - + int indexOf = id.indexOf("."); + if (indexOf > -1) { + id = id.substring(indexOf + 1); + } // on interdit la surcharge d'une variable déjà trouvée pour le report if (ids.contains(id)) { throw new IllegalArgumentException("La variable de répétition " + id + " est déjà définie pour le report " + reportName); View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/210adc7fd460ad0565ebe6ea5... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/210adc7fd460ad0565ebe6ea5... You're receiving this email because of your account on gitlab.com.