Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import fr.insee.eno.core.model.navigation.EnoArticulation;
import fr.insee.eno.core.model.navigation.StandaloneLoop;
import fr.insee.eno.core.model.question.*;
import fr.insee.eno.core.model.question.pairwise.PairwiseVariables;
import fr.insee.eno.core.model.question.table.CellLabel;
import fr.insee.eno.core.model.question.table.TableCell;
import fr.insee.eno.core.model.response.ArbitraryResponse;
Expand Down Expand Up @@ -86,6 +87,8 @@ public static Object instantiateFromEnoObject(Object enoObject) {
return instantiateFrom(multipleResponseQuestion);
if (enoObject instanceof TableCell)
return new BodyCell();
if (enoObject instanceof PairwiseVariables)
return new PairwiseLinks.SourceVariables();
if (enoObject instanceof Response)
return new ResponseType();
if (enoObject instanceof ArbitraryResponse)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
import fr.insee.ddi.lifecycle33.datacollection.QuestionItemType;
import fr.insee.eno.core.annotations.DDI;
import fr.insee.eno.core.annotations.Lunatic;
import fr.insee.eno.core.annotations.Pogues;
import fr.insee.eno.core.model.question.pairwise.PairwiseVariables;
import fr.insee.eno.core.model.response.Response;
import fr.insee.eno.core.parameter.Format;
import fr.insee.lunatic.model.flat.LabelType;
import fr.insee.lunatic.model.flat.LabelTypeEnum;
import fr.insee.lunatic.model.flat.PairwiseLinks;
import fr.insee.pogues.model.QuestionType;
import lombok.Getter;
import lombok.Setter;

Expand All @@ -20,6 +23,7 @@
* For now, this corresponds to a DDI QuestionItem object (could be QuestionGrid later on). */
@Getter
@Setter
@Context(format = Format.POGUES, type = QuestionType.class)
@Context(format = Format.DDI, type = QuestionItemType.class)
@Context(format = Format.LUNATIC, type = PairwiseLinks.class)
public class PairwiseQuestion extends SingleResponseQuestion {
Expand All @@ -36,6 +40,11 @@ public class PairwiseQuestion extends SingleResponseQuestion {
@Lunatic("T(fr.insee.eno.core.model.question.PairwiseQuestion).computeLunaticAxes(#this, #param)")
String loopVariableName;

/** Variables associated with the pairwise question. */
@Pogues("getSourceVariableReferences()")
@Lunatic("setSourceVariables(#param)")
PairwiseVariables pairwiseVariables;

/**
* The pairwise question object encapsulates a unique choice question.
* (During data collection, the collection is iterated several times to establish each link between individuals.)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package fr.insee.eno.core.model.question.pairwise;

import fr.insee.eno.core.annotations.Contexts.Context;
import fr.insee.eno.core.annotations.Lunatic;
import fr.insee.eno.core.annotations.Pogues;
import fr.insee.eno.core.model.EnoObject;
import fr.insee.eno.core.parameter.Format;
import fr.insee.lunatic.model.flat.PairwiseLinks;
import fr.insee.pogues.model.SourceVariableReferences;
import lombok.Getter;
import lombok.Setter;

/** Variables associated with the pairwise question. */
@Context(format = Format.POGUES, type = SourceVariableReferences.class)
@Context(format = Format.LUNATIC, type = PairwiseLinks.SourceVariables.class)
@Getter
@Setter
public class PairwiseVariables extends EnoObject {

@Pogues("#poguesIndex.get(#root.getName()).getName()")
@Lunatic("setName(#param)")
private String name;

@Pogues("#poguesIndex.get(#root.getGender()).getName()")
@Lunatic("setGender(#param)")
private String gender;

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package fr.insee.eno.core.mapping.out.lunatic;

import fr.insee.eno.core.DDIToEno;
import fr.insee.eno.core.PoguesDDIToLunatic;
import fr.insee.eno.core.exceptions.business.DDIParsingException;
import fr.insee.eno.core.exceptions.business.ParsingException;
import fr.insee.eno.core.mappers.LunaticMapper;
import fr.insee.eno.core.model.EnoQuestionnaire;
import fr.insee.eno.core.model.question.PairwiseQuestion;
import fr.insee.eno.core.parameter.EnoParameters;
import fr.insee.eno.core.parameter.EnoParameters.Context;
import fr.insee.eno.core.parameter.EnoParameters.ModeParameter;
import fr.insee.eno.core.parameter.Format;
import fr.insee.lunatic.model.flat.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
Expand All @@ -16,8 +19,7 @@
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;

class PairwiseQuestionTest {

Expand Down Expand Up @@ -79,4 +81,19 @@ void pairwiseMapping_integrationTest() throws DDIParsingException {
// Note: for now the symLinks property is added (hard-coded values) by Lunatic-Model
}

@Test
void pairwiseSourceVariables_integrationTest() throws ParsingException {
// Given + When
ClassLoader classLoader = this.getClass().getClassLoader();
Questionnaire lunaticQuestionnaire = PoguesDDIToLunatic.fromInputStreams(
classLoader.getResourceAsStream("integration/pogues/pogues-pairwise-variables.json"),
classLoader.getResourceAsStream("integration/ddi/ddi-pairwise-variables.xml"))
.transform(EnoParameters.of(Context.HOUSEHOLD, ModeParameter.CAWI, Format.LUNATIC));
// Then
PairwiseLinks lunaticPairwise = assertInstanceOf(PairwiseLinks.class,
((Question) lunaticQuestionnaire.getComponents().get(2)).getComponents().getFirst());
assertEquals("PRENOM", lunaticPairwise.getSourceVariables().getName());
Copy link
Copy Markdown
Contributor

@chloe-renaud chloe-renaud Jan 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You do not check gender too?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

was missing in my input questionnaire before I manually added it, then forgot.

Thanks I'll add it

assertEquals("SEXE", lunaticPairwise.getSourceVariables().getGender());
}

}
Loading