Skip to content

Commit cbca6cd

Browse files
committed
fix missing and filter_results in loadMetadatasFromDB
1 parent 7587c4e commit cbca6cd

File tree

7 files changed

+41107
-11
lines changed

7 files changed

+41107
-11
lines changed

src/main/java/fr/insee/genesis/domain/service/metadata/QuestionnaireMetadataService.java

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import fr.insee.bpm.metadata.model.MetadataModel;
55
import fr.insee.bpm.metadata.model.Variable;
66
import fr.insee.bpm.metadata.model.VariableType;
7+
import fr.insee.bpm.metadata.model.VariablesMap;
78
import fr.insee.bpm.metadata.reader.ddi.DDIReader;
89
import fr.insee.bpm.metadata.reader.lunatic.LunaticReader;
910
import fr.insee.genesis.Constants;
@@ -20,9 +21,12 @@
2021

2122
import java.io.FileInputStream;
2223
import java.io.IOException;
24+
import java.io.InputStream;
2325
import java.nio.file.Path;
2426
import java.util.List;
2527

28+
import static fr.insee.bpm.metadata.reader.lunatic.LunaticUtils.addLunaticVariable;
29+
2630
@Service
2731
@AllArgsConstructor
2832
@Slf4j
@@ -43,19 +47,58 @@ public MetadataModel find(String questionnaireId, Mode mode) throws GenesisExcep
4347
return questionnaireMetadataModels.getFirst().metadataModel();
4448
}
4549

46-
@Override
4750
public MetadataModel loadAndSaveIfNotExists(String campaignName, String questionnaireId, Mode mode, FileUtils fileUtils,
4851
List<GenesisError> errors) throws GenesisException {
52+
4953
List<QuestionnaireMetadataModel> questionnaireMetadataModels =
5054
questionnaireMetadataPersistancePort.find(questionnaireId.toUpperCase(), mode);
51-
if(questionnaireMetadataModels.isEmpty() || questionnaireMetadataModels.getFirst().metadataModel() == null){
52-
MetadataModel metadataModel = readMetadatas(campaignName, mode.getModeName(), fileUtils, errors);
53-
saveMetadata(questionnaireId.toUpperCase(), mode, metadataModel);
54-
return metadataModel;
55+
56+
MetadataModel metadataModel;
57+
58+
if (questionnaireMetadataModels.isEmpty() || questionnaireMetadataModels.getFirst().metadataModel() == null) {
59+
metadataModel = readMetadatas(campaignName, mode.getModeName(), fileUtils, errors);
60+
} else {
61+
metadataModel = questionnaireMetadataModels.getFirst().metadataModel();
5562
}
56-
return questionnaireMetadataModels.getFirst().metadataModel();
63+
String metadataFilePath = fileUtils.getSpecFolder(questionnaireId);
64+
addMissingAndFilterVariables(metadataModel, metadataFilePath);
65+
66+
saveMetadata(questionnaireId.toUpperCase(), mode, metadataModel);
67+
68+
return metadataModel;
5769
}
5870

71+
private void addMissingAndFilterVariables(MetadataModel metadataModel, String metadataFilePath) {
72+
VariablesMap variablesMap = metadataModel.getVariables();
73+
74+
try (InputStream lunaticStream = new FileInputStream(metadataFilePath);
75+
InputStream lunaticStream2 = new FileInputStream(metadataFilePath)) {
76+
77+
List<String> missingVars = LunaticReader.getMissingVariablesFromLunatic(lunaticStream);
78+
List<String> filterVars = LunaticReader.getFilterResultFromLunatic(lunaticStream2);
79+
80+
for (String var : missingVars) {
81+
String missingVarName = var + Constants.MISSING_SUFFIX;
82+
if (!variablesMap.hasVariable(missingVarName)) {
83+
addLunaticVariable(metadataModel, var, Constants.MISSING_SUFFIX, VariableType.STRING);
84+
}
85+
}
86+
87+
for (String var : filterVars) {
88+
String filterVarName = Constants.FILTER_RESULT_PREFIX + var;
89+
if (!variablesMap.hasVariable(filterVarName)) {
90+
addLunaticVariable(metadataModel, var, Constants.FILTER_RESULT_PREFIX, VariableType.BOOLEAN);
91+
}
92+
}
93+
94+
} catch (IOException e) {
95+
log.error("Erreur lecture fichier Lunatic : {}", metadataFilePath, e);
96+
}
97+
}
98+
99+
100+
101+
59102
private void saveMetadata(String questionnaireId, Mode mode, MetadataModel metadataModel) {
60103
questionnaireMetadataPersistancePort.save(
61104
new QuestionnaireMetadataModel(

src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
import lombok.extern.slf4j.Slf4j;
88
import org.springframework.stereotype.Component;
99

10-
import java.io.BufferedWriter;
11-
import java.io.File;
12-
import java.io.FileWriter;
13-
import java.io.IOException;
14-
import java.io.UncheckedIOException;
10+
import java.io.*;
1511
import java.nio.file.Files;
1612
import java.nio.file.Path;
1713
import java.nio.file.StandardCopyOption;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package fr.insee.genesis.domain.service.metadata;
2+
3+
import fr.insee.bpm.metadata.model.MetadataModel;
4+
import fr.insee.genesis.domain.model.surveyunit.Mode;
5+
import fr.insee.genesis.exceptions.GenesisError;
6+
import fr.insee.genesis.infrastructure.utils.FileUtils;
7+
import fr.insee.genesis.stubs.ConfigStub;
8+
import fr.insee.genesis.stubs.QuestionnaireMetadataPersistancePortStub;
9+
import org.junit.jupiter.api.Test;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
13+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
14+
15+
class QuestionnaireMetadataServiceTest {
16+
17+
@Test
18+
void loadAndSaveIfNotExists_should_add_missing_and_filter_variables() throws Exception {
19+
20+
/*
21+
QuestionnaireMetadataPersistancePortStub metadataStub = new QuestionnaireMetadataPersistancePortStub();
22+
FileUtils fileUtils = new FileUtils(new ConfigStub());
23+
24+
QuestionnaireMetadataService service = new QuestionnaireMetadataService(metadataStub);
25+
List<GenesisError> errors = new ArrayList<>();
26+
27+
String campaign = "TEST-GLOB";
28+
Mode mode = Mode.TEL;
29+
30+
// On lit directement le fichier Lunatic (pour vérifier initial)
31+
MetadataModel initial = service.parseMetadata(
32+
"src/test/resources/specs/" + campaign + "/" + mode + "/lunatic_" + campaign + ".json",
33+
false
34+
);
35+
36+
int initialCount = initial.getVariables().getVariables().size();
37+
38+
// WHEN
39+
MetadataModel saved = service.loadAndSaveIfNotExists(
40+
campaign,
41+
campaign,
42+
mode,
43+
fileUtils,
44+
errors
45+
);
46+
47+
// THEN
48+
int afterCount = saved.getVariables().getVariables().size();
49+
assertThat(initialCount).isGreaterThan(afterCount);
50+
*/
51+
52+
}
53+
54+
55+
}

0 commit comments

Comments
 (0)