Skip to content

Commit a6e2669

Browse files
committed
feat(responses): get responses by list of ids
1 parent 3ec02c7 commit a6e2669

9 files changed

Lines changed: 359 additions & 29 deletions

File tree

src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ public ResponseEntity<Object> findResponsesByInterrogationAndCollectionInstrumen
286286
@PreAuthorize("hasRole('ADMIN')")
287287
public ResponseEntity<List<SurveyUnitModel>> getLatestByInterrogationAndCollectionInstrument(@RequestParam("interrogationId") String interrogationId,
288288
@RequestParam("collectionInstrumentId") String collectionInstrumentId) {
289-
List<SurveyUnitModel> responses = surveyUnitService.findLatestByIdAndByCollectionInstrumentId(interrogationId, collectionInstrumentId);
289+
List<SurveyUnitModel> responses = surveyUnitService.findLatestByInterrogationIdAndCollectionInstrumentId(interrogationId, collectionInstrumentId);
290290
return ResponseEntity.ok(responses);
291291
}
292292

@@ -300,7 +300,7 @@ public ResponseEntity<List<SurveyUnitModel>> getLatestByInterrogationAndCollecti
300300
public ResponseEntity<SurveyUnitSimplifiedDto> getLatestByInterrogationOneObject(@RequestParam("interrogationId") String interrogationId,
301301
@RequestParam("collectionInstrumentId") String collectionInstrumentId,
302302
@RequestParam("mode") Mode mode) {
303-
List<SurveyUnitModel> responses = surveyUnitService.findLatestByIdAndByCollectionInstrumentId(interrogationId, collectionInstrumentId);
303+
List<SurveyUnitModel> responses = surveyUnitService.findLatestByInterrogationIdAndCollectionInstrumentId(interrogationId, collectionInstrumentId);
304304
List<VariableModel> outputVariables = new ArrayList<>();
305305
List<VariableModel> outputExternalVariables = new ArrayList<>();
306306
RawResponseDto.QuestionnaireStateEnum questionnaireState = null;
@@ -365,7 +365,7 @@ public ResponseEntity<List<SurveyUnitSimplifiedDto>> getLatestForInterrogationLi
365365
List<SurveyUnitSimplifiedDto> results = new ArrayList<>();
366366
List<Mode> modes = surveyUnitService.findModesByCollectionInstrumentId(collectionInstrumentId);
367367
interrogationIds.forEach(interrogationId -> {
368-
List<SurveyUnitModel> responses = surveyUnitService.findLatestByIdAndByCollectionInstrumentId(
368+
List<SurveyUnitModel> responses = surveyUnitService.findLatestByInterrogationIdAndCollectionInstrumentId(
369369
interrogationId.getInterrogationId(), collectionInstrumentId
370370
);
371371
modes.forEach(mode -> {

src/main/java/fr/insee/genesis/domain/ports/api/SurveyUnitApiPort.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ public interface SurveyUnitApiPort {
2626

2727
List<SurveyUnitModel> findByInterrogationId(String interrogationId);
2828

29-
List<SurveyUnitModel> findLatestByIdAndByCollectionInstrumentId(String interrogationId, String collectionInstrumentId);
29+
List<SurveyUnitModel> findLatestByInterrogationIdAndCollectionInstrumentId(String interrogationId, String collectionInstrumentId);
30+
List<SurveyUnitModel> findLatestByInterrogationIds(
31+
String collectionInstrumentOrQuestionnaireId,
32+
Set<String> interrogationIds
33+
);
3034

3135
SurveyUnitSimplifiedDto findSimplified(
3236
String collectionInstrumentId,

src/main/java/fr/insee/genesis/domain/ports/spi/SurveyUnitPersistencePort.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ public interface SurveyUnitPersistencePort {
1717

1818
List<SurveyUnitModel> findByUsualSurveyUnitAndCollectionInstrumentIds(String usualSurveyUnitId, String collectionInstrumentId);
1919

20-
//========= OPTIMISATIONS PERFS (START) ==========
2120
/**
2221
* @author Adrien Marchal
2322
*/
24-
List<SurveyUnitModel> findBySetOfIdsAndQuestionnaireIdAndMode(String questionnaireId, String mode, List<String> interrogationIdSet);
25-
//========= OPTIMISATIONS PERFS (START) ==========
23+
List<SurveyUnitModel> findByQuestionnaireIdAndModeAndInterrogationIds(String questionnaireId, String mode, List<String> interrogationIdSet);
24+
25+
List<SurveyUnitModel> findByCollectionInstrumentOrQuestionnaireIdAndInterrogationIds(String collectionInstrumentOrQuestionnaireId, List<String> interrogationIdSet);
2626

2727
List<SurveyUnitModel> findByInterrogationId(String interrogationId);
2828

src/main/java/fr/insee/genesis/domain/service/surveyunit/SurveyUnitService.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,32 @@ public List<SurveyUnitModel> findByInterrogationId(String interrogationId) {
8888
* @return the latest update for each variable of a survey unit
8989
*/
9090
@Override
91-
public List<SurveyUnitModel> findLatestByIdAndByCollectionInstrumentId(String interrogationId, String collectionInstrumentId) {
92-
List<SurveyUnitModel> latestUpdatesbyVariables = new ArrayList<>();
91+
public List<SurveyUnitModel> findLatestByInterrogationIdAndCollectionInstrumentId(String interrogationId, String collectionInstrumentId) {
9392
List<SurveyUnitModel> surveyUnitModels = surveyUnitPersistencePort.findByIds(interrogationId, collectionInstrumentId);
93+
return getLatestSurveyUnitModels(surveyUnitModels);
94+
}
95+
96+
/**
97+
* @param collectionInstrumentOrQuestionnaireId : Collection instrument id/questionnaire id
98+
* @param interrogationIdSet : Interrogation ids
99+
* @return the latest updates for given interrogationIds
100+
*/
101+
@Override
102+
public List<SurveyUnitModel> findLatestByInterrogationIds(
103+
String collectionInstrumentOrQuestionnaireId,
104+
Set<String> interrogationIdSet
105+
) {
106+
List<SurveyUnitModel> surveyUnitModels = surveyUnitPersistencePort.findByCollectionInstrumentOrQuestionnaireIdAndInterrogationIds(
107+
collectionInstrumentOrQuestionnaireId,
108+
interrogationIdSet.stream().toList()
109+
);
110+
111+
return getLatestSurveyUnitModels(surveyUnitModels);
112+
}
113+
114+
private List<SurveyUnitModel> getLatestSurveyUnitModels(List<SurveyUnitModel> surveyUnitModels) {
115+
List<SurveyUnitModel> latestUpdatesByVariables = new ArrayList<>();
116+
94117
List<Mode> modes = getDistinctsModes(surveyUnitModels);
95118
modes.forEach(mode ->{
96119
List<SurveyUnitModel> suByMode = surveyUnitModels.stream()
@@ -99,7 +122,7 @@ public List<SurveyUnitModel> findLatestByIdAndByCollectionInstrumentId(String in
99122
.toList();
100123

101124
//We had all the variables of the oldest update
102-
latestUpdatesbyVariables.add(suByMode.getFirst());
125+
latestUpdatesByVariables.add(suByMode.getFirst());
103126
//We keep the name of already added variables to skip them in older updates
104127
Set<VarIdScopeTuple> addedVariables = new HashSet<>();
105128
SurveyUnitModel latestUpdate = suByMode.getFirst();
@@ -152,11 +175,11 @@ public List<SurveyUnitModel> findLatestByIdAndByCollectionInstrumentId(String in
152175
if (!collectedVariablesToKeep.isEmpty() || !externalVariablesToKeep.isEmpty()){
153176
surveyUnitModel.setCollectedVariables(collectedVariablesToKeep);
154177
surveyUnitModel.setExternalVariables(externalVariablesToKeep);
155-
latestUpdatesbyVariables.add(surveyUnitModel);
178+
latestUpdatesByVariables.add(surveyUnitModel);
156179
}
157180
});
158181
});
159-
return latestUpdatesbyVariables;
182+
return latestUpdatesByVariables;
160183
}
161184

162185
private void addDataStateIntoList(List<VariableModel> variableModelList, DataState state){
@@ -197,7 +220,7 @@ public SurveyUnitSimplifiedDto findSimplified(
197220
String interrogationId,
198221
Mode mode,
199222
Instant recordedBefore) throws NoDataException {
200-
List<SurveyUnitModel> responses = findLatestByIdAndByCollectionInstrumentId(interrogationId, collectionInstrumentId);
223+
List<SurveyUnitModel> responses = findLatestByInterrogationIdAndCollectionInstrumentId(interrogationId, collectionInstrumentId);
201224

202225
if(responses.isEmpty()){
203226
String errorMessage = "No response found for interrogation %s".formatted(interrogationId);
@@ -294,7 +317,7 @@ public List<List<SurveyUnitModel>> findLatestByIdAndByQuestionnaireIdAndModeOrde
294317
List<String> queryInParam = interrogationIds.stream().map(InterrogationId::getInterrogationId).toList();
295318

296319
//Get !!!all versions!!! of a set of "interrogationIds"
297-
List<SurveyUnitModel> allResponsesVersionsSet = surveyUnitPersistencePort.findBySetOfIdsAndQuestionnaireIdAndMode(questionnaireId, mode, queryInParam);
320+
List<SurveyUnitModel> allResponsesVersionsSet = surveyUnitPersistencePort.findByQuestionnaireIdAndModeAndInterrogationIds(questionnaireId, mode, queryInParam);
298321

299322
//2) FILTER BY interrogationId AND ORDER BY DATE (MOST RECENT FIRST, oldest last)
300323
interrogationIds.forEach(interrogationId -> {

src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,24 @@ public List<SurveyUnitModel> findByUsualSurveyUnitAndCollectionInstrumentIds(Str
7373
* @author Adrien Marchal
7474
*/
7575
@Override
76-
public List<SurveyUnitModel> findBySetOfIdsAndQuestionnaireIdAndMode(String questionnaireId, String mode, List<String> interrogationIdSet) {
76+
public List<SurveyUnitModel> findByQuestionnaireIdAndModeAndInterrogationIds(String questionnaireId, String mode, List<String> interrogationIdSet) {
7777
List<SurveyUnitDocument> surveyUnits = mongoRepository.findBySetOfIdsAndQuestionnaireIdAndMode(questionnaireId, mode, interrogationIdSet);
7878
return surveyUnits.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(surveyUnits);
7979
}
8080
//========= OPTIMISATIONS PERFS (END) ==========
8181

82+
@Override
83+
public List<SurveyUnitModel> findByCollectionInstrumentOrQuestionnaireIdAndInterrogationIds(
84+
String collectionInstrumentOrQuestionnaireId, List<String> interrogationIds
85+
) {
86+
List<SurveyUnitDocument> surveyUnits = new ArrayList<>();
87+
88+
surveyUnits.addAll(mongoRepository.findByQuestionnaireIdAndInterrogationIds(collectionInstrumentOrQuestionnaireId, interrogationIds));
89+
surveyUnits.addAll(mongoRepository.findByCollectionInstrumentIdAndInterrogationIds(collectionInstrumentOrQuestionnaireId, interrogationIds));
90+
91+
return surveyUnits.isEmpty() ? Collections.emptyList() : SurveyUnitDocumentMapper.INSTANCE.listDocumentToListModel(surveyUnits);
92+
}
93+
8294
@Override
8395
public List<SurveyUnitModel> findByInterrogationId(String interrogationId) {
8496
List<SurveyUnitDocument> surveyUnits = mongoRepository.findByInterrogationId(interrogationId);

src/main/java/fr/insee/genesis/infrastructure/repository/SurveyUnitMongoDBRepository.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,25 @@ public interface SurveyUnitMongoDBRepository extends MongoRepository<SurveyUnitD
3030
* @author Adrien Marchal
3131
*/
3232
@Query("{ 'questionnaireId' : ?0, 'mode' : ?1, 'interrogationId' : { $in: ?2 } }")
33-
List<SurveyUnitDocument> findBySetOfIdsAndQuestionnaireIdAndMode(String questionnaireId, String mode, List<String> interrogationIdSet);
33+
List<SurveyUnitDocument> findBySetOfIdsAndQuestionnaireIdAndMode(
34+
String questionnaireId,
35+
String mode,
36+
List<String> interrogationIds
37+
);
3438
//========= OPTIMISATIONS PERFS (END) ==========
3539

40+
@Query("{ 'questionnaireId' : ?0, 'interrogationId' : { $in: ?2 } }")
41+
List<SurveyUnitDocument> findByQuestionnaireIdAndInterrogationIds(
42+
String questionnaireId,
43+
List<String> interrogationIds
44+
);
45+
@Query("{ 'collectionInstrumentId' : ?0, 'interrogationId' : { $in: ?2 } }")
46+
List<SurveyUnitDocument> findByCollectionInstrumentIdAndInterrogationIds(
47+
String collectionInstrumentId,
48+
List<String> interrogationIds
49+
);
50+
51+
3652
@Query(value = "{ 'questionnaireId' : ?0 }", fields = "{ 'interrogationId' : 1, 'mode' : 1 }")
3753
List<SurveyUnitDocument> findInterrogationIdsByQuestionnaireId(String questionnaireId);
3854

src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ class GetLatestByInterrogationAndCollectionInstrumentTests {
278278
@DisplayName("Should return 200 with list of models")
279279
void getLatest_shouldReturn200() throws Exception {
280280
// GIVEN
281-
when(surveyUnitApiPort.findLatestByIdAndByCollectionInstrumentId("INTERRO01", "QUEST01"))
281+
when(surveyUnitApiPort.findLatestByInterrogationIdAndCollectionInstrumentId("INTERRO01", "QUEST01"))
282282
.thenReturn(List.of());
283283

284284
// WHEN / THEN
@@ -298,7 +298,7 @@ class GetLatestByInterrogationOneObjectTests {
298298
void getLatestOneObject_shouldReturn200AndAggregateVariables() throws Exception {
299299
// GIVEN
300300
SurveyUnitModel model = buildSurveyUnitModel("INTERRO01", "QUEST01", Mode.WEB, DataState.COLLECTED);
301-
when(surveyUnitApiPort.findLatestByIdAndByCollectionInstrumentId("INTERRO01", "QUEST01"))
301+
when(surveyUnitApiPort.findLatestByInterrogationIdAndCollectionInstrumentId("INTERRO01", "QUEST01"))
302302
.thenReturn(List.of(model));
303303

304304
// WHEN / THEN
@@ -316,7 +316,7 @@ void getLatestOneObject_shouldFilterByMode() throws Exception {
316316
// GIVEN
317317
SurveyUnitModel webModel = buildSurveyUnitModel("INTERRO01", "QUEST01", Mode.WEB, DataState.COLLECTED);
318318
SurveyUnitModel paperModel = buildSurveyUnitModel("INTERRO01", "QUEST01", Mode.PAPER, DataState.COLLECTED);
319-
when(surveyUnitApiPort.findLatestByIdAndByCollectionInstrumentId("INTERRO01", "QUEST01"))
319+
when(surveyUnitApiPort.findLatestByInterrogationIdAndCollectionInstrumentId("INTERRO01", "QUEST01"))
320320
.thenReturn(List.of(webModel, paperModel));
321321

322322
// WHEN / THEN
@@ -374,7 +374,7 @@ void getLatestList_shouldReturn200() throws Exception {
374374
SurveyUnitModel model = buildSurveyUnitModel("INTERRO01", "QUEST01", Mode.WEB, DataState.COLLECTED);
375375
when(surveyUnitApiPort.findModesByCollectionInstrumentId("QUEST01"))
376376
.thenReturn(List.of(Mode.WEB));
377-
when(surveyUnitApiPort.findLatestByIdAndByCollectionInstrumentId("INTERRO01", "QUEST01"))
377+
when(surveyUnitApiPort.findLatestByInterrogationIdAndCollectionInstrumentId("INTERRO01", "QUEST01"))
378378
.thenReturn(List.of(model));
379379

380380
// WHEN / THEN
@@ -399,7 +399,7 @@ void getLatestList_noVariables_shouldReturnEmptyList() throws Exception {
399399
.build();
400400
when(surveyUnitApiPort.findModesByCollectionInstrumentId("QUEST01"))
401401
.thenReturn(List.of(Mode.WEB));
402-
when(surveyUnitApiPort.findLatestByIdAndByCollectionInstrumentId("INTERRO01", "QUEST01"))
402+
when(surveyUnitApiPort.findLatestByInterrogationIdAndCollectionInstrumentId("INTERRO01", "QUEST01"))
403403
.thenReturn(List.of(modelNoVars));
404404

405405
// WHEN / THEN

0 commit comments

Comments
 (0)