Tony CHEMIT pushed to branch develop-9.0.x at ultreiaio / ird-observe Commits: bbacf732 by Tony Chemit at 2022-11-20T11:05:04+01:00 Migration - show stringFixedCount and commentFixedCount and the end - - - - - f1331125 by Tony Chemit at 2022-11-21T14:37:04+01:00 Replay Sample migration - See #2539 - - - - - 00f0ee47 by Tony Chemit at 2022-11-21T14:38:23+01:00 Service - Add new service TripService.getPsObservationCatchesSpeciesFateBySpeciesId - - - - - 529742f7 by Tony Chemit at 2022-11-21T14:38:23+01:00 GUI Sample - Use specific SpeciesFate for selected Species in Form - - - - - e6cbd1a5 by Tony Chemit at 2022-11-21T14:38:23+01:00 Model - Clean Sample dto (remove speciesFate, availableSpeciesIds and availableSpeciesFateIds fields) - - - - - 9bfe6476 by Tony Chemit at 2022-11-21T15:27:09+01:00 Merge branch 'feature/issue_2538' into develop-9.0.x Closes #2538 - - - - - 13 changed files: - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SampleUIHandler.java - client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SampleUIModelStates.java - core/api/services/src/main/java/fr/ird/observe/services/service/data/ps/common/TripService.java - core/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/observation/SampleSpi.java - core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_0.java - + core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/SampleMeasureRecord.java - + core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/SampleRecord.java - core/services/local/src/main/java/fr/ird/observe/services/local/service/data/ps/common/TripServiceLocalSupport.java - core/services/test/src/main/java/fr/ird/observe/services/service/data/ps/common/TripServiceFixtures.java - core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/data/ps/common/TripService.properties - model/src/main/models/Observe/dto/20-data-ps-observation.model - model/src/main/models/Observe/dto/attribute/unique.properties - server/core/src/main/filtered-resources/META-INF/mapping-api-client.wm Changes: ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SampleUIHandler.java ===================================== @@ -28,6 +28,7 @@ import fr.ird.observe.dto.data.ps.observation.SampleMeasureDto; import fr.ird.observe.dto.referential.common.SizeMeasureTypeReference; import fr.ird.observe.dto.referential.common.SpeciesReference; import fr.ird.observe.dto.referential.common.WeightMeasureTypeReference; +import fr.ird.observe.dto.referential.ps.common.SpeciesFateReference; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.nuiton.jaxx.runtime.swing.JAXXButtonGroup; @@ -36,6 +37,7 @@ import javax.swing.JComponent; import javax.swing.event.ChangeEvent; import java.awt.Component; import java.beans.PropertyChangeListener; +import java.util.List; import java.util.Optional; /** @@ -99,7 +101,7 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { onLengthChanged(tableEditBean.getLength(), false); onWeightChanged(tableEditBean.getWeight(), false); - SampleUIModel sampleModel = getModel(); + SampleUIModelStates states = getModel().getStates(); SpeciesReference species = tableEditBean.getSpecies(); log.info(String.format("%s selected species %s", prefix, species)); @@ -113,7 +115,7 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { boolean unsetSpecies = true; if (newRow) { // use default mode - AcquisitionMode acquisitionMode = sampleModel.getStates().getDefaultAcquisitionMode(); + AcquisitionMode acquisitionMode = states.getDefaultAcquisitionMode(); if (previousRowBean != null) { //use previous row (species won't be empty) unsetSpecies = false; @@ -131,8 +133,8 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { } // get default size measure type - defaultSizeMeasureType = sampleModel.getStates().getSpeciesDefaultSizeMeasureType(species); - defaultWeightMeasureType = sampleModel.getStates().getSpeciesDefaultWeightMeasureType(species); + defaultSizeMeasureType = states.getSpeciesDefaultSizeMeasureType(species); + defaultWeightMeasureType = states.getSpeciesDefaultWeightMeasureType(species); if (unsetSpecies) { // unset species (this will not set again species in widget) @@ -145,8 +147,8 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { updateAcquisitionMode0(AcquisitionMode.valueOf(tableEditBean.getAcquisitionMode())); // get default size measure type - defaultSizeMeasureType = sampleModel.getStates().getSpeciesDefaultSizeMeasureType(species); - defaultWeightMeasureType = sampleModel.getStates().getSpeciesDefaultWeightMeasureType(species); + defaultSizeMeasureType = states.getSpeciesDefaultSizeMeasureType(species); + defaultWeightMeasureType = states.getSpeciesDefaultWeightMeasureType(species); species = null; sizeMeasureType = Optional.ofNullable(tableEditBean.getSizeMeasureType()); @@ -154,8 +156,8 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { } // use default size measure type - sampleModel.getStates().setDefaultSizeMeasureType(defaultSizeMeasureType.orElse(null)); - sampleModel.getStates().setDefaultWeightMeasureType(defaultWeightMeasureType.orElse(null)); + states.setDefaultSizeMeasureType(defaultSizeMeasureType.orElse(null)); + states.setDefaultWeightMeasureType(defaultWeightMeasureType.orElse(null)); ui.getSizeMeasureType().setSelectedItem(null); sizeMeasureType.ifPresent(ui.getSizeMeasureType()::setSelectedItem); @@ -172,16 +174,36 @@ public class SampleUIHandler extends GeneratedSampleUIHandler { ui.getSpecies().setSelectedItem(null); ui.getSpecies().setSelectedItem(species); } + updateSpeciesFateUniverse(tableEditBean.getSpecies(), tableEditBean.getSpeciesFate()); } protected void onSpeciesChanged(SpeciesReference species) { - SampleUIModel model = getModel(); - Optional<SizeMeasureTypeReference> sizeMeasureType = model.getStates().getSpeciesDefaultSizeMeasureType(species); - Optional<WeightMeasureTypeReference> weightMeasureType = model.getStates().getSpeciesDefaultWeightMeasureType(species); - model.getStates().setDefaultSizeMeasureType(sizeMeasureType.orElse(null)); - model.getStates().setDefaultWeightMeasureType(weightMeasureType.orElse(null)); + SampleUIModelStates states = getModel().getStates(); + Optional<SizeMeasureTypeReference> sizeMeasureType = states.getSpeciesDefaultSizeMeasureType(species); + Optional<WeightMeasureTypeReference> weightMeasureType = states.getSpeciesDefaultWeightMeasureType(species); + states.setDefaultSizeMeasureType(sizeMeasureType.orElse(null)); + states.setDefaultWeightMeasureType(weightMeasureType.orElse(null)); resetDefaultSizeMeasureType(false); resetDefaultWeightMeasureType(false); + updateSpeciesFateUniverse(species, states.getTableEditBean().getSpeciesFate()); + } + + protected void updateSpeciesFateUniverse(SpeciesReference species, SpeciesFateReference speciesFate) { + ui.getSpeciesFate().setSelectedItem(null); + if (species == null) { + ui.getSpeciesFate().setEnabled(false); + ui.getSpeciesFate().setData(List.of()); + } else { + List<SpeciesFateReference> speciesFateReferences = getModel().getStates().getSpeciesFate(species); + ui.getSpeciesFate().setData(speciesFateReferences); + ui.getSpeciesFate().setEnabled(true); + //FIXME Due to none sample migration on speciesFate, we can have some one not present in speciesFateReferences + //FIXME Need a fix in migration probably +// if (speciesFate != null && speciesFateReferences.contains(speciesFate)) { + if (speciesFate != null) { + ui.getSpeciesFate().setSelectedItem(speciesFate); + } + } } public void resetDefaultSizeMeasureType(boolean force) { ===================================== client/datasource/editor/ps/src/main/java/fr/ird/observe/client/datasource/editor/ps/data/observation/SampleUIModelStates.java ===================================== @@ -37,6 +37,10 @@ import fr.ird.observe.services.ObserveServicesProvider; import io.ultreia.java4all.bean.spi.GenerateJavaBeanDefinition; import javax.swing.Icon; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import static io.ultreia.java4all.i18n.I18n.n; import static io.ultreia.java4all.i18n.I18n.t; @@ -51,6 +55,11 @@ public class SampleUIModelStates extends SampleContentTableUIModelStates<SampleD private final Icon computedIcon; private final Icon observedIcon; + /** + * Dictionary of species fate ids available per species id. + */ + private Map<String, Set<String>> speciesFateBySpeciesMap; + public SampleUIModelStates(GeneratedSampleUIModel model) { super(model, SampleDto.newDto(new java.util.Date()), SampleMeasureDto.newDto(new java.util.Date()), model.getSource().getInitializer().getSelectedId(), model.getSource().getInitializer().getScope().isStandalone()); this.computedIcon = UIHelper.getUIManagerActionIcon("data-calcule"); @@ -69,8 +78,10 @@ public class SampleUIModelStates extends SampleContentTableUIModelStates<SampleD @Override public void onAfterInitAddReferentialFilters(ClientConfig clientConfig, Project observeSelectModel, ObserveServicesProvider servicesProvider, ReferencesCache referenceCache) { - referenceCache.addReferentialFilter(SampleMeasureDto.PROPERTY_SPECIES, ReferencesFilterHelper.<SampleDto, SpeciesReference>newSubList(SampleDto::getAvailableSpeciesIds)); - referenceCache.addReferentialFilter(SampleMeasureDto.PROPERTY_SPECIES_FATE, ReferencesFilterHelper.<SampleDto, SpeciesFateReference>newSubList(SampleDto::getAvailableSpeciesFateIds)); + speciesFateBySpeciesMap = servicesProvider.getPsCommonTripService().getPsObservationCatchesSpeciesFateBySpeciesId(observeSelectModel.getPs().getObservationSet().getId()); + referenceCache.addReferentialFilter(SampleMeasureDto.PROPERTY_SPECIES, ReferencesFilterHelper.<SampleDto, SpeciesReference>newSubList(e -> speciesFateBySpeciesMap.keySet())); + referenceCache.addReferentialFilter(SampleMeasureDto.PROPERTY_SPECIES_FATE, ReferencesFilterHelper.<SampleDto, SpeciesFateReference>newSubList( + e -> speciesFateBySpeciesMap.values().stream().flatMap(Set::stream).collect(Collectors.toSet()))); } @Override @@ -92,4 +103,8 @@ public class SampleUIModelStates extends SampleContentTableUIModelStates<SampleD return computed ? computedIcon : observedIcon; } + public List<SpeciesFateReference> getSpeciesFate(SpeciesReference speciesReference) { + Set<String> availableSpeciesFateIds = speciesFateBySpeciesMap.get(speciesReference.getId()); + return getReferenceCache().<SpeciesFateReference>getReferentialReferenceSet(SampleMeasureDto.PROPERTY_SPECIES_FATE).subSet(availableSpeciesFateIds).collect(Collectors.toList()); + } } ===================================== core/api/services/src/main/java/fr/ird/observe/services/service/data/ps/common/TripService.java ===================================== @@ -33,6 +33,9 @@ import io.ultreia.java4all.http.spi.Get; import io.ultreia.java4all.http.spi.Nullable; import io.ultreia.java4all.http.spi.Service; +import java.util.Map; +import java.util.Set; + /** * Created on 26/07/2021. * @@ -54,6 +57,10 @@ public interface TripService extends TripAwareService { @MethodCredential(Permission.READ_DATA) boolean isActivityEndOfSearchFound(String routeId); + @Get + @MethodCredential(Permission.READ_DATA) + Map<String, Set<String>> getPsObservationCatchesSpeciesFateBySpeciesId(String setId); + @Get @MethodCredential(Permission.WRITE_DATA) Form<fr.ird.observe.dto.data.ps.observation.FloatingObjectDto> preCreateObservationFloatingObject(String activityId, @Nullable FloatingObjectPreset floatingObjectPreset); ===================================== core/persistence/java/src/main/java/fr/ird/observe/entities/data/ps/observation/SampleSpi.java ===================================== @@ -26,13 +26,13 @@ import fr.ird.observe.dto.data.ps.observation.SampleDto; import fr.ird.observe.dto.db.ConcurrentModificationException; import fr.ird.observe.dto.form.Form; import fr.ird.observe.dto.result.SaveResultDto; -import fr.ird.observe.entities.referential.common.Species; import fr.ird.observe.entities.referential.ps.common.SpeciesFate; import fr.ird.observe.spi.result.AddEntityToUpdateStep; import fr.ird.observe.spi.service.ServiceContext; -import java.util.Objects; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.TreeMap; +import java.util.TreeSet; public class SampleSpi extends GeneratedSampleSpi { @@ -45,8 +45,6 @@ public class SampleSpi extends GeneratedSampleSpi { SampleDto dto = form.getObject(); // always use the set id, //FIXME See why ? dto.setId(id); - dto.setAvailableSpeciesIds(parent.getCatches().stream().map(Catch::getSpecies).map(Species::getTopiaId).collect(Collectors.toSet())); - dto.setAvailableSpeciesFateIds(parent.getCatches().stream().map(Catch::getSpeciesFate).filter(Objects::nonNull).map(SpeciesFate::getTopiaId).collect(Collectors.toSet())); return form; } @@ -64,7 +62,7 @@ public class SampleSpi extends GeneratedSampleSpi { Sample.SPI.getDao(context).initId(entity); parent.addSample(entity); } - SampleMeasure.SPI.initId(context,entity.getSampleMeasure()); + SampleMeasure.SPI.initId(context, entity.getSampleMeasure()); context.getTopiaPersistenceContext().flush(); AddEntityToUpdateStep saveHelper = newSaveHelper(context) .update(this, entity); @@ -74,6 +72,17 @@ public class SampleSpi extends GeneratedSampleSpi { .build(entity); } + public Map<String, java.util.Set<String>> getCatchesSpeciesFateBySpeciesId(ServiceContext context, String id) { + Set parent = Set.loadEntity(context, id); + Map<String, java.util.Set<String>> result = new TreeMap<>(); + parent.getCatches().stream().filter(c -> c.getSpeciesFate() != null).forEach(aCatch -> { + String speciesId = aCatch.getSpecies().getId(); + SpeciesFate speciesFate = aCatch.getSpeciesFate(); + result.computeIfAbsent(speciesId, e -> new TreeSet<>()).add(speciesFate.getId()); + }); + return result; + } + protected Sample loadSampleFormEntity(ServiceContext context, Set parent) { if (parent.isSampleEmpty()) { return Sample.newEntity(context.now()); ===================================== core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_0.java ===================================== @@ -23,8 +23,6 @@ package fr.ird.observe.spi.migration.v9; */ import com.google.auto.service.AutoService; -import fr.ird.observe.dto.StringCleaner; -import fr.ird.observe.persistence.SqlHelper; import fr.ird.observe.spi.migration.ByMajorMigrationVersionResource; import io.ultreia.java4all.util.Version; import io.ultreia.java4all.util.sql.SqlQuery; @@ -36,8 +34,6 @@ import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExec import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -61,6 +57,11 @@ public class DataSourceMigrationForVersion_9_0 extends ByMajorMigrationVersionRe public static final String INFORMATION_SOURCE_U = "fr.ird.referential.ps.observation.InformationSource#1464000000000#03"; public static final String SPECIES_FATE_5 = "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.6250731662108877"; public static final String SPECIES_FATE_6 = "fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.5722739932065866"; + public static final Set<String> SMALL_SPECIES_TO_SPECIES_FATE_6 = + Set.of("fr.ird.referential.common.Species#1239832685476#0.5618871286604711", //ALB + "fr.ird.referential.common.Species#1239832685475#0.13349466123905152", //BET + "fr.ird.referential.common.Species#1239832685474#0.975344121171992", //SKJ + "fr.ird.referential.common.Species#1239832685474#0.8943253454598569"); //YFT public static final String SPECIES_FATE_15 = "fr.ird.referential.ps.common.SpeciesFate#1464000000000#15"; public DataSourceMigrationForVersion_9_0() { @@ -163,6 +164,7 @@ public class DataSourceMigrationForVersion_9_0 extends ByMajorMigrationVersionRe executor.addScript("03_2", "migrate-table-ps_observation_catch_well"); // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2436 + // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2539 migrateSample(executor); } @@ -283,319 +285,40 @@ public class DataSourceMigrationForVersion_9_0 extends ByMajorMigrationVersionRe }); } - static class Sample { - String topiaId; - long topiaVersion; - Timestamp topiaCreateDate; - Timestamp lastUpdateDate; - String homeId; - String comment; - String set; - - public Sample(ResultSet resultSet) throws SQLException { - this.topiaId = resultSet.getString(1); - this.topiaVersion = resultSet.getLong(2); - this.topiaCreateDate = resultSet.getTimestamp(3); - this.homeId = resultSet.getString(4); - this.comment = resultSet.getString(5); - this.set = resultSet.getString(6); - this.lastUpdateDate = resultSet.getTimestamp(7); - } - - public void addHomeId(String homeId) { - if (homeId == null) { - return; - } - if (this.homeId == null) { - this.homeId = homeId; - return; - } - this.homeId += " - " + homeId; - } - - public void addComment(String comment) { - if (comment == null) { - return; - } - if (this.comment == null) { - this.comment = comment; - return; - } - this.comment += " \n " + comment; - } - - } - - - static class SampleMeasure { - String topiaId; - long topiaVersion; - Timestamp topiaCreateDate; - Timestamp lastUpdateDate; - String homeId; - Float length; - Boolean isLengthComputed; - String picturesReferences; - Float weight; - Boolean isWeightComputed; - int count; - int acquisitionMode; - String species; - String sample; - String sex; - String sizeMeasureType; - String weightMeasureType; - String tagNumber; - String speciesFate; - int sample_idx; - String lengthMeasureMethod; - String weightMeasureMethod; - - public SampleMeasure(ResultSet resultSet) throws SQLException { - this.topiaId = resultSet.getString(1); - this.topiaVersion = resultSet.getLong(2); - this.topiaCreateDate = resultSet.getTimestamp(3); - this.homeId = resultSet.getString(4); - this.length = resultSet.getFloat(5); - this.isLengthComputed = resultSet.getBoolean(6); - this.picturesReferences = resultSet.getString(7); - this.weight = resultSet.getFloat(8); - this.isWeightComputed = resultSet.getBoolean(9); - this.count = resultSet.getInt(10); - this.acquisitionMode = resultSet.getInt(11); - this.species = resultSet.getString(12); - this.sample = resultSet.getString(13); - this.sex = resultSet.getString(14); - this.lastUpdateDate = resultSet.getTimestamp(15); - this.sizeMeasureType = resultSet.getString(16); - this.weightMeasureType = resultSet.getString(17); - this.tagNumber = resultSet.getString(18); - this.speciesFate = resultSet.getString(19); - this.sample_idx = resultSet.getInt(20); - this.lengthMeasureMethod = resultSet.getString(21); - this.weightMeasureMethod = resultSet.getString(22); - // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2503 - if (acquisitionMode == 0 && weight != null && !isWeightComputed) { - isWeightComputed = true; - } - } - - } private void migrateSample(MigrationVersionResourceExecutor executor) { - Map<String, Sample> setToSampleMap = new TreeMap<>(); + Map<String, SampleRecord> setToSampleMap = new TreeMap<>(); Map<String, String> sampleMapping = new TreeMap<>(); - addSample(executor, setToSampleMap, sampleMapping, "SELECT REPLACE(topiaId, '.NonTargetSample', '.Sample'), topiaVersion, topiaCreateDate, homeId, comment, set, lastUpdateDate FROM ps_observation.nontargetsample order by set, topiaId"); - - addSample(executor, setToSampleMap, sampleMapping, "SELECT REPLACE(topiaId, '.TargetSample', '.Sample'), topiaVersion, topiaCreateDate, homeId, comment, set, lastUpdateDate FROM ps_observation.targetsample order by set, topiaId"); + executor.doSqlWork(connection -> { + SampleRecord.addNonTargetSample(connection, setToSampleMap, sampleMapping); + SampleRecord.addTargetSample(connection, setToSampleMap, sampleMapping); + }); Function<String, String> stringFormat = executor.commentFormat(); - for (Sample sample : setToSampleMap.values()) { - executor.writeSql(String.format("INSERT INTO ps_observation.Sample(topiaId, topiaVersion, topiaCreateDate, homeId, comment, set, lastUpdateDate) VALUES('%s', %s, '%s'::timestamp, %s, %s, '%s', '%s'::timestamp);", - sample.topiaId, - sample.topiaVersion, - sample.topiaCreateDate, - SqlHelper.escapeString(StringCleaner.ALL.apply(sample.homeId)), - stringFormat.apply(sample.comment), - sample.set, - sample.lastUpdateDate - )); + for (SampleRecord sample : setToSampleMap.values()) { + executor.writeSql(sample.toSampleSql(stringFormat)); } migrateSampleMeasure(executor, sampleMapping); } private void migrateSampleMeasure(MigrationVersionResourceExecutor executor, Map<String, String> sampleMapping) { - // nonTargetSampleMeasure - addSampleMeasure(executor, sampleMapping, "SELECT " + - "REPLACE(topiaId, '.NonTargetLength', '.SampleMeasure'), " + - "topiaVersion + 1, " + - "topiaCreateDate, " + - "homeId, " + - "length, " + - "isLengthComputed, " + - "picturesReferences, " + - "weight, " + - "isWeightComputed, " + - "count, " + - "acquisitionMode, " + - "species, " + - "REPLACE(nonTargetSample, '.NonTargetSample', '.Sample'), " + - "sex, " + - "lastUpdateDate, " + - "sizeMeasureType, " + - "weightMeasureType, " + - "tagNumber, " + - "speciesFate, " + - "nonTargetSample_idx, " + - "lengthMeasureMethod, " + - "weightMeasureMethod " + - "FROM ps_observation.NonTargetLength"); - - // discardedTargetSampleMeasure - addSampleMeasure(executor, sampleMapping, "SELECT " + - "REPLACE(tl.topiaId, '.TargetLength', '.SampleMeasure'), " + - "tl.topiaVersion + 1, " + - "tl.topiaCreateDate, " + - "tl.homeId, " + - "tl.length, " + - "tl.isLengthComputed, " + - "NULL, " + - "tl.weight, " + - "tl.isWeightComputed, " + - "tl.count, " + - "tl.acquisitionMode, " + - "tl.species, " + - "REPLACE(tl.targetSample, '.TargetSample', '.Sample'), " + - "'fr.ird.referential.common.Sex#1239832686121#0.0', " + - "tl.lastUpdateDate, " + - "tl.sizeMeasureType, " + - "tl.weightMeasureType, " + - "tl.tagNumber, " + - "'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.6250731662108877', " + - "-tl.targetsample_idx, " + - "tl.lengthMeasureMethod, " + - "tl.weightMeasureMethod " + - "FROM ps_observation.TargetSample ts " + - "INNER JOIN ps_observation.TargetLength tl ON (tl.targetSample=ts.topiaId) " + - "WHERE ts.discarded"); - - // notDiscardedTargetSampleMeasure - addSampleMeasure(executor, sampleMapping, "SELECT " + - "REPLACE(tl.topiaId, '.TargetLength', '.SampleMeasure'), " + - "tl.topiaVersion + 1, " + - "tl.topiaCreateDate, " + - "tl.homeId, " + - "tl.length, " + - "tl.isLengthComputed, " + - "NULL, " + - "tl.weight, " + - "tl.isWeightComputed, " + - "tl.count, " + - "tl.acquisitionMode, " + - "tl.species, " + - "REPLACE(tl.targetSample, '.TargetSample', '.Sample'), " + - "'fr.ird.referential.common.Sex#1239832686121#0.0', " + - "tl.lastUpdateDate, " + - "tl.sizeMeasureType, " + - "tl.weightMeasureType, " + - "tl.tagNumber, " + - "'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.5722739932065866', " + - "-tl.targetsample_idx, " + - "tl.lengthMeasureMethod, " + - "tl.weightMeasureMethod " + - "FROM ps_observation.TargetSample ts " + - "INNER JOIN ps_observation.TargetLength tl ON (tl.targetSample=ts.topiaId) " + - "WHERE NOT ts.discarded"); - } - - private void addSample(MigrationVersionResourceExecutor executor, Map<String, Sample> setToSampleMap, Map<String, String> sampleMapping, String query) { - List<Sample> targetSample = executor.findMultipleResult(SqlQuery.wrap(query, Sample::new)); - for (Sample sample : targetSample) { - Sample existingSample = setToSampleMap.get(sample.set); - if (existingSample == null) { - // new sample - setToSampleMap.put(sample.set, sample); - } else { - // add to sample mapping - sampleMapping.put(sample.topiaId, existingSample.topiaId); - // update homeId - existingSample.addHomeId(sample.homeId); - // update comment - existingSample.addComment(sample.comment); - } - } - } - - private void addSampleMeasure(MigrationVersionResourceExecutor executor, Map<String, String> sampleMapping, String query) { - List<SampleMeasure> sampleMeasureList = executor.findMultipleResult(SqlQuery.wrap(query, SampleMeasure::new)); - for (SampleMeasure sampleMeasure : sampleMeasureList) { - String sampleId = sampleMapping.get(sampleMeasure.sample); - if (sampleId == null) { - sampleId = sampleMeasure.sample; - } - executor.writeSql(String.format("INSERT INTO ps_observation.SampleMeasure(" + - " topiaId," + - " topiaVersion," + - " topiaCreateDate," + - " homeId," + - " length," + - " isLengthComputed," + - " picturesReferences," + - " weight," + - " isWeightComputed," + - " count," + - " acquisitionMode," + - " species," + - " sample," + - " sex," + - " lastUpdateDate," + - " sizeMeasureType," + - " weightMeasureType," + - " tagNumber," + - " speciesFate," + - " sample_idx," + - " lengthMeasureMethod," + - " weightMeasureMethod)" + - " VALUES(" + - "'%s', " + - "%s, " + - "'%s'::timestamp, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "'%s', " + - "%s, " + - "'%s'::timestamp, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s, " + - "%s " + - ");", - sampleMeasure.topiaId, - sampleMeasure.topiaVersion, - sampleMeasure.topiaCreateDate, - SqlHelper.escapeString(sampleMeasure.homeId == null ? null : sampleMeasure.homeId.replaceAll("'", "")), - sampleMeasure.length, - sampleMeasure.isLengthComputed, - SqlHelper.escapeString(sampleMeasure.picturesReferences == null ? null : sampleMeasure.picturesReferences.replaceAll("'", "")), - sampleMeasure.weight, - sampleMeasure.isWeightComputed, - sampleMeasure.count, - sampleMeasure.acquisitionMode, - SqlHelper.escapeString(sampleMeasure.species), - sampleId, - SqlHelper.escapeString(sampleMeasure.sex), - sampleMeasure.lastUpdateDate, - SqlHelper.escapeString(sampleMeasure.sizeMeasureType), - SqlHelper.escapeString(sampleMeasure.weightMeasureType), - SqlHelper.escapeString(sampleMeasure.tagNumber), - SqlHelper.escapeString(sampleMeasure.speciesFate), - sampleMeasure.sample_idx, - SqlHelper.escapeString(sampleMeasure.lengthMeasureMethod), - SqlHelper.escapeString(sampleMeasure.weightMeasureMethod) - )); - } + executor.doSqlWork(connection -> { + SampleMeasureRecord.addNonTargetSampleMeasure(connection, executor, sampleMapping); + SampleMeasureRecord.addDiscardedTargetSampleMeasure(connection, executor, sampleMapping); + SampleMeasureRecord.addNotDiscardedTargetSampleMeasure(connection, executor, sampleMapping); + }); } @Override public void generateFinalizeSqlScript(MigrationVersionResourceExecutor executor) { long stringFixedCount = new FixStringHelper(executor).execute(); + long commentFixedCount = new FixCommentHelper(executor).execute(); if (stringFixedCount > 0) { log.warn(String.format("Fix %s string rows(s).", stringFixedCount)); } - long commentFixedCount = new FixCommentHelper(executor).execute(); if (commentFixedCount > 0) { log.warn(String.format("Fix %s comment rows(s).", commentFixedCount)); } ===================================== core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/SampleMeasureRecord.java ===================================== @@ -0,0 +1,301 @@ +package fr.ird.observe.spi.migration.v9; + +/*- + * #%L + * ObServe Core :: Persistence :: Resources + * %% + * 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 fr.ird.observe.persistence.SqlHelper; +import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Map; +import java.util.function.Function; + +/** + * Created on 20/11/2022. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.18 + */ +class SampleMeasureRecord { + + static void addNonTargetSampleMeasure(Connection connection, MigrationVersionResourceExecutor executor, Map<String, String> sampleMapping) throws SQLException { + addSampleMeasure(connection, executor, sampleMapping, "SELECT " + + "REPLACE(topiaId, '.NonTargetLength', '.SampleMeasure'), " + + "topiaVersion + 1, " + + "topiaCreateDate, " + + "homeId, " + + "length, " + + "isLengthComputed, " + + "picturesReferences, " + + "weight, " + + "isWeightComputed, " + + "count, " + + "acquisitionMode, " + + "species, " + + "REPLACE(nonTargetSample, '.NonTargetSample', '.Sample'), " + + "sex, " + + "lastUpdateDate, " + + "sizeMeasureType, " + + "weightMeasureType, " + + "tagNumber, " + + "speciesFate, " + + "nonTargetSample_idx, " + + "lengthMeasureMethod, " + + "weightMeasureMethod " + + "FROM ps_observation.NonTargetLength", + SampleMeasureRecord::toNonTargetSpeciesFate); + } + + static void addDiscardedTargetSampleMeasure(Connection connection, MigrationVersionResourceExecutor executor, Map<String, String> sampleMapping) throws SQLException { + addSampleMeasure(connection, executor, sampleMapping, "SELECT " + + "REPLACE(tl.topiaId, '.TargetLength', '.SampleMeasure'), " + + "tl.topiaVersion + 1, " + + "tl.topiaCreateDate, " + + "tl.homeId, " + + "tl.length, " + + "tl.isLengthComputed, " + + "NULL, " + + "tl.weight, " + + "tl.isWeightComputed, " + + "tl.count, " + + "tl.acquisitionMode, " + + "tl.species, " + + "REPLACE(tl.targetSample, '.TargetSample', '.Sample'), " + + "'fr.ird.referential.common.Sex#1239832686121#0.0', " + + "tl.lastUpdateDate, " + + "tl.sizeMeasureType, " + + "tl.weightMeasureType, " + + "tl.tagNumber, " + + "'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.6250731662108877', " + + "-tl.targetSample_idx, " + + "tl.lengthMeasureMethod, " + + "tl.weightMeasureMethod " + + "FROM ps_observation.TargetSample ts " + + "INNER JOIN ps_observation.TargetLength tl ON (tl.targetSample=ts.topiaId) " + + "WHERE ts.discarded", + SampleMeasureRecord::toDiscardedTargetSpeciesFate); + } + + static void addNotDiscardedTargetSampleMeasure(Connection connection, MigrationVersionResourceExecutor executor, Map<String, String> sampleMapping) throws SQLException { + addSampleMeasure(connection, executor, sampleMapping, "SELECT " + + "REPLACE(tl.topiaId, '.TargetLength', '.SampleMeasure'), " + + "tl.topiaVersion + 1, " + + "tl.topiaCreateDate, " + + "tl.homeId, " + + "tl.length, " + + "tl.isLengthComputed, " + + "NULL, " + + "tl.weight, " + + "tl.isWeightComputed, " + + "tl.count, " + + "tl.acquisitionMode, " + + "tl.species, " + + "REPLACE(tl.targetSample, '.TargetSample', '.Sample'), " + + "'fr.ird.referential.common.Sex#1239832686121#0.0', " + + "tl.lastUpdateDate, " + + "tl.sizeMeasureType, " + + "tl.weightMeasureType, " + + "tl.tagNumber, " + + "'fr.ird.referential.ps.common.SpeciesFate#1239832683619#0.5722739932065866', " + + "-tl.targetSample_idx, " + + "tl.lengthMeasureMethod, " + + "tl.weightMeasureMethod " + + "FROM ps_observation.TargetSample ts " + + "INNER JOIN ps_observation.TargetLength tl ON (tl.targetSample=ts.topiaId) " + + "WHERE NOT ts.discarded", + SampleMeasureRecord::toNotDiscardedTargetSpeciesFate); + } + + static void addSampleMeasure(Connection connection, MigrationVersionResourceExecutor executor, Map<String, String> sampleMapping, String query, Function<SampleMeasureRecord, String> speciesFateSupplier) throws SQLException { + + try (PreparedStatement statement = connection.prepareStatement(query)) { + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet.next()) { + SampleMeasureRecord sampleMeasure = new SampleMeasureRecord(resultSet); + String sampleId = sampleMapping.get(sampleMeasure.sample); + if (sampleId == null) { + sampleId = sampleMeasure.sample; + } + executor.writeSql(sampleMeasure.toSampleMeasureSql(sampleId, speciesFateSupplier)); + } + } + } + } + + String topiaId; + long topiaVersion; + Timestamp topiaCreateDate; + Timestamp lastUpdateDate; + String homeId; + Float length; + Boolean isLengthComputed; + String picturesReferences; + Float weight; + Boolean isWeightComputed; + int count; + int acquisitionMode; + String species; + String sample; + String sex; + String sizeMeasureType; + String weightMeasureType; + String tagNumber; + String speciesFate; + int sample_idx; + String lengthMeasureMethod; + String weightMeasureMethod; + + + private String toNonTargetSpeciesFate() { + if (speciesFate == null) { + return null; + } + if (DataSourceMigrationForVersion_9_0.SPECIES_FATE_6.equals(speciesFate)) { + // like for non target catches always change from speciesFate 6 to 15 + speciesFate = DataSourceMigrationForVersion_9_0.SPECIES_FATE_15; + } + return speciesFate; + } + + private String toDiscardedTargetSpeciesFate() { + // Discarded target species use always speciesFate 5 (and we have it from the sql query) + return speciesFate; + + } + + private String toNotDiscardedTargetSpeciesFate() { + // by default we use in sql query speciesFate = 6 + // for small species, they are always with speciesFate = 15 + + if (!DataSourceMigrationForVersion_9_0.SMALL_SPECIES_TO_SPECIES_FATE_6.contains(species)) { + speciesFate = DataSourceMigrationForVersion_9_0.SPECIES_FATE_15; + } + return speciesFate; + } + + public SampleMeasureRecord(ResultSet resultSet) throws SQLException { + this.topiaId = resultSet.getString(1); + this.topiaVersion = resultSet.getLong(2); + this.topiaCreateDate = resultSet.getTimestamp(3); + this.homeId = resultSet.getString(4); + this.length = resultSet.getFloat(5); + this.isLengthComputed = resultSet.getBoolean(6); + this.picturesReferences = resultSet.getString(7); + this.weight = resultSet.getFloat(8); + this.isWeightComputed = resultSet.getBoolean(9); + this.count = resultSet.getInt(10); + this.acquisitionMode = resultSet.getInt(11); + this.species = resultSet.getString(12); + this.sample = resultSet.getString(13); + this.sex = resultSet.getString(14); + this.lastUpdateDate = resultSet.getTimestamp(15); + this.sizeMeasureType = resultSet.getString(16); + this.weightMeasureType = resultSet.getString(17); + this.tagNumber = resultSet.getString(18); + this.speciesFate = resultSet.getString(19); + this.sample_idx = resultSet.getInt(20); + this.lengthMeasureMethod = resultSet.getString(21); + this.weightMeasureMethod = resultSet.getString(22); + // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2503 + if (acquisitionMode == 0 && weight != null && !isWeightComputed) { + isWeightComputed = true; + } + } + + String toSampleMeasureSql(String sampleId, Function<SampleMeasureRecord, String> speciesFateSupplier) { + return String.format("INSERT INTO ps_observation.SampleMeasure(" + + " topiaId," + + " topiaVersion," + + " topiaCreateDate," + + " homeId," + + " length," + + " isLengthComputed," + + " picturesReferences," + + " weight," + + " isWeightComputed," + + " count," + + " acquisitionMode," + + " species," + + " sample," + + " sex," + + " lastUpdateDate," + + " sizeMeasureType," + + " weightMeasureType," + + " tagNumber," + + " speciesFate," + + " sample_idx," + + " lengthMeasureMethod," + + " weightMeasureMethod)" + + " VALUES(" + + "'%s', " + + "%s, " + + "'%s'::timestamp, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "'%s', " + + "%s, " + + "'%s'::timestamp, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s, " + + "%s " + + ");", + topiaId, + topiaVersion, + topiaCreateDate, + SqlHelper.escapeString(homeId == null ? null : homeId.replaceAll("'", "")), + length, + isLengthComputed, + SqlHelper.escapeString(picturesReferences == null ? null : picturesReferences.replaceAll("'", "")), + weight, + isWeightComputed, + count, + acquisitionMode, + SqlHelper.escapeString(species), + sampleId, + SqlHelper.escapeString(sex), + lastUpdateDate, + SqlHelper.escapeString(sizeMeasureType), + SqlHelper.escapeString(weightMeasureType), + SqlHelper.escapeString(tagNumber), + SqlHelper.escapeString(speciesFateSupplier.apply(this)), + sample_idx, + SqlHelper.escapeString(lengthMeasureMethod), + SqlHelper.escapeString(weightMeasureMethod) + ); + } + +} ===================================== core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/SampleRecord.java ===================================== @@ -0,0 +1,150 @@ +package fr.ird.observe.spi.migration.v9; + +/*- + * #%L + * ObServe Core :: Persistence :: Resources + * %% + * 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 fr.ird.observe.dto.StringCleaner; +import fr.ird.observe.persistence.SqlHelper; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.Map; +import java.util.function.Function; + +/** + * Created on 20/11/2022. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 9.0.18 + */ +class SampleRecord { + final String topiaId; + final long topiaVersion; + final Timestamp topiaCreateDate; + final Timestamp lastUpdateDate; + final boolean nonTarget; + String homeId; + String comment; + String set; + + static void addNonTargetSample(Connection connection, Map<String, SampleRecord> setToSampleMap, Map<String, String> sampleMapping) throws SQLException { + + try (PreparedStatement statement = connection.prepareStatement( + "SELECT " + + "REPLACE(topiaId, '.NonTargetSample', '.Sample'), " + + "topiaVersion, " + + "topiaCreateDate, " + + "homeId, " + + "comment, " + + "set, " + + "lastUpdateDate " + + "FROM ps_observation.nontargetsample " + + "ORDER BY set, topiaId")) { + addSample(statement, setToSampleMap, sampleMapping, true); + } + } + + + static void addTargetSample(Connection connection, Map<String, SampleRecord> setToSampleMap, Map<String, String> sampleMapping) throws SQLException { + try (PreparedStatement statement = connection.prepareStatement( + "SELECT " + + "REPLACE(topiaId, '.TargetSample', '.Sample'), " + + "topiaVersion, " + + "topiaCreateDate, " + + "homeId, " + + "comment, " + + "set, " + + "lastUpdateDate " + + "FROM ps_observation.targetsample " + + "ORDER BY set, topiaId")) { + addSample(statement, setToSampleMap, sampleMapping, false); + } + } + + static void addSample(PreparedStatement statement, Map<String, SampleRecord> setToSampleMap, Map<String, String> sampleMapping, boolean nonTarget) throws SQLException { + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet.next()) { + SampleRecord sample = new SampleRecord(resultSet, nonTarget); + SampleRecord existingSample = setToSampleMap.get(sample.set); + if (existingSample == null) { + // new sample + setToSampleMap.put(sample.set, sample); + } else { + // add to sample mapping + sampleMapping.put(sample.topiaId, existingSample.topiaId); + // update homeId + existingSample.addHomeId(sample.homeId); + // update comment + existingSample.addComment(sample.comment); + } + } + } + } + + public SampleRecord(ResultSet resultSet, boolean nonTarget) throws SQLException { + this.topiaId = resultSet.getString(1); + this.topiaVersion = resultSet.getLong(2); + this.topiaCreateDate = resultSet.getTimestamp(3); + this.homeId = resultSet.getString(4); + this.comment = resultSet.getString(5); + this.set = resultSet.getString(6); + this.lastUpdateDate = resultSet.getTimestamp(7); + this.nonTarget = nonTarget; + } + + public String toSampleSql(Function<String, String> commentFormat) { + return String.format("INSERT INTO ps_observation.Sample(topiaId, topiaVersion, topiaCreateDate, homeId, comment, set, lastUpdateDate) VALUES('%s', %s, '%s'::timestamp, %s, %s, '%s', '%s'::timestamp);", + topiaId, + topiaVersion, + topiaCreateDate, + SqlHelper.escapeString(StringCleaner.ALL.apply(homeId)), + commentFormat.apply(comment), + set, + lastUpdateDate); + } + + public void addHomeId(String homeId) { + if (homeId == null) { + return; + } + if (this.homeId == null) { + this.homeId = homeId; + return; + } + this.homeId += " - " + homeId; + } + + public void addComment(String comment) { + if (comment == null) { + return; + } + if (this.comment == null) { + this.comment = comment; + return; + } + this.comment += " \n " + comment; + } + +} ===================================== core/services/local/src/main/java/fr/ird/observe/services/local/service/data/ps/common/TripServiceLocalSupport.java ===================================== @@ -36,6 +36,8 @@ import fr.ird.observe.services.service.data.ps.common.TripService; import java.util.Date; import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; /** * Created on 26/07/2021. @@ -80,6 +82,11 @@ public abstract class TripServiceLocalSupport extends ObserveServiceLocal implem return Trip.SPI.isActivityEndOfSearchFound(this, routeId); } + @Override + public Map<String, Set<String>> getPsObservationCatchesSpeciesFateBySpeciesId(String setId) { + return fr.ird.observe.entities.data.ps.observation.Sample.SPI.getCatchesSpeciesFateBySpeciesId(this, setId); + } + @Override public Form<fr.ird.observe.dto.data.ps.observation.FloatingObjectDto> preCreateObservationFloatingObject(String activityId, FloatingObjectPreset floatingObjectPreset) { return fr.ird.observe.entities.data.ps.observation.FloatingObject.SPI.preCreate(this, floatingObjectPreset); ===================================== core/services/test/src/main/java/fr/ird/observe/services/service/data/ps/common/TripServiceFixtures.java ===================================== @@ -39,7 +39,9 @@ import fr.ird.observe.services.service.data.EditableServiceFixtures; import fr.ird.observe.services.service.data.RootOpenableServiceFixtures; import org.junit.Assert; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; public class TripServiceFixtures extends GeneratedTripServiceFixtures { @@ -67,6 +69,15 @@ public class TripServiceFixtures extends GeneratedTripServiceFixtures { // } + @Override + public void getPsObservationCatchesSpeciesFateBySpeciesId(ObserveServicesProvider servicesProvider, TripService service) { + String setId = getProperty("getPsObservationCatchesSpeciesFateBySpeciesId.setId"); + Map<String, Set<String>> actual = service.getPsObservationCatchesSpeciesFateBySpeciesId(setId); + Assert.assertNotNull(actual); + Assert.assertEquals(getIntegerProperty("getPsObservationCatchesSpeciesFateBySpeciesId.speciesCount"), actual.size()); + Assert.assertEquals(getIntegerProperty("getPsObservationCatchesSpeciesFateBySpeciesId.speciesFateCount"), actual.values().stream().flatMap(Set::stream).collect(Collectors.toSet()).size()); + } + @Override public void getAllTripIds(ObserveServicesProvider servicesProvider, TripService service) { Set<String> actual = service.getAllTripIds(); ===================================== core/services/test/src/main/resources/fixtures/fr/ird/observe/services/service/data/ps/common/TripService.properties ===================================== @@ -25,6 +25,7 @@ defaultNewParentId=${REFERENTIAL_PS_COMMON_PROGRAM_MOVE} defaultParentId=${REFERENTIAL_PS_COMMON_PROGRAM} defaultProgramId=${REFERENTIAL_PS_COMMON_PROGRAM} defaultRouteId=FIXME +defaultSetId=${PS_OBSERVATION_SET} defaultSpeciesListId=fr.ird.referential.common.SpeciesList#1239832675370#0.1 defaultTripId=${PS_COMMON_TRIP} defaultVesselId=fr.ird.referential.common.Vessel#1239832679425#0.9136908731720471 @@ -42,6 +43,9 @@ getMatchingTripsVesselWithinDateRange.vesselId=${defaultVesselId} getParentBrothers.count=16 getParentBrothers.parentId=${defaultParentId} getParentBrothers.programId=${defaultProgramId} +getPsObservationCatchesSpeciesFateBySpeciesId.setId=${defaultSetId} +getPsObservationCatchesSpeciesFateBySpeciesId.speciesCount=6 +getPsObservationCatchesSpeciesFateBySpeciesId.speciesFateCount=4 getSpeciesByListAndTrip.count=14 getSpeciesByListAndTrip.speciesListId=${defaultSpeciesListId} getSpeciesByListAndTrip.tripId=${defaultTripId} ===================================== model/src/main/models/Observe/dto/20-data-ps-observation.model ===================================== @@ -158,8 +158,6 @@ informationSource {*:0..1} referential.ps.observation.InformationSourceReference data.ps.observation.Sample > data.Container sampleMeasure + {*} data.ps.observation.SampleMeasure speciesFate {*:*} referential.ps.common.SpeciesFateReference -availableSpeciesIds + {*} String -availableSpeciesFateIds + {*} String data.ps.observation.SetCatch > data.Container catches {*} data.ps.observation.Catch ===================================== model/src/main/models/Observe/dto/attribute/unique.properties ===================================== @@ -37,8 +37,6 @@ data.ps.localmarket.TripBatch.attribute.localmarketSurvey=true data.ps.logbook.Route.attribute.activity=true data.ps.observation.Activity.attribute.nonTargetCatchSpecies=true data.ps.observation.Route.attribute.activity=true -data.ps.observation.Sample.attribute.availableSpeciesFateIds=true -data.ps.observation.Sample.attribute.availableSpeciesIds=true data.ps.observation.SetNonTargetCatchRelease.attribute.availableSpeciesIds=true referential.Referential.attribute.homeId=true referential.Referential.attribute.uri=true ===================================== server/core/src/main/filtered-resources/META-INF/mapping-api-client.wm ===================================== @@ -16,150 +16,151 @@ # Do not remove the next line, it is used to generate the following actions. # →→→ Generated dynamic mapping -GET /AnonymousService/applySecurity AnonymousServiceRestApi.applySecurity -GET /AnonymousService/checkCanConnect AnonymousServiceRestApi.checkCanConnect -GET /AnonymousService/checkCanConnectOrBeEmpty AnonymousServiceRestApi.checkCanConnectOrBeEmpty -POST /AnonymousService/createEmpty AnonymousServiceRestApi.createEmpty -POST /AnonymousService/createFromDump AnonymousServiceRestApi.createFromDump -POST /AnonymousService/createFromImport AnonymousServiceRestApi.createFromImport -GET /AnonymousService/generateHomeId AnonymousServiceRestApi.generateHomeId -GET /AnonymousService/getAvailableDatabaseNames AnonymousServiceRestApi.getAvailableDatabaseNames -GET /AnonymousService/getModelVersion AnonymousServiceRestApi.getModelVersion -GET /AnonymousService/getServerVersion AnonymousServiceRestApi.getServerVersion -GET /AnonymousService/getUsers AnonymousServiceRestApi.getUsers -GET /AnonymousService/migrateData AnonymousServiceRestApi.migrateData -GET /AnonymousService/open AnonymousServiceRestApi.open -GET /DataSourceService/backup DataSourceServiceRestApi.backup -GET /DataSourceService/close DataSourceServiceRestApi.close -POST /DataSourceService/executeSqlScript DataSourceServiceRestApi.executeSqlScript -GET /DataSourceService/getLastUpdateDate DataSourceServiceRestApi.getLastUpdateDate -GET /DataSourceService/isIdValid DataSourceServiceRestApi.isIdValid -POST /DataSourceService/produceAddSqlScript DataSourceServiceRestApi.produceAddSqlScript -POST /DataSourceService/produceCreateSqlScript DataSourceServiceRestApi.produceCreateSqlScript -POST /DataSourceService/produceDeleteSqlScript DataSourceServiceRestApi.produceDeleteSqlScript -POST /DataSourceService/produceMoveSqlScript DataSourceServiceRestApi.produceMoveSqlScript -POST /DataSourceService/retainExistingIds DataSourceServiceRestApi.retainExistingIds -GET /NavigationService/getGroupByDtoSet NavigationServiceRestApi.getGroupByDtoSet -GET /NavigationService/getNavigation NavigationServiceRestApi.getNavigation -GET /NavigationService/loadNavigationPath NavigationServiceRestApi.loadNavigationPath -GET /NavigationService/loadNavigationRoot NavigationServiceRestApi.loadNavigationRoot -GET /NavigationService/loadSelectionRoot NavigationServiceRestApi.loadSelectionRoot -GET /ReferenceService/createData ReferenceServiceRestApi.createData -GET /ReferenceService/createReferential ReferenceServiceRestApi.createReferential -GET /ReferenceService/loadData ReferenceServiceRestApi.loadData -GET /ReferenceService/loadReferential ReferenceServiceRestApi.loadReferential -POST /ReportService/executeReport ReportServiceRestApi.executeReport -POST /ReportService/populateVariables ReportServiceRestApi.populateVariables -GET /UsageService/countMandatoryData UsageServiceRestApi.countMandatoryData -GET /UsageService/countOptionalData UsageServiceRestApi.countOptionalData -GET /UsageService/countReferential UsageServiceRestApi.countReferential -POST /UsageService/findMandatoryData UsageServiceRestApi.findMandatoryData -POST /UsageService/findOptionalData UsageServiceRestApi.findOptionalData -POST /UsageService/findReferential UsageServiceRestApi.findReferential -POST /ValidateService/validateData ValidateServiceRestApi.validateData -POST /ValidateService/validateReferential ValidateServiceRestApi.validateReferential -POST /api/DataEntityService/create api.DataEntityServiceRestApi.create -DELETE /api/DataEntityService/delete api.DataEntityServiceRestApi.delete -GET /api/DataEntityService/generateId api.DataEntityServiceRestApi.generateId -GET /api/DataEntityService/getOne api.DataEntityServiceRestApi.getOne -GET /api/DataEntityService/getSome api.DataEntityServiceRestApi.getSome -POST /api/DataEntityService/update api.DataEntityServiceRestApi.update -POST /api/ReferentialEntityService/create api.ReferentialEntityServiceRestApi.create -DELETE /api/ReferentialEntityService/delete api.ReferentialEntityServiceRestApi.delete -GET /api/ReferentialEntityService/generateId api.ReferentialEntityServiceRestApi.generateId -GET /api/ReferentialEntityService/getAll api.ReferentialEntityServiceRestApi.getAll -GET /api/ReferentialEntityService/getByModule api.ReferentialEntityServiceRestApi.getByModule -GET /api/ReferentialEntityService/getByPackage api.ReferentialEntityServiceRestApi.getByPackage -GET /api/ReferentialEntityService/getOne api.ReferentialEntityServiceRestApi.getOne -GET /api/ReferentialEntityService/getSome api.ReferentialEntityServiceRestApi.getSome -PUT /api/ReferentialEntityService/update api.ReferentialEntityServiceRestApi.update -GET /api/SqlService/select api.SqlServiceRestApi.select -GET /data/ContainerService/loadForm data.ContainerServiceRestApi.loadForm -POST /data/ContainerService/save data.ContainerServiceRestApi.save -GET /data/DataFileService/getDataFile data.DataFileServiceRestApi.getDataFile -POST /data/DataManagementService/deleteData data.DataManagementServiceRestApi.deleteData -POST /data/DataManagementService/exportData data.DataManagementServiceRestApi.exportData -POST /data/DataManagementService/importData data.DataManagementServiceRestApi.importData -DELETE /data/EditableService/delete data.EditableServiceRestApi.delete -GET /data/EditableService/exists data.EditableServiceRestApi.exists -GET /data/EditableService/loadDto data.EditableServiceRestApi.loadDto -GET /data/EditableService/loadForm data.EditableServiceRestApi.loadForm -GET /data/EditableService/preCreate data.EditableServiceRestApi.preCreate -POST /data/EditableService/save data.EditableServiceRestApi.save -DELETE /data/OpenableService/delete data.OpenableServiceRestApi.delete -GET /data/OpenableService/exists data.OpenableServiceRestApi.exists -GET /data/OpenableService/getBrothers data.OpenableServiceRestApi.getBrothers -GET /data/OpenableService/getBrothersFromParent data.OpenableServiceRestApi.getBrothersFromParent -GET /data/OpenableService/getChildren data.OpenableServiceRestApi.getChildren -GET /data/OpenableService/getChildrenUpdate data.OpenableServiceRestApi.getChildrenUpdate -POST /data/OpenableService/getMandatoryDependencies data.OpenableServiceRestApi.getMandatoryDependencies -POST /data/OpenableService/getMandatoryDependenciesCount data.OpenableServiceRestApi.getMandatoryDependenciesCount -POST /data/OpenableService/getOptionalDependencies data.OpenableServiceRestApi.getOptionalDependencies -POST /data/OpenableService/getOptionalDependenciesCount data.OpenableServiceRestApi.getOptionalDependenciesCount -GET /data/OpenableService/loadDto data.OpenableServiceRestApi.loadDto -GET /data/OpenableService/loadForm data.OpenableServiceRestApi.loadForm -POST /data/OpenableService/move data.OpenableServiceRestApi.move -GET /data/OpenableService/preCreate data.OpenableServiceRestApi.preCreate -POST /data/OpenableService/save data.OpenableServiceRestApi.save -POST /data/RootOpenableService/computeMissingReferential data.RootOpenableServiceRestApi.computeMissingReferential -DELETE /data/RootOpenableService/delete data.RootOpenableServiceRestApi.delete -DELETE /data/RootOpenableService/deleteLayout data.RootOpenableServiceRestApi.deleteLayout -GET /data/RootOpenableService/exists data.RootOpenableServiceRestApi.exists -GET /data/RootOpenableService/getBrothers data.RootOpenableServiceRestApi.getBrothers -GET /data/RootOpenableService/getChildren data.RootOpenableServiceRestApi.getChildren -GET /data/RootOpenableService/getChildrenUpdate data.RootOpenableServiceRestApi.getChildrenUpdate -GET /data/RootOpenableService/getGroupByDtoValue data.RootOpenableServiceRestApi.getGroupByDtoValue -GET /data/RootOpenableService/getGroupByValue data.RootOpenableServiceRestApi.getGroupByValue -GET /data/RootOpenableService/loadDto data.RootOpenableServiceRestApi.loadDto -GET /data/RootOpenableService/loadForm data.RootOpenableServiceRestApi.loadForm -POST /data/RootOpenableService/moveLayout data.RootOpenableServiceRestApi.moveLayout -GET /data/RootOpenableService/preCreate data.RootOpenableServiceRestApi.preCreate -POST /data/RootOpenableService/save data.RootOpenableServiceRestApi.save -GET /data/SimpleService/loadForm data.SimpleServiceRestApi.loadForm -POST /data/SimpleService/save data.SimpleServiceRestApi.save -POST /data/ll/ActivityPairingService/applyPairing data.ll.ActivityPairingServiceRestApi.applyPairing -POST /data/ll/ActivityPairingService/computePairing data.ll.ActivityPairingServiceRestApi.computePairing -GET /data/ll/common/TripService/getAllTripIds data.ll.common.TripServiceRestApi.getAllTripIds -GET /data/ll/common/TripService/getLogbookCatchSpeciesIds data.ll.common.TripServiceRestApi.getLogbookCatchSpeciesIds -GET /data/ll/common/TripService/getMatchingTripsVesselWithinDateRange data.ll.common.TripServiceRestApi.getMatchingTripsVesselWithinDateRange -GET /data/ll/common/TripService/getSampleActivityParentCandidate data.ll.common.TripServiceRestApi.getSampleActivityParentCandidate -GET /data/ll/common/TripService/getSpeciesByListAndTrip data.ll.common.TripServiceRestApi.getSpeciesByListAndTrip -GET /data/ll/common/TripService/getTripMap data.ll.common.TripServiceRestApi.getTripMap -GET /data/ll/common/TripService/loadBranchlineForm data.ll.common.TripServiceRestApi.loadBranchlineForm -POST /data/ll/common/TripService/moveActivitySample data.ll.common.TripServiceRestApi.moveActivitySample -POST /data/ll/common/TripService/saveAndCopyProperties data.ll.common.TripServiceRestApi.saveAndCopyProperties -POST /data/ll/common/TripService/saveBranchline data.ll.common.TripServiceRestApi.saveBranchline -POST /data/ps/ActivityPairingService/applyPairing data.ps.ActivityPairingServiceRestApi.applyPairing -POST /data/ps/ActivityPairingService/computePairing data.ps.ActivityPairingServiceRestApi.computePairing -GET /data/ps/AvdthService/importData data.ps.AvdthServiceRestApi.importData -POST /data/ps/ConsolidateDataService/consolidateLocalmarketBatch data.ps.ConsolidateDataServiceRestApi.consolidateLocalmarketBatch -POST /data/ps/ConsolidateDataService/consolidateTrip data.ps.ConsolidateDataServiceRestApi.consolidateTrip -GET /data/ps/ConsolidateDataService/newSimplifiedObjectTypeManager data.ps.ConsolidateDataServiceRestApi.newSimplifiedObjectTypeManager -GET /data/ps/common/TripService/getAllTripIds data.ps.common.TripServiceRestApi.getAllTripIds -GET /data/ps/common/TripService/getMatchingTripsVesselWithinDateRange data.ps.common.TripServiceRestApi.getMatchingTripsVesselWithinDateRange -GET /data/ps/common/TripService/getSpeciesByListAndTrip data.ps.common.TripServiceRestApi.getSpeciesByListAndTrip -GET /data/ps/common/TripService/getTripMap data.ps.common.TripServiceRestApi.getTripMap -GET /data/ps/common/TripService/isActivityEndOfSearchFound data.ps.common.TripServiceRestApi.isActivityEndOfSearchFound -GET /data/ps/common/TripService/loadLocalmarketForm data.ps.common.TripServiceRestApi.loadLocalmarketForm -GET /data/ps/common/TripService/loadLogbookForm data.ps.common.TripServiceRestApi.loadLogbookForm -GET /data/ps/common/TripService/preCreateLogbookFloatingObject data.ps.common.TripServiceRestApi.preCreateLogbookFloatingObject -GET /data/ps/common/TripService/preCreateObservationFloatingObject data.ps.common.TripServiceRestApi.preCreateObservationFloatingObject -POST /referential/ReferentialService/changeId referential.ReferentialServiceRestApi.changeId -DELETE /referential/ReferentialService/delete referential.ReferentialServiceRestApi.delete -GET /referential/ReferentialService/exists referential.ReferentialServiceRestApi.exists -GET /referential/ReferentialService/getEnabledReferentialLabelSet referential.ReferentialServiceRestApi.getEnabledReferentialLabelSet -GET /referential/ReferentialService/getReferenceSet referential.ReferentialServiceRestApi.getReferenceSet -POST /referential/ReferentialService/getReferentialIds referential.ReferentialServiceRestApi.getReferentialIds -GET /referential/ReferentialService/getReferentialReferenceSets referential.ReferentialServiceRestApi.getReferentialReferenceSets -POST /referential/ReferentialService/insertMissingReferential referential.ReferentialServiceRestApi.insertMissingReferential -GET /referential/ReferentialService/loadDto referential.ReferentialServiceRestApi.loadDto -POST /referential/ReferentialService/loadDtoList referential.ReferentialServiceRestApi.loadDtoList -GET /referential/ReferentialService/loadForm referential.ReferentialServiceRestApi.loadForm -GET /referential/ReferentialService/loadIds referential.ReferentialServiceRestApi.loadIds -GET /referential/ReferentialService/preCreate referential.ReferentialServiceRestApi.preCreate -POST /referential/ReferentialService/replaceReference referential.ReferentialServiceRestApi.replaceReference -POST /referential/ReferentialService/save referential.ReferentialServiceRestApi.save -POST /referential/SynchronizeService/applySql referential.SynchronizeServiceRestApi.applySql -POST /referential/SynchronizeService/filterIdsUsed referential.SynchronizeServiceRestApi.filterIdsUsed -POST /referential/SynchronizeService/getReferentialToDelete referential.SynchronizeServiceRestApi.getReferentialToDelete -POST /referential/SynchronizeService/produceSqlResult referential.SynchronizeServiceRestApi.produceSqlResult +GET /AnonymousService/applySecurity AnonymousServiceRestApi.applySecurity +GET /AnonymousService/checkCanConnect AnonymousServiceRestApi.checkCanConnect +GET /AnonymousService/checkCanConnectOrBeEmpty AnonymousServiceRestApi.checkCanConnectOrBeEmpty +POST /AnonymousService/createEmpty AnonymousServiceRestApi.createEmpty +POST /AnonymousService/createFromDump AnonymousServiceRestApi.createFromDump +POST /AnonymousService/createFromImport AnonymousServiceRestApi.createFromImport +GET /AnonymousService/generateHomeId AnonymousServiceRestApi.generateHomeId +GET /AnonymousService/getAvailableDatabaseNames AnonymousServiceRestApi.getAvailableDatabaseNames +GET /AnonymousService/getModelVersion AnonymousServiceRestApi.getModelVersion +GET /AnonymousService/getServerVersion AnonymousServiceRestApi.getServerVersion +GET /AnonymousService/getUsers AnonymousServiceRestApi.getUsers +GET /AnonymousService/migrateData AnonymousServiceRestApi.migrateData +GET /AnonymousService/open AnonymousServiceRestApi.open +GET /DataSourceService/backup DataSourceServiceRestApi.backup +GET /DataSourceService/close DataSourceServiceRestApi.close +POST /DataSourceService/executeSqlScript DataSourceServiceRestApi.executeSqlScript +GET /DataSourceService/getLastUpdateDate DataSourceServiceRestApi.getLastUpdateDate +GET /DataSourceService/isIdValid DataSourceServiceRestApi.isIdValid +POST /DataSourceService/produceAddSqlScript DataSourceServiceRestApi.produceAddSqlScript +POST /DataSourceService/produceCreateSqlScript DataSourceServiceRestApi.produceCreateSqlScript +POST /DataSourceService/produceDeleteSqlScript DataSourceServiceRestApi.produceDeleteSqlScript +POST /DataSourceService/produceMoveSqlScript DataSourceServiceRestApi.produceMoveSqlScript +POST /DataSourceService/retainExistingIds DataSourceServiceRestApi.retainExistingIds +GET /NavigationService/getGroupByDtoSet NavigationServiceRestApi.getGroupByDtoSet +GET /NavigationService/getNavigation NavigationServiceRestApi.getNavigation +GET /NavigationService/loadNavigationPath NavigationServiceRestApi.loadNavigationPath +GET /NavigationService/loadNavigationRoot NavigationServiceRestApi.loadNavigationRoot +GET /NavigationService/loadSelectionRoot NavigationServiceRestApi.loadSelectionRoot +GET /ReferenceService/createData ReferenceServiceRestApi.createData +GET /ReferenceService/createReferential ReferenceServiceRestApi.createReferential +GET /ReferenceService/loadData ReferenceServiceRestApi.loadData +GET /ReferenceService/loadReferential ReferenceServiceRestApi.loadReferential +POST /ReportService/executeReport ReportServiceRestApi.executeReport +POST /ReportService/populateVariables ReportServiceRestApi.populateVariables +GET /UsageService/countMandatoryData UsageServiceRestApi.countMandatoryData +GET /UsageService/countOptionalData UsageServiceRestApi.countOptionalData +GET /UsageService/countReferential UsageServiceRestApi.countReferential +POST /UsageService/findMandatoryData UsageServiceRestApi.findMandatoryData +POST /UsageService/findOptionalData UsageServiceRestApi.findOptionalData +POST /UsageService/findReferential UsageServiceRestApi.findReferential +POST /ValidateService/validateData ValidateServiceRestApi.validateData +POST /ValidateService/validateReferential ValidateServiceRestApi.validateReferential +POST /api/DataEntityService/create api.DataEntityServiceRestApi.create +DELETE /api/DataEntityService/delete api.DataEntityServiceRestApi.delete +GET /api/DataEntityService/generateId api.DataEntityServiceRestApi.generateId +GET /api/DataEntityService/getOne api.DataEntityServiceRestApi.getOne +GET /api/DataEntityService/getSome api.DataEntityServiceRestApi.getSome +POST /api/DataEntityService/update api.DataEntityServiceRestApi.update +POST /api/ReferentialEntityService/create api.ReferentialEntityServiceRestApi.create +DELETE /api/ReferentialEntityService/delete api.ReferentialEntityServiceRestApi.delete +GET /api/ReferentialEntityService/generateId api.ReferentialEntityServiceRestApi.generateId +GET /api/ReferentialEntityService/getAll api.ReferentialEntityServiceRestApi.getAll +GET /api/ReferentialEntityService/getByModule api.ReferentialEntityServiceRestApi.getByModule +GET /api/ReferentialEntityService/getByPackage api.ReferentialEntityServiceRestApi.getByPackage +GET /api/ReferentialEntityService/getOne api.ReferentialEntityServiceRestApi.getOne +GET /api/ReferentialEntityService/getSome api.ReferentialEntityServiceRestApi.getSome +PUT /api/ReferentialEntityService/update api.ReferentialEntityServiceRestApi.update +GET /api/SqlService/select api.SqlServiceRestApi.select +GET /data/ContainerService/loadForm data.ContainerServiceRestApi.loadForm +POST /data/ContainerService/save data.ContainerServiceRestApi.save +GET /data/DataFileService/getDataFile data.DataFileServiceRestApi.getDataFile +POST /data/DataManagementService/deleteData data.DataManagementServiceRestApi.deleteData +POST /data/DataManagementService/exportData data.DataManagementServiceRestApi.exportData +POST /data/DataManagementService/importData data.DataManagementServiceRestApi.importData +DELETE /data/EditableService/delete data.EditableServiceRestApi.delete +GET /data/EditableService/exists data.EditableServiceRestApi.exists +GET /data/EditableService/loadDto data.EditableServiceRestApi.loadDto +GET /data/EditableService/loadForm data.EditableServiceRestApi.loadForm +GET /data/EditableService/preCreate data.EditableServiceRestApi.preCreate +POST /data/EditableService/save data.EditableServiceRestApi.save +DELETE /data/OpenableService/delete data.OpenableServiceRestApi.delete +GET /data/OpenableService/exists data.OpenableServiceRestApi.exists +GET /data/OpenableService/getBrothers data.OpenableServiceRestApi.getBrothers +GET /data/OpenableService/getBrothersFromParent data.OpenableServiceRestApi.getBrothersFromParent +GET /data/OpenableService/getChildren data.OpenableServiceRestApi.getChildren +GET /data/OpenableService/getChildrenUpdate data.OpenableServiceRestApi.getChildrenUpdate +POST /data/OpenableService/getMandatoryDependencies data.OpenableServiceRestApi.getMandatoryDependencies +POST /data/OpenableService/getMandatoryDependenciesCount data.OpenableServiceRestApi.getMandatoryDependenciesCount +POST /data/OpenableService/getOptionalDependencies data.OpenableServiceRestApi.getOptionalDependencies +POST /data/OpenableService/getOptionalDependenciesCount data.OpenableServiceRestApi.getOptionalDependenciesCount +GET /data/OpenableService/loadDto data.OpenableServiceRestApi.loadDto +GET /data/OpenableService/loadForm data.OpenableServiceRestApi.loadForm +POST /data/OpenableService/move data.OpenableServiceRestApi.move +GET /data/OpenableService/preCreate data.OpenableServiceRestApi.preCreate +POST /data/OpenableService/save data.OpenableServiceRestApi.save +POST /data/RootOpenableService/computeMissingReferential data.RootOpenableServiceRestApi.computeMissingReferential +DELETE /data/RootOpenableService/delete data.RootOpenableServiceRestApi.delete +DELETE /data/RootOpenableService/deleteLayout data.RootOpenableServiceRestApi.deleteLayout +GET /data/RootOpenableService/exists data.RootOpenableServiceRestApi.exists +GET /data/RootOpenableService/getBrothers data.RootOpenableServiceRestApi.getBrothers +GET /data/RootOpenableService/getChildren data.RootOpenableServiceRestApi.getChildren +GET /data/RootOpenableService/getChildrenUpdate data.RootOpenableServiceRestApi.getChildrenUpdate +GET /data/RootOpenableService/getGroupByDtoValue data.RootOpenableServiceRestApi.getGroupByDtoValue +GET /data/RootOpenableService/getGroupByValue data.RootOpenableServiceRestApi.getGroupByValue +GET /data/RootOpenableService/loadDto data.RootOpenableServiceRestApi.loadDto +GET /data/RootOpenableService/loadForm data.RootOpenableServiceRestApi.loadForm +POST /data/RootOpenableService/moveLayout data.RootOpenableServiceRestApi.moveLayout +GET /data/RootOpenableService/preCreate data.RootOpenableServiceRestApi.preCreate +POST /data/RootOpenableService/save data.RootOpenableServiceRestApi.save +GET /data/SimpleService/loadForm data.SimpleServiceRestApi.loadForm +POST /data/SimpleService/save data.SimpleServiceRestApi.save +POST /data/ll/ActivityPairingService/applyPairing data.ll.ActivityPairingServiceRestApi.applyPairing +POST /data/ll/ActivityPairingService/computePairing data.ll.ActivityPairingServiceRestApi.computePairing +GET /data/ll/common/TripService/getAllTripIds data.ll.common.TripServiceRestApi.getAllTripIds +GET /data/ll/common/TripService/getLogbookCatchSpeciesIds data.ll.common.TripServiceRestApi.getLogbookCatchSpeciesIds +GET /data/ll/common/TripService/getMatchingTripsVesselWithinDateRange data.ll.common.TripServiceRestApi.getMatchingTripsVesselWithinDateRange +GET /data/ll/common/TripService/getSampleActivityParentCandidate data.ll.common.TripServiceRestApi.getSampleActivityParentCandidate +GET /data/ll/common/TripService/getSpeciesByListAndTrip data.ll.common.TripServiceRestApi.getSpeciesByListAndTrip +GET /data/ll/common/TripService/getTripMap data.ll.common.TripServiceRestApi.getTripMap +GET /data/ll/common/TripService/loadBranchlineForm data.ll.common.TripServiceRestApi.loadBranchlineForm +POST /data/ll/common/TripService/moveActivitySample data.ll.common.TripServiceRestApi.moveActivitySample +POST /data/ll/common/TripService/saveAndCopyProperties data.ll.common.TripServiceRestApi.saveAndCopyProperties +POST /data/ll/common/TripService/saveBranchline data.ll.common.TripServiceRestApi.saveBranchline +POST /data/ps/ActivityPairingService/applyPairing data.ps.ActivityPairingServiceRestApi.applyPairing +POST /data/ps/ActivityPairingService/computePairing data.ps.ActivityPairingServiceRestApi.computePairing +GET /data/ps/AvdthService/importData data.ps.AvdthServiceRestApi.importData +POST /data/ps/ConsolidateDataService/consolidateLocalmarketBatch data.ps.ConsolidateDataServiceRestApi.consolidateLocalmarketBatch +POST /data/ps/ConsolidateDataService/consolidateTrip data.ps.ConsolidateDataServiceRestApi.consolidateTrip +GET /data/ps/ConsolidateDataService/newSimplifiedObjectTypeManager data.ps.ConsolidateDataServiceRestApi.newSimplifiedObjectTypeManager +GET /data/ps/common/TripService/getAllTripIds data.ps.common.TripServiceRestApi.getAllTripIds +GET /data/ps/common/TripService/getMatchingTripsVesselWithinDateRange data.ps.common.TripServiceRestApi.getMatchingTripsVesselWithinDateRange +GET /data/ps/common/TripService/getPsObservationCatchesSpeciesFateBySpeciesId data.ps.common.TripServiceRestApi.getPsObservationCatchesSpeciesFateBySpeciesId +GET /data/ps/common/TripService/getSpeciesByListAndTrip data.ps.common.TripServiceRestApi.getSpeciesByListAndTrip +GET /data/ps/common/TripService/getTripMap data.ps.common.TripServiceRestApi.getTripMap +GET /data/ps/common/TripService/isActivityEndOfSearchFound data.ps.common.TripServiceRestApi.isActivityEndOfSearchFound +GET /data/ps/common/TripService/loadLocalmarketForm data.ps.common.TripServiceRestApi.loadLocalmarketForm +GET /data/ps/common/TripService/loadLogbookForm data.ps.common.TripServiceRestApi.loadLogbookForm +GET /data/ps/common/TripService/preCreateLogbookFloatingObject data.ps.common.TripServiceRestApi.preCreateLogbookFloatingObject +GET /data/ps/common/TripService/preCreateObservationFloatingObject data.ps.common.TripServiceRestApi.preCreateObservationFloatingObject +POST /referential/ReferentialService/changeId referential.ReferentialServiceRestApi.changeId +DELETE /referential/ReferentialService/delete referential.ReferentialServiceRestApi.delete +GET /referential/ReferentialService/exists referential.ReferentialServiceRestApi.exists +GET /referential/ReferentialService/getEnabledReferentialLabelSet referential.ReferentialServiceRestApi.getEnabledReferentialLabelSet +GET /referential/ReferentialService/getReferenceSet referential.ReferentialServiceRestApi.getReferenceSet +POST /referential/ReferentialService/getReferentialIds referential.ReferentialServiceRestApi.getReferentialIds +GET /referential/ReferentialService/getReferentialReferenceSets referential.ReferentialServiceRestApi.getReferentialReferenceSets +POST /referential/ReferentialService/insertMissingReferential referential.ReferentialServiceRestApi.insertMissingReferential +GET /referential/ReferentialService/loadDto referential.ReferentialServiceRestApi.loadDto +POST /referential/ReferentialService/loadDtoList referential.ReferentialServiceRestApi.loadDtoList +GET /referential/ReferentialService/loadForm referential.ReferentialServiceRestApi.loadForm +GET /referential/ReferentialService/loadIds referential.ReferentialServiceRestApi.loadIds +GET /referential/ReferentialService/preCreate referential.ReferentialServiceRestApi.preCreate +POST /referential/ReferentialService/replaceReference referential.ReferentialServiceRestApi.replaceReference +POST /referential/ReferentialService/save referential.ReferentialServiceRestApi.save +POST /referential/SynchronizeService/applySql referential.SynchronizeServiceRestApi.applySql +POST /referential/SynchronizeService/filterIdsUsed referential.SynchronizeServiceRestApi.filterIdsUsed +POST /referential/SynchronizeService/getReferentialToDelete referential.SynchronizeServiceRestApi.getReferentialToDelete +POST /referential/SynchronizeService/produceSqlResult referential.SynchronizeServiceRestApi.produceSqlResult View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/be355177ae519cd2affd66957... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/be355177ae519cd2affd66957... You're receiving this email because of your account on gitlab.com.