Skip to content

Commit e8c3e86

Browse files
committed
chore: update branch from main
2 parents 8fd8b91 + 391dab5 commit e8c3e86

19 files changed

+243
-22
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
# Changelog
2+
## 1.13.0 [2025-12-04]
3+
### Changed
4+
- New raw data process endpoint
5+
26
## 1.12.2 [2025-11-06]
37
### Fixed
48
- Scientific notation for Doubles during raw data processing

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>fr.insee.genesis</groupId>
66
<artifactId>genesis-api</artifactId>
7-
<version>1.12.4</version>
7+
<version>1.13.0</version>
88
<packaging>jar</packaging>
99
<name>genesis-api</name>
1010

@@ -36,7 +36,7 @@
3636
<pitest.version>1.22.0</pitest.version>
3737
<pitest.junit.version>1.2.3</pitest.junit.version>
3838
<jackson.version>2.19.0</jackson.version>
39-
<bpm.version>1.0.19</bpm.version>
39+
<bpm.version>1.0.20</bpm.version>
4040
</properties>
4141
<dependencies>
4242
<dependency>

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ public ResponseEntity<LunaticJsonRawDataModel> getJsonRawData(
241241
@Operation(summary = "Process raw data of a campaign")
242242
@PostMapping(path = "/responses/raw/lunatic-json/process")
243243
@PreAuthorize("hasRole('SCHEDULER')")
244+
@Deprecated(since = "1.13.0")
244245
public ResponseEntity<String> processJsonRawData(
245246
@RequestParam("campaignName") String campaignName,
246247
@RequestParam("questionnaireId") String questionnaireId,
@@ -260,6 +261,24 @@ public ResponseEntity<String> processJsonRawData(
260261
}
261262
}
262263

264+
@Operation(summary = "Process raw data of a questionnaire")
265+
@PostMapping(path = "/{collectionInstrumentId}/process")
266+
@PreAuthorize("hasRole('SCHEDULER')")
267+
public ResponseEntity<String> processJsonRawData(
268+
@PathVariable String collectionInstrumentId
269+
) {
270+
log.info("Try to process raw JSON datas for questionnaire {}",collectionInstrumentId);
271+
try {
272+
DataProcessResult result = lunaticJsonRawDataApiPort.processRawData(collectionInstrumentId);
273+
return result.formattedDataCount() == 0 ?
274+
ResponseEntity.ok("%d document(s) processed".formatted(result.dataCount()))
275+
: ResponseEntity.ok("%d document(s) processed, including %d FORMATTED after data verification"
276+
.formatted(result.dataCount(), result.formattedDataCount()));
277+
} catch (GenesisException e) {
278+
return ResponseEntity.status(e.getStatus()).body(e.getMessage());
279+
}
280+
}
281+
263282
@Operation(summary = "Get processed data ids from last n hours (default 24h)")
264283
@GetMapping(path = "/responses/raw/lunatic-json/processed/ids")
265284
@PreAuthorize("hasRole('ADMIN')")

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ private void processCampaignWithMode(String campaignName, Mode mode, String root
503503
}
504504

505505
//Create context if not exist
506-
if(contextService.getContextByPartitionId(campaignName) == null){
506+
if(contextService.getContextByCollectionInstrumentId(campaignName) == null){
507507
contextService.saveContext(campaignName, false);
508508
}
509509

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
package fr.insee.genesis.domain.model.surveyunit.rawdata;
22

3-
public record DataProcessResult(int dataCount, int formattedDataCount) {
3+
import fr.insee.genesis.exceptions.GenesisError;
4+
5+
import java.util.List;
6+
7+
public record DataProcessResult(int dataCount, int formattedDataCount, List<GenesisError> errors) {
48
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ void saveKraftwerkExecutionSchedule(String partitionId,
3131
long countSchedules();
3232

3333
DataProcessingContextModel getContext(String interrogationId) throws GenesisException;
34-
DataProcessingContextModel getContextByPartitionId(String partitionId) throws GenesisException;
3534

3635
DataProcessingContextModel getContextByCollectionInstrumentId(String collectionInstrumentId);
3736

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public interface LunaticJsonRawDataApiPort {
2828
long countResponsesByQuestionnaireId(String campaignId);
2929
Page<LunaticJsonRawDataModel> findRawDataByCampaignIdAndDate(String campaignId, Instant startDt, Instant endDt, Pageable pageable);
3030

31+
@Deprecated(since = "1.13.0")
3132
DataProcessResult processRawData(String campaignName, List<String> interrogationIdList, List<GenesisError> errors) throws GenesisException;
33+
34+
DataProcessResult processRawData(String collectionInstrumentId) throws GenesisException;
35+
3236
Map<String, List<String>> findProcessedIdsgroupedByQuestionnaireSince(LocalDateTime since);
3337
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ public interface LunaticJsonRawDataPersistencePort {
2222
long countResponsesByQuestionnaireId(String questionnaireId);
2323
List<GroupedInterrogation> findProcessedIdsGroupedByQuestionnaireSince(LocalDateTime since);
2424
List<GroupedInterrogation> findUnprocessedIds();
25+
Set<String> findUnprocessedInterrogationIdsByCollectionInstrumentId(String collectionInstrumentId);
2526
}

src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,6 @@ public DataProcessingContextModel getContext(String interrogationId) throws Gene
167167
);
168168
}
169169

170-
@Override
171-
public DataProcessingContextModel getContextByPartitionId(String partitionId){
172-
return DataProcessingContextMapper.INSTANCE.documentToModel(
173-
dataProcessingContextPersistancePort.findByPartitionId(partitionId)
174-
);
175-
}
176-
177170
@Override
178171
public DataProcessingContextModel getContextByCollectionInstrumentId(String collectionInstrumentId){
179172
return DataProcessingContextMapper.INSTANCE.documentToModel(

src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java

Lines changed: 82 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,22 +100,16 @@ public List<LunaticJsonRawDataModel> getRawData(String campaignName, Mode mode,
100100
}
101101

102102
@Override
103+
@Deprecated(since = "1.13.0")
103104
public DataProcessResult processRawData(String campaignName, List<String> interrogationIdList, List<GenesisError> errors) throws GenesisException {
104105
int dataCount=0;
105106
int formattedDataCount=0;
106107
DataProcessingContextModel dataProcessingContext =
107-
dataProcessingContextService.getContextByPartitionId(campaignName);
108+
dataProcessingContextService.getContextByCollectionInstrumentId(campaignName);
108109
List<Mode> modesList = controllerUtils.getModesList(campaignName, null);
109110
for (Mode mode : modesList) {
110111
//Load and save metadata into database, throw exception if none
111-
VariablesMap variablesMap = metadataService.loadAndSaveIfNotExists(campaignName, campaignName, mode, fileUtils,
112-
errors).getVariables();
113-
if (variablesMap == null) {
114-
throw new GenesisException(400,
115-
"Error during metadata parsing for mode %s :%n%s"
116-
.formatted(mode, errors.getLast().getMessage())
117-
);
118-
}
112+
VariablesMap variablesMap = getVariablesMap(campaignName, mode, errors);
119113
int totalBatchs = Math.ceilDiv(interrogationIdList.size() , config.getRawDataProcessingBatchSize());
120114
int batchNumber = 1;
121115
List<String> interrogationIdListForMode = new ArrayList<>(interrogationIdList);
@@ -156,7 +150,85 @@ public DataProcessResult processRawData(String campaignName, List<String> interr
156150
batchNumber++;
157151
}
158152
}
159-
return new DataProcessResult(dataCount, formattedDataCount);
153+
return new DataProcessResult(dataCount, formattedDataCount, errors);
154+
}
155+
156+
@Override
157+
public DataProcessResult processRawData(String questionnaireId) throws GenesisException {
158+
int dataCount=0;
159+
int formattedDataCount=0;
160+
DataProcessingContextModel dataProcessingContext =
161+
dataProcessingContextService.getContextByCollectionInstrumentId(questionnaireId);
162+
List<GenesisError> errors = new ArrayList<>();
163+
164+
List<Mode> modesList = controllerUtils.getModesList(questionnaireId, null);
165+
for (Mode mode : modesList) {
166+
//Load and save metadata into database, throw exception if none
167+
VariablesMap variablesMap = getVariablesMap(questionnaireId, mode, errors);
168+
Set<String> interrogationIds =
169+
lunaticJsonRawDataPersistencePort.findUnprocessedInterrogationIdsByCollectionInstrumentId(questionnaireId);
170+
171+
int totalBatchs = Math.ceilDiv(interrogationIds.size() , config.getRawDataProcessingBatchSize());
172+
int batchNumber = 1;
173+
List<String> interrogationIdListForMode = new ArrayList<>(interrogationIds);
174+
while(!interrogationIdListForMode.isEmpty()){
175+
log.info("Processing raw data batch {}/{}", batchNumber, totalBatchs);
176+
177+
int maxIndex = Math.min(interrogationIdListForMode.size(), config.getRawDataProcessingBatchSize());
178+
List<SurveyUnitModel> surveyUnitModels = getConvertedSurveyUnits(
179+
questionnaireId,
180+
mode,
181+
interrogationIdListForMode,
182+
maxIndex,
183+
variablesMap
184+
);
185+
186+
//Save converted data
187+
surveyUnitQualityService.verifySurveyUnits(surveyUnitModels, variablesMap);
188+
surveyUnitService.saveSurveyUnits(surveyUnitModels);
189+
190+
//Update process dates
191+
updateProcessDates(surveyUnitModels);
192+
193+
//Increment data count
194+
dataCount += surveyUnitModels.size();
195+
formattedDataCount += surveyUnitModels.stream()
196+
.filter(surveyUnitModel -> surveyUnitModel.getState().equals(DataState.FORMATTED))
197+
.toList()
198+
.size();
199+
200+
//Send processed ids grouped by questionnaire (if review activated)
201+
if(dataProcessingContext != null && dataProcessingContext.isWithReview()) {
202+
sendProcessedIdsToQualityTool(surveyUnitModels);
203+
}
204+
205+
//Remove processed ids from list
206+
interrogationIdListForMode = interrogationIdListForMode.subList(maxIndex, interrogationIdListForMode.size());
207+
batchNumber++;
208+
}
209+
}
210+
return new DataProcessResult(dataCount, formattedDataCount, errors);
211+
}
212+
213+
private VariablesMap getVariablesMap(String questionnaireId, Mode mode, List<GenesisError> errors) throws GenesisException {
214+
VariablesMap variablesMap = metadataService.loadAndSaveIfNotExists(questionnaireId, questionnaireId, mode, fileUtils,
215+
errors).getVariables();
216+
if (variablesMap == null) {
217+
throw new GenesisException(400,
218+
"Error during metadata parsing for mode %s :%n%s"
219+
.formatted(mode, errors.getLast().getMessage())
220+
);
221+
}
222+
return variablesMap;
223+
}
224+
225+
private List<SurveyUnitModel> getConvertedSurveyUnits(String questionnaireId, Mode mode, List<String> interrogationIdListForMode, int maxIndex, VariablesMap variablesMap) {
226+
List<String> interrogationIdToProcess = interrogationIdListForMode.subList(0, maxIndex);
227+
List<LunaticJsonRawDataModel> rawData = getRawData(questionnaireId, mode, interrogationIdToProcess);
228+
return convertRawData(
229+
rawData,
230+
variablesMap
231+
);
160232
}
161233

162234
private void sendProcessedIdsToQualityTool(List<SurveyUnitModel> surveyUnitModels) {

0 commit comments

Comments
 (0)