Skip to content

Commit fa807eb

Browse files
Merge pull request #99 from InseeFr/addLinkVariables
Add link variables
2 parents 089adc2 + fde5da0 commit fa807eb

File tree

6 files changed

+60969
-17
lines changed

6 files changed

+60969
-17
lines changed

src/main/java/fr/insee/bpm/metadata/reader/ReaderUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public static MetadataModel getMetadataFromDDIAndLunatic(
7272

7373
if (metadataModel != null && lunaticInputStream != null) {
7474
ReaderUtils.addMissingAndFilterVariables(metadataModel, lunaticInputStream);
75+
LunaticReader.addLinkVariablesFromLunatic(metadataModel,metadataModel.getGroup(Constants.BOUCLE_PRENOMS));
7576
}
7677

7778
return metadataModel;

src/main/java/fr/insee/bpm/metadata/reader/lunatic/LunaticReader.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22

33
import com.fasterxml.jackson.databind.JsonNode;
44
import fr.insee.bpm.metadata.Constants;
5-
import fr.insee.bpm.metadata.model.*;
5+
import fr.insee.bpm.metadata.model.CalculatedVariables;
6+
import fr.insee.bpm.metadata.model.Group;
7+
import fr.insee.bpm.metadata.model.MetadataModel;
8+
import fr.insee.bpm.metadata.model.SpecType;
9+
import fr.insee.bpm.metadata.model.Variable;
10+
import fr.insee.bpm.metadata.model.VariableType;
611
import fr.insee.bpm.metadata.reader.ReaderUtils;
712
import fr.insee.bpm.metadata.reader.lunatic.processor.ComponentProcessor;
813
import fr.insee.bpm.metadata.reader.lunatic.processor.ComponentProcessorFactory;
@@ -15,7 +20,10 @@
1520
import java.util.Arrays;
1621
import java.util.List;
1722

18-
import static fr.insee.bpm.metadata.Constants.*;
23+
import static fr.insee.bpm.metadata.Constants.COMPONENTS;
24+
import static fr.insee.bpm.metadata.Constants.COMPONENT_TYPE;
25+
import static fr.insee.bpm.metadata.Constants.FILTER_RESULT_PREFIX;
26+
import static fr.insee.bpm.metadata.Constants.VALUE;
1927

2028
@Log4j2
2129
public class LunaticReader {
@@ -25,6 +33,8 @@ public class LunaticReader {
2533
private static final String MISSING_RESPONSE = "missingResponse";
2634
private static final String LUNATIC_MODEL_VERSION= "lunaticModelVersion";
2735
private static final String EXCEPTION_MESSAGE = "Unable to read Lunatic questionnaire file: {}";
36+
private static final String INDIVIDUAL_LOOP = "PRENOM";
37+
2838

2939
private LunaticReader() {
3040
throw new IllegalStateException("Utility class");
@@ -163,6 +173,11 @@ public static MetadataModel getMetadataFromLunatic(InputStream lunaticFile) {
163173
// We add the remaining (not identified in any loops nor root) variables to the root group
164174
variables.forEach(
165175
varName -> metadataModel.getVariables().putVariable(new Variable(varName, rootGroup, VariableType.STRING)));
176+
String groupContainingIndividuals = metadataModel.getGroupNames().stream()
177+
.filter(g -> g.contains(INDIVIDUAL_LOOP))
178+
.findFirst()
179+
.orElse(metadataModel.getGroupNames().getFirst());
180+
LunaticReader.addLinkVariablesFromLunatic(metadataModel,metadataModel.getGroup(groupContainingIndividuals));
166181
return metadataModel;
167182
} catch (IOException e) {
168183
log.error(EXCEPTION_MESSAGE, lunaticFile);
@@ -308,4 +323,21 @@ public static String getQuestionnaireModelId(InputStream lunaticFile) {
308323
}
309324
}
310325

326+
/**
327+
* Adds pairwise link variables (LIEN1, LIEN2, ...) to the metadata model
328+
* based on Lunatic metadata.
329+
* Intended for use in the BPM layer before data persistence.
330+
*/
331+
public static void addLinkVariablesFromLunatic(MetadataModel metadataModel, Group targetGroup) {
332+
if (metadataModel.getVariables().getVariable(Constants.LIENS) != null) {
333+
334+
for (int k = 1; k < Constants.MAX_LINKS_ALLOWED; k++) {
335+
metadataModel.getVariables().putVariable(
336+
new Variable(Constants.LIEN + k, targetGroup, VariableType.INTEGER)
337+
);
338+
}
339+
}
340+
}
341+
342+
311343
}

src/test/java/fr/insee/bpm/metadata/reader/ReaderUtilsTest.java

Lines changed: 73 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package fr.insee.bpm.metadata.reader;
22

3+
import fr.insee.bpm.TestConstants;
4+
import fr.insee.bpm.metadata.Constants;
35
import fr.insee.bpm.metadata.model.Group;
46
import fr.insee.bpm.metadata.model.MetadataModel;
57
import fr.insee.bpm.metadata.model.VariablesMap;
@@ -9,18 +11,21 @@
911
import java.io.InputStream;
1012
import java.nio.file.Path;
1113

12-
import static org.junit.jupiter.api.Assertions.*;
14+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
1315

1416
class ReaderUtilsTest {
17+
static final Path lunaticSamplesPath = Path.of(TestConstants.UNIT_TESTS_DIRECTORY, "lunatic");
18+
static final Path ddiSamplesPath = Path.of(TestConstants.UNIT_TESTS_DIRECTORY, "ddi");
19+
1520

1621
@Test
1722
void getMetadataFromDDIAndLunatic_should_add_filter_variables_for_web() throws Exception {
1823
// GIVEN
1924
InputStream ddiStream = new FileInputStream(
20-
Path.of("src/test/resources/unit_tests/ddi/ddi-log-2021-x21-web.xml").toFile()
25+
ddiSamplesPath.resolve("ddi-log-2021-x21-web.xml").toFile()
2126
);
2227
InputStream lunaticStream = new FileInputStream(
23-
Path.of("src/test/resources/unit_tests/lunatic/log2021x21_web.json").toFile());
28+
lunaticSamplesPath.resolve("log2021x21_web.json").toFile());
2429

2530
// WHEN
2631
MetadataModel metadataModel = ReaderUtils.getMetadataFromDDIAndLunatic(
@@ -32,25 +37,27 @@ void getMetadataFromDDIAndLunatic_should_add_filter_variables_for_web() throws E
3237
// THEN
3338
VariablesMap vars = metadataModel.getVariables();
3439

35-
assertTrue(vars.hasVariable("CADR"));
36-
assertTrue(vars.hasVariable("FILTER_RESULT_CADR"));
40+
assertThat(vars.hasVariable("CADR")).isTrue();
41+
assertThat(vars.hasVariable("FILTER_RESULT_CADR")).isTrue();
3742

3843
Group cadrGroup = vars.getVariable("CADR").getGroup();
3944
Group filterGroup = vars.getVariable("FILTER_RESULT_CADR").getGroup();
4045

4146

42-
// Assert que FILTER_RESULT_CADR n'a pas été envoyé dans RACINE
43-
assertEquals(cadrGroup, filterGroup, "FILTER_RESULT_CADR should be at the same group as CADR");
47+
// Assert that FILTER_RESULT_CADR n'a pas été envoyé dans RACINE
48+
assertThat(filterGroup)
49+
.as("FILTER_RESULT_CADR should be at the same group as CADR")
50+
.isEqualTo(cadrGroup);
4451
}
4552

4653

4754
@Test
4855
void getMetadataFromDDIAndLunatic_should_add_missing_variables_for_tel() throws Exception {
4956
InputStream ddiStream = new FileInputStream(
50-
Path.of("src/test/resources/unit_tests/ddi/ddi-log-2021-x21-web.xml").toFile()
57+
ddiSamplesPath.resolve("ddi-log-2021-x21-web.xml").toFile()
5158
);
5259
InputStream lunaticStream = new FileInputStream(
53-
Path.of("src/test/resources/unit_tests/lunatic/log2021x21_tel.json").toFile());
60+
lunaticSamplesPath.resolve("log2021x21_tel.json").toFile());
5461

5562
MetadataModel metadataModel = ReaderUtils.getMetadataFromDDIAndLunatic(
5663
"file://ddi-log-2021-x21-web.xml",
@@ -59,15 +66,15 @@ void getMetadataFromDDIAndLunatic_should_add_missing_variables_for_tel() throws
5966
);
6067

6168
VariablesMap vars = metadataModel.getVariables();
62-
assertTrue(vars.hasVariable("CADR"));
63-
assertTrue(vars.hasVariable("CADR_MISSING"));
69+
assertThat(vars.hasVariable("CADR")).isTrue();
70+
assertThat(vars.hasVariable("CADR_MISSING")).isTrue();
6471
}
6572

6673
@Test
6774
void getMetadataFromDDIAndLunatic_noLunaticFile_should_returnDDIVariablesOnly() throws Exception {
6875
// GIVEN
6976
InputStream ddiStream = new FileInputStream(
70-
Path.of("src/test/resources/unit_tests/ddi/ddi-log-2021-x21-web.xml").toFile()
77+
ddiSamplesPath.resolve("ddi-log-2021-x21-web.xml").toFile()
7178
);
7279

7380
// WHEN
@@ -80,9 +87,60 @@ void getMetadataFromDDIAndLunatic_noLunaticFile_should_returnDDIVariablesOnly()
8087
// THEN
8188
VariablesMap vars = metadataModel.getVariables();
8289

83-
assertTrue(vars.hasVariable("CADR"));
84-
assertFalse(vars.hasVariable("CADR_MISSING"));
85-
assertFalse(vars.hasVariable("FILTER_RESULT_CADR"));
90+
assertThat(vars.hasVariable("CADR")).isTrue();
91+
assertThat(vars.hasVariable("CADR_MISSING")).isFalse();
92+
assertThat(vars.hasVariable("FILTER_RESULT_CADR")).isFalse();
93+
}
94+
95+
@Test
96+
void getMetadataFromDDIAndLunatic_should_add_link_variables() throws Exception {
97+
// GIVEN
98+
InputStream ddiStream = new FileInputStream(
99+
ddiSamplesPath.resolve("ddi-SAMPLETEST-DATAONLY-v1.xml").toFile()
100+
);
101+
InputStream lunaticStream = new FileInputStream(
102+
lunaticSamplesPath.resolve("lunaticSAMPLETEST-DATAONLY-v1.json").toFile()
103+
);
104+
105+
// WHEN
106+
MetadataModel metadataModel = ReaderUtils.getMetadataFromDDIAndLunatic(
107+
"file://ddi-SAMPLETEST-DATAONLY-v1.xml",
108+
ddiStream,
109+
lunaticStream
110+
);
111+
112+
// THEN
113+
VariablesMap vars = metadataModel.getVariables();
114+
115+
// Precondition: LIENS variable must exist
116+
assertThat(vars.hasVariable(Constants.LIENS)).isTrue();
117+
118+
// Expected behavior: link variables (LIENx) must be added
119+
for (int i = 1; i < Constants.MAX_LINKS_ALLOWED; i++) {
120+
assertThat(vars.hasVariable(Constants.LIEN + i))
121+
.as("Missing variable: %s", Constants.LIEN + i)
122+
.isTrue();
123+
}
124+
125+
}
126+
127+
128+
@Test
129+
void getMetadataFromDDIAndLunatic_noLunaticFile_should_not_add_link_variables() throws Exception {
130+
InputStream ddiStream = new FileInputStream(
131+
ddiSamplesPath.resolve("ddi-log-2021-x21-web.xml").toFile()
132+
);
133+
134+
MetadataModel metadataModel = ReaderUtils.getMetadataFromDDIAndLunatic(
135+
"file://ddi-log-2021-x21-web.xml",
136+
ddiStream,
137+
null
138+
);
139+
140+
VariablesMap vars = metadataModel.getVariables();
141+
142+
assertThat(vars.hasVariable(Constants.LIENS)).isFalse();
143+
assertThat(vars.hasVariable(Constants.LIEN + "1")).isFalse();
86144
}
87145

88146

src/test/java/fr/insee/bpm/metadata/reader/lunatic/LunaticReaderTest.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package fr.insee.bpm.metadata.reader.lunatic;
22

33
import fr.insee.bpm.TestConstants;
4+
import fr.insee.bpm.metadata.Constants;
45
import fr.insee.bpm.metadata.model.CalculatedVariables;
56
import fr.insee.bpm.metadata.model.MetadataModel;
7+
import fr.insee.bpm.metadata.model.VariablesMap;
68
import org.junit.jupiter.api.Test;
79

810
import java.io.FileInputStream;
@@ -71,4 +73,63 @@ void readVariablesFromLogX21WebLunaticFile() throws FileNotFoundException {
7173

7274
}
7375

76+
@Test
77+
void getMetadataFromLunatic_should_add_missing_variables_for_tel() throws FileNotFoundException {
78+
// GIVEN
79+
MetadataModel metadataModel = LunaticReader.getMetadataFromLunatic(
80+
new FileInputStream(
81+
lunaticSamplesPath.resolve("log2021x21_tel.json").toFile())
82+
);
83+
84+
// THEN
85+
assertNotNull(metadataModel);
86+
87+
VariablesMap vars = metadataModel.getVariables();
88+
89+
assertTrue(vars.hasVariable("CADR_MISSING"));
90+
}
91+
92+
@Test
93+
void getMetadataFromLunatic_should_add_filter_variables_for_web() throws FileNotFoundException {
94+
// GIVEN
95+
MetadataModel metadataModel = LunaticReader.getMetadataFromLunatic(
96+
new FileInputStream(
97+
lunaticSamplesPath.resolve("log2021x21_web.json").toFile())
98+
);
99+
100+
// THEN
101+
assertNotNull(metadataModel);
102+
103+
VariablesMap vars = metadataModel.getVariables();
104+
assertTrue(vars.hasVariable("FILTER_RESULT_CADR"));
105+
}
106+
107+
108+
@Test
109+
void getMetadataFromLunatic_should_add_link_variables() throws FileNotFoundException {
110+
// GIVEN
111+
MetadataModel metadataModel = LunaticReader.getMetadataFromLunatic(
112+
new FileInputStream(
113+
lunaticSamplesPath.resolve("lunaticSAMPLETEST-DATAONLY-v1.json").toFile()
114+
)
115+
);
116+
117+
// THEN
118+
assertNotNull(metadataModel);
119+
120+
VariablesMap vars = metadataModel.getVariables();
121+
122+
// Precondition: LIENS variable must exist in Lunatic file
123+
assertTrue(vars.hasVariable(Constants.LIENS));
124+
125+
// Expected behavior: link variables (LIENx) must be added
126+
for (int i = 1; i < Constants.MAX_LINKS_ALLOWED; i++) {
127+
assertTrue(
128+
vars.hasVariable(Constants.LIEN + i),
129+
"Missing variable: " + Constants.LIEN + i
130+
);
131+
}
132+
}
133+
134+
74135
}

0 commit comments

Comments
 (0)