Skip to content

Commit 37c268c

Browse files
Merge pull request #173 from InseeFr/hotFixMissing
Hot fix missing and filter_result
2 parents e6e34fb + b233ef2 commit 37c268c

File tree

7 files changed

+188
-181
lines changed

7 files changed

+188
-181
lines changed

src/main/java/fr/insee/genesis/controller/adapter/LunaticXmlAdapter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import fr.insee.genesis.controller.sources.xml.LunaticXmlSurveyUnit;
77
import fr.insee.genesis.controller.sources.xml.ValueType;
88
import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel;
9-
import fr.insee.genesis.domain.utils.LoopIdentifier;
9+
import fr.insee.genesis.domain.utils.GroupUtils;
1010
import fr.insee.genesis.domain.model.surveyunit.DataState;
1111
import fr.insee.genesis.domain.model.surveyunit.Mode;
1212
import fr.insee.genesis.domain.model.surveyunit.VariableModel;
@@ -123,8 +123,8 @@ private static SurveyUnitModel getCollectedDataFromSurveyUnit(LunaticXmlSurveyUn
123123
variableModels.add(VariableModel.builder()
124124
.varId(lunaticXmlCollectedData.getVariableName())
125125
.value(valueTypeList.get(i-1).getValue())
126-
.scope(LoopIdentifier.getLoopIdentifier(lunaticXmlCollectedData.getVariableName(), variablesMap))
127-
.parentId(LoopIdentifier.getRelatedVariableName(lunaticXmlCollectedData.getVariableName(), variablesMap))
126+
.scope(GroupUtils.getGroupName(lunaticXmlCollectedData.getVariableName(), variablesMap))
127+
.parentId(GroupUtils.getParentGroupName(lunaticXmlCollectedData.getVariableName(), variablesMap))
128128
.iteration(i)
129129
.build());
130130
dataCount++;
@@ -160,9 +160,9 @@ private static void getExternalDataFromSurveyUnit(LunaticXmlSurveyUnit su, Surve
160160
variableModels.add(VariableModel.builder()
161161
.varId(lunaticXmlExternalData.getVariableName())
162162
.value(valueTypeList.get(i-1).getValue())
163-
.scope(LoopIdentifier.getLoopIdentifier(lunaticXmlExternalData.getVariableName(), variablesMap))
163+
.scope(GroupUtils.getGroupName(lunaticXmlExternalData.getVariableName(), variablesMap))
164164
.iteration(i)
165-
.parentId(LoopIdentifier.getRelatedVariableName(lunaticXmlExternalData.getVariableName(), variablesMap))
165+
.parentId(GroupUtils.getParentGroupName(lunaticXmlExternalData.getVariableName(), variablesMap))
166166
.build());
167167
}
168168
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import fr.insee.genesis.domain.model.surveyunit.VariableModel;
1717
import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort;
1818
import fr.insee.genesis.domain.ports.spi.SurveyUnitPersistencePort;
19-
import fr.insee.genesis.domain.utils.LoopIdentifier;
19+
import fr.insee.genesis.domain.utils.GroupUtils;
2020
import fr.insee.genesis.exceptions.GenesisException;
2121
import org.springframework.beans.factory.annotation.Autowired;
2222
import org.springframework.beans.factory.annotation.Qualifier;
@@ -280,7 +280,7 @@ public List<SurveyUnitModel> parseEditedVariables(
280280
VariableModel collectedVariable = VariableModel.builder()
281281
.varId(editedVariableDto.getVariableName())
282282
.value(editedVariableDto.getVariableStateInputDto().getValue())
283-
.parentId(LoopIdentifier.getRelatedVariableName(editedVariableDto.getVariableName(), variablesMap))
283+
.parentId(GroupUtils.getParentGroupName(editedVariableDto.getVariableName(), variablesMap))
284284
.scope(variablesMap.getVariable(editedVariableDto.getVariableName()).getGroupName())
285285
.iteration(editedVariableDto.getIteration())
286286
.build();
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package fr.insee.genesis.domain.utils;
2+
3+
import fr.insee.genesis.Constants;
4+
import fr.insee.bpm.metadata.model.Variable;
5+
import fr.insee.bpm.metadata.model.VariablesMap;
6+
import lombok.extern.slf4j.Slf4j;
7+
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
@Slf4j
12+
public class GroupUtils {
13+
14+
private GroupUtils() {
15+
throw new IllegalStateException("Utility class");
16+
}
17+
18+
public static String getGroupName(String variableName, VariablesMap variablesMap){
19+
List<String> varsEno = Arrays.asList(Constants.getEnoVariables());
20+
Variable variable = variablesMap.getVariable(variableName);
21+
// If we don't find the variable, but it's A FILTER_RESULT or _MISSING variable
22+
// Then we look for the variable from which it derives
23+
if (variable == null) {
24+
// Variables added by Eno and identified in the constants list have ROOT_GROUP_NAME scope
25+
if(varsEno.contains(variableName))
26+
{
27+
return Constants.ROOT_GROUP_NAME;
28+
}
29+
String relatedVariable = getRelatedVariableName(variableName,variablesMap);
30+
if (relatedVariable==null){
31+
// If we don't find a related variable, we assign variable to ROOT_GROUP_NAME
32+
log.debug("Variable {} not found in variablesMap and assigned in root group", variableName);
33+
return Constants.ROOT_GROUP_NAME;
34+
}
35+
return variablesMap.getVariable(relatedVariable).getGroupName();
36+
}
37+
// If the variable was in we return directly the group name
38+
return variable.getGroup().getName();
39+
}
40+
41+
public static String getParentGroupName(String variableName, VariablesMap variablesMap){
42+
List<String> varsEno = Arrays.asList(Constants.getEnoVariables());
43+
Variable variable = variablesMap.getVariable(variableName);
44+
// If we don't find the variable, but it's A FILTER_RESULT or _MISSING variable
45+
// Then we look for the variable from which it derives
46+
if (variable == null) {
47+
// Variables added by Eno and identified in the constants list have ROOT_GROUP_NAME scope
48+
if(varsEno.contains(variableName))
49+
{
50+
return null;
51+
}
52+
String relatedVariableName = getRelatedVariableName(variableName,variablesMap);
53+
if (relatedVariableName==null){
54+
// If we don't find a related variable, we assign variable to ROOT_GROUP_NAME
55+
// so parent group is empty
56+
log.debug("Variable {} not found in variablesMap and assigned in root group, parent group name is empty", variableName);
57+
return null;
58+
}
59+
Variable relatedVariable = variablesMap.getVariable(relatedVariableName);
60+
return relatedVariable.getGroup().isRoot() ? null : relatedVariable.getGroup().getParentName();
61+
}
62+
// If the variable was in metadata, we return directly the parent group name
63+
return variable.getGroup().isRoot() ? null : variable.getGroup().getParentName();
64+
}
65+
66+
private static String getRelatedVariableName(String variableName, VariablesMap variablesMap) {
67+
Variable variable = variablesMap.getVariable(variableName);
68+
if ( variable == null ) {
69+
if(variablesMap.hasVariable(removePrefixOrSuffix(variableName, Constants.FILTER_RESULT_PREFIX)))
70+
{
71+
return removePrefixOrSuffix(variableName, Constants.FILTER_RESULT_PREFIX);
72+
}
73+
if(variablesMap.hasVariable(removePrefixOrSuffix(variableName, Constants.MISSING_SUFFIX))
74+
){
75+
return removePrefixOrSuffix(variableName, Constants.MISSING_SUFFIX);
76+
}
77+
return null;
78+
}
79+
if (variable.getGroup().isRoot()) {
80+
return null;
81+
}
82+
return variable.getGroup().getParentName();
83+
}
84+
85+
private static String removePrefixOrSuffix(String variableName, String pattern) {
86+
if (variableName.startsWith(pattern)){
87+
return variableName.replace(pattern, "");
88+
}
89+
if (variableName.endsWith(pattern)){
90+
return variableName.replace(pattern, "");
91+
}
92+
return variableName;
93+
}
94+
95+
}

src/main/java/fr/insee/genesis/domain/utils/LoopIdentifier.java

Lines changed: 0 additions & 67 deletions
This file was deleted.

src/test/java/fr/insee/genesis/controller/adapter/LunaticXmlAdapterTest.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ void setUp() {
157157
lunaticXmlSurveyUnit6.setQuestionnaireModelId("questionnaireId1");
158158
lunaticXmlSurveyUnit6.setData(lunaticXmlData);
159159

160-
//SurveyUnit 7 : COLLECTED only, has one unknown variable with known variable prefix
160+
//SurveyUnit 7 : COLLECTED only, has two unknown variables with known variable prefix or suffix
161161
lunaticXmlData = new LunaticXmlData();
162162

163163
lunaticXmlCollectedData = new LunaticXmlCollectedData();
@@ -168,7 +168,11 @@ void setUp() {
168168
lunaticXmlCollectedData2.setVariableName("var1_MISSING");
169169
lunaticXmlCollectedData2.setCollected(List.of(new ValueType("1", "string"), new ValueType("2", "string")));
170170

171-
collected = List.of(lunaticXmlCollectedData, lunaticXmlCollectedData2);
171+
LunaticXmlCollectedData lunaticXmlCollectedData3 = new LunaticXmlCollectedData();
172+
lunaticXmlCollectedData3.setVariableName("FILTER_RESULT_var1");
173+
lunaticXmlCollectedData3.setCollected(List.of(new ValueType("1", "string"), new ValueType("1", "string")));
174+
175+
collected = List.of(lunaticXmlCollectedData, lunaticXmlCollectedData2, lunaticXmlCollectedData3);
172176
lunaticXmlData.setCollected(collected);
173177

174178
lunaticXmlData.setExternal(external);
@@ -340,20 +344,23 @@ void test09() {
340344
}
341345

342346
@Test
343-
@DisplayName("If a variable A not present in DDI and is the extension of a known variable B, then the variable A has B as related and is in the same group")
347+
@DisplayName("If a variable A not present in DDI and is the extension of a known variable B, then the variable A is in the same group")
344348
void test10() {
345349
// When
346350
List<SurveyUnitModel> surveyUnitModels = LunaticXmlAdapter.convert(lunaticXmlSurveyUnit7, metadataModel.getVariables(), CAMPAIGN_ID, Mode.WEB);
347351

348352
// Then
349353
Assertions.assertThat(surveyUnitModels).hasSize(1);
350-
351354
Assertions.assertThat(surveyUnitModels.getFirst().getCollectedVariables()).filteredOn(collectedVariableModel ->
352-
collectedVariableModel.varId().equals("var1_MISSING")).isNotEmpty();
355+
collectedVariableModel.varId().equals("var1_MISSING")).hasSize(2);
353356
Assertions.assertThat(surveyUnitModels.getFirst().getCollectedVariables().stream().filter(collectedVariableModel ->
354-
collectedVariableModel.varId().equals("var1_MISSING")).toList().getFirst().parentId()).isNotNull().isEqualTo("var1");
357+
collectedVariableModel.varId().equals("var1_MISSING")).toList().getFirst().parentId()).isNotNull().isEqualTo(Constants.ROOT_GROUP_NAME);
355358
Assertions.assertThat(surveyUnitModels.getFirst().getCollectedVariables().stream().filter(collectedVariableModel ->
356359
collectedVariableModel.varId().equals("var1_MISSING")).toList().getFirst().scope()).isNotEqualTo(Constants.ROOT_GROUP_NAME).isEqualTo(LOOP_NAME);
360+
Assertions.assertThat(surveyUnitModels.getFirst().getCollectedVariables().stream().filter(collectedVariableModel ->
361+
collectedVariableModel.varId().equals("FILTER_RESULT_var1")).toList().getFirst().parentId()).isNotNull().isEqualTo(Constants.ROOT_GROUP_NAME);
362+
Assertions.assertThat(surveyUnitModels.getFirst().getCollectedVariables().stream().filter(collectedVariableModel ->
363+
collectedVariableModel.varId().equals("FILTER_RESULT_var1")).toList().getFirst().scope()).isNotEqualTo(Constants.ROOT_GROUP_NAME).isEqualTo(LOOP_NAME);
357364
}
358365

359366
@Test
@@ -395,4 +402,5 @@ void test12(){
395402
Assertions.assertThat(surveyUnitModels.getFirst().getExternalVariables().getFirst().iteration()).isEqualTo(1);
396403
Assertions.assertThat(surveyUnitModels.getFirst().getExternalVariables().getFirst().parentId()).isEqualTo(Constants.ROOT_GROUP_NAME);
397404
}
405+
398406
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package fr.insee.genesis.controller.utils;
2+
3+
import fr.insee.genesis.Constants;
4+
import fr.insee.bpm.metadata.model.Group;
5+
import fr.insee.bpm.metadata.model.MetadataModel;
6+
import fr.insee.bpm.metadata.model.Variable;
7+
import fr.insee.bpm.metadata.model.VariableType;
8+
import fr.insee.genesis.domain.utils.GroupUtils;
9+
import org.assertj.core.api.Assertions;
10+
import org.junit.jupiter.api.BeforeEach;
11+
import org.junit.jupiter.api.DisplayName;
12+
import org.junit.jupiter.api.Test;
13+
14+
class GroupUtilsTest {
15+
16+
MetadataModel metadataModel;
17+
18+
private static final String LOOP_NAME = "BOUCLE_TEST";
19+
20+
@BeforeEach
21+
void setUp() {
22+
// Given
23+
this.metadataModel = new MetadataModel();
24+
Group group = new Group(LOOP_NAME, Constants.ROOT_GROUP_NAME);
25+
Variable var1 = new Variable("var1", group, VariableType.STRING, "1");
26+
Variable var2 = new Variable("var2", metadataModel.getRootGroup(), VariableType.STRING, "1");
27+
metadataModel.getVariables().putVariable(var1);
28+
metadataModel.getVariables().putVariable(var2);
29+
}
30+
31+
@Test
32+
@DisplayName("Should return <LOOP_NAME>")
33+
void test01() {
34+
//When + Then
35+
Assertions.assertThat(GroupUtils.getGroupName("var1", metadataModel.getVariables())).isEqualTo(LOOP_NAME);
36+
}
37+
38+
@Test
39+
@DisplayName("Should return the root group name")
40+
void test02() {
41+
//When + Then
42+
Assertions.assertThat(GroupUtils.getGroupName("var2", metadataModel.getVariables())).isEqualTo(Constants.ROOT_GROUP_NAME);
43+
}
44+
45+
@Test
46+
@DisplayName("Should return the root group name if the variable is not present in the variables map")
47+
void test03(){
48+
//When + Then
49+
Assertions.assertThat(GroupUtils.getGroupName("var3", metadataModel.getVariables())).isEqualTo(Constants.ROOT_GROUP_NAME);
50+
}
51+
52+
@Test
53+
@DisplayName("Should return var1 group if missing suffix")
54+
void test04(){
55+
//When + Then
56+
Assertions.assertThat(GroupUtils.getGroupName("var1_MISSING", metadataModel.getVariables())).isEqualTo(LOOP_NAME);
57+
}
58+
59+
@Test
60+
@DisplayName("Should return var1 group if filter result prefix")
61+
void test05(){
62+
//When + Then
63+
Assertions.assertThat(GroupUtils.getGroupName("FILTER_RESULT_var1", metadataModel.getVariables())).isEqualTo(LOOP_NAME);
64+
}
65+
66+
@Test
67+
@DisplayName("Parent group name of var1 should be root group name")
68+
void test06(){
69+
Assertions.assertThat(GroupUtils.getParentGroupName("var1",metadataModel.getVariables())).isEqualTo(Constants.ROOT_GROUP_NAME);
70+
}
71+
72+
}

0 commit comments

Comments
 (0)