Skip to content

Commit

Permalink
(#23): reorg. interview model
Browse files Browse the repository at this point in the history
  • Loading branch information
andi-huber committed Apr 23, 2024
1 parent 646dcf9 commit ff92009
Show file tree
Hide file tree
Showing 15 changed files with 198 additions and 209 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.apache.causeway.applib.value.Clob;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.functional.Try;
import org.apache.causeway.commons.internal.collections._Multimaps;
import org.apache.causeway.commons.io.DataSource;
import org.apache.causeway.commons.io.JaxbUtils;

Expand Down Expand Up @@ -52,20 +53,28 @@ public InterviewSet24 parse(final Clob interviewSource) {
}

private InterviewSet24 createFromDto(final @NonNull _Dtos.Itv dto) {
var interviewsByRespondentStub = _Multimaps.<Respondent24, Interview24>newListMultimap();
dto.getInterviews().stream()
.forEach(interviewDto->
interviewsByRespondentStub
.putElement(interviewDto.stubRespondent24(), interviewDto.toInterview24()));

/* Interviews that belong to this survey. */
final Can<Interview24> interviews =
dto.getInterviews().stream()
.map(_Dtos.Interview::toInterview24)
.collect(Can.toCan());
final Can<Respondent24> respondents = interviewsByRespondentStub.entrySet()
.stream()
.map(entry->{
var respondentStub = entry.getKey();
var interviews = entry.getValue();
var respondent = new Respondent24(
respondentStub.alias(),
respondentStub.dateOfBirth(),
respondentStub.sex(),
Can.ofCollection(interviews));
interviews.forEach(iv->iv.parentRespondentRef().setValue(respondent));
return respondent;
})
.collect(Can.toCan());

/* Respondents collected from interviews. */
final Can<Respondent24> respondents =
interviews.stream()
.map(Interview24::respondent)
.collect(Can.toCan());

return InterviewSet24.of(respondents, interviews);
return InterviewSet24.of(respondents).normalized();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,13 +220,19 @@ private GraphKernel listEntriesAsTree() {
return tree;
}

Interview24 toInterview24() {

/**
* has no children
*/
Respondent24 stubRespondent24() {
final Respondent24 respondent = new Respondent24(
subjectName + "|" + subjectFirstName,
subjectBirthDate.toLocalDate(),
Sex.values()[subjectSex]);
Sex.values()[subjectSex],
Can.empty());
return respondent;
}

Interview24 toInterview24() {
final var tree = listEntriesAsTree();

var meals = tree.streamNeighbors(listEntries.size())
Expand Down Expand Up @@ -261,7 +267,6 @@ Interview24 toInterview24() {
.collect(Can.toCan());

return Interview24.of(
respondent,
interviewDate.toLocalDate(),
new RespondentMetaData24(
ObjectRef.<Interview24>empty(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ record Details(int respondentCount, int interviewCount) {
static Details of(final InterviewSet24 interviewSet) {
return new Details(
interviewSet.respondents().size(),
interviewSet.interviews().size());
interviewSet.interviewCount());
}
}
return adoc("Details", Details.of(interviewSet));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,8 @@ protected SurveyVM getViewModel(final Node24 node, final SurveyVM parentNode, fi
public static class SurveyTreeAdapter implements TreeAdapter<Node24> {
@Override public int childCountOf(final Node24 node) {
return switch (node) {
case InterviewSet24 interviewSet -> interviewSet.respondents().size()
+ interviewSet.interviews().size();
case Respondent24 respondent -> 0;
case InterviewSet24 interviewSet -> interviewSet.respondents().size();
case Respondent24 respondent -> respondent.interviews().size();
case Interview24 interview -> interview.meals().size();
case Meal24 meal -> meal.memorizedFood().size();
case MemorizedFood24 mem -> mem.records().size();
Expand All @@ -228,9 +227,8 @@ public static class SurveyTreeAdapter implements TreeAdapter<Node24> {
}
@Override public Stream<Node24> childrenOf(final Node24 node) {
return switch (node) {
case InterviewSet24 interviewSet -> Stream.concat(interviewSet.respondents().stream(),
interviewSet.interviews().stream());
case Respondent24 respondent -> Stream.empty();
case InterviewSet24 interviewSet -> interviewSet.respondents().stream().map(Node24.class::cast);
case Respondent24 respondent -> respondent.interviews().stream().map(Node24.class::cast);
case Interview24 interview -> interview.meals().stream().map(Node24.class::cast);
case Meal24 meal -> meal.memorizedFood().stream().map(Node24.class::cast);
case MemorizedFood24 mem -> mem.records().stream().map(Node24.class::cast);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,67 +2,63 @@ respondents:
- alias: "Svenson|Sven"
dateOfBirth: "1933-03-17"
gender: "FEMALE"
interviews:
- respondent:
alias: "Svenson|Sven"
dateOfBirth: "1933-03-17"
gender: "FEMALE"
interviewDate: "2021-05-02"
interviewOrdinalRef:
value: -1
respondentMetaData:
parentInterviewRef: "ObjectRef[Interview24]"
specialDietId: "99"
specialDayId: "00"
heightCM: 160
weightKG: 54.9
meals:
- parentInterviewRef: "ObjectRef[Interview24]"
hourOfDay: "07:00:00"
foodConsumptionOccasionId: "01"
foodConsumptionPlaceId: "01"
memorizedFood:
- parentMealRef: "ObjectRef[Meal24]"
name: "Kaffee"
records:
- parentMemorizedFoodRef: "ObjectRef[MemorizedFood24]"
type: "FOOD"
name: "Eieraufstrich"
facetSids: "0103,0200,0317,0405"
ingredients:
- parentRecordRef: "ObjectRef[Record24]"
sid: "01529"
name: "Mayonnaise"
facetSids: "0699,0400,1000,0801"
rawPerCookedRatio: 1.0
quantityCooked: "6.741572856903076[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "00916"
name: "Ei"
facetSids: "0107,0303"
rawPerCookedRatio: 1.0
quantityCooked: "16.853933334350586[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "01547"
name: "Schnittlauch"
facetSids: "0205,0499"
rawPerCookedRatio: 1.0
quantityCooked: "0.9363296031951904[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "00103"
name: "Knoblauch"
facetSids: "0205,0499,0999,1200,0399,2800"
rawPerCookedRatio: 1.0
quantityCooked: "0.3745318353176117[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "01571"
name: "Salz, Koch"
facetSids: ""
rawPerCookedRatio: 1.0
quantityCooked: "0.09363295882940292[g]"
- parentMemorizedFoodRef: "ObjectRef[MemorizedFood24]"
type: "FOOD"
name: "Kaffee, mit Koffein"
facetSids: "0699,0201,1200,0702"
ingredients: []
helperRef: "ObjectRef[Helper]"
interviews:
- parentRespondentRef: "ObjectRef[Respondent24]"
interviewDate: "2021-05-02"
interviewOrdinalRef:
value: 1
respondentMetaData:
parentInterviewRef: "ObjectRef[Interview24]"
specialDietId: "99"
specialDayId: "00"
heightCM: 160
weightKG: 54.9
meals:
- parentInterviewRef: "ObjectRef[Interview24]"
hourOfDay: "07:00:00"
foodConsumptionOccasionId: "01"
foodConsumptionPlaceId: "01"
memorizedFood:
- parentMealRef: "ObjectRef[Meal24]"
name: "Kaffee"
records:
- parentMemorizedFoodRef: "ObjectRef[MemorizedFood24]"
type: "FOOD"
name: "Eieraufstrich"
facetSids: "0103,0200,0317,0405"
ingredients:
- parentRecordRef: "ObjectRef[Record24]"
sid: "01529"
name: "Mayonnaise"
facetSids: "0699,0400,1000,0801"
rawPerCookedRatio: 1.0
quantityCooked: "6.741572856903076[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "00916"
name: "Ei"
facetSids: "0107,0303"
rawPerCookedRatio: 1.0
quantityCooked: "16.853933334350586[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "01547"
name: "Schnittlauch"
facetSids: "0205,0499"
rawPerCookedRatio: 1.0
quantityCooked: "0.9363296031951904[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "00103"
name: "Knoblauch"
facetSids: "0205,0499,0999,1200,0399,2800"
rawPerCookedRatio: 1.0
quantityCooked: "0.3745318353176117[g]"
- parentRecordRef: "ObjectRef[Record24]"
sid: "01571"
name: "Salz, Koch"
facetSids: ""
rawPerCookedRatio: 1.0
quantityCooked: "0.09363295882940292[g]"
- parentMemorizedFoodRef: "ObjectRef[MemorizedFood24]"
type: "FOOD"
name: "Kaffee, mit Koffein"
facetSids: "0699,0201,1200,0702"
ingredients: []
6 changes: 3 additions & 3 deletions recall24/src/main/java/dita/recall24/api/Interview24.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ public interface Interview24 {
// -- PARENT / CHILD

/**
* Respondent for this interview.
* Parent respondent of this interview.
*/
Respondent24 respondent();
Respondent24 parentRespondent();

/**
* Respondent meta-data for this interview.
Expand All @@ -62,7 +62,7 @@ public interface Interview24 {
* @see Respondent24#alias()
*/
default String respondentAlias() {
return respondent().alias();
return parentRespondent().alias();
}

}
Expand Down
5 changes: 0 additions & 5 deletions recall24/src/main/java/dita/recall24/api/InterviewSet24.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,6 @@ public interface InterviewSet24 {
*/
Can<? extends Respondent24> respondents();

/**
* Interviews that belong to this survey.
*/
Can<? extends Interview24> interviews();

Optional<? extends Respondent24> lookupRespondent(String respondentAlias);
Can<? extends Interview24> lookupInterviews(String respondentAlias);

Expand Down
9 changes: 8 additions & 1 deletion recall24/src/main/java/dita/recall24/api/Respondent24.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

import java.time.LocalDate;

import org.apache.causeway.commons.collections.Can;

import dita.commons.types.Sex;

public interface Respondent24 {
Expand All @@ -31,6 +33,11 @@ public interface Respondent24 {

LocalDate dateOfBirth();

Sex gender();
Sex sex();

/**
* Interviews that this respondent was subject to.
*/
Can<? extends Interview24> interviews();

}
4 changes: 0 additions & 4 deletions recall24/src/main/java/dita/recall24/dto/InterviewSetDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,6 @@ public class InterviewSetDto {
@XmlElement(name="respondent", type=RespondentDto.class)
private List<RespondentDto> respondents;

@XmlElementWrapper(name="interviews")
@XmlElement(name="interview", type=InterviewDto.class)
private List<InterviewDto> interviews;

public String toJson() {
return JsonUtils.toStringUtf8(this, JsonUtils::indentedOutput);
}
Expand Down
11 changes: 9 additions & 2 deletions recall24/src/main/java/dita/recall24/dto/RespondentDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,21 @@
package dita.recall24.dto;

import java.time.LocalDate;
import java.util.List;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlElementWrapper;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.apache.causeway.applib.jaxb.JavaTimeJaxbAdapters;

import lombok.Data;

import dita.commons.jaxb.JaxbAdapters;
import dita.commons.types.Sex;
import lombok.Data;

@XmlRootElement(name="respondent")
@XmlAccessorType(XmlAccessType.FIELD)
Expand All @@ -44,8 +47,12 @@ public class RespondentDto {
@XmlJavaTypeAdapter(value=JavaTimeJaxbAdapters.LocalDateToStringAdapter.class)
private LocalDate dateOfBirth;

@XmlElement(name="gender")
@XmlElement(name="sex")
@XmlJavaTypeAdapter(value=JaxbAdapters.GenderAdapter.class)
private Sex sex;

@XmlElementWrapper(name="interviews")
@XmlElement(name="interview", type=InterviewDto.class)
private List<InterviewDto> interviews;

}
16 changes: 9 additions & 7 deletions recall24/src/main/java/dita/recall24/model/Interview24.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@
import org.apache.causeway.commons.collections.Can;

import dita.commons.types.IntRef;
import io.github.causewaystuff.commons.base.types.internal.ObjectRef;
import io.github.causewaystuff.treeview.applib.annotations.TreeSubNodes;

public record Interview24(

/**
* Respondent of this interview.
*/
Respondent24 respondent,
ObjectRef<Respondent24> parentRespondentRef,

/**
* Interview date.
Expand All @@ -58,10 +59,6 @@ public record Interview24(
) implements dita.recall24.api.Interview24, Node24 {

public static Interview24 of(
/**
* Respondent of this interview.
*/
final Respondent24 respondent,
/**
* Interview date.
*/
Expand All @@ -74,19 +71,24 @@ public static Interview24 of(
* The meals of this interview.
*/
final Can<Meal24> meals) {
var interview = new Interview24(respondent, interviewDate, IntRef.of(-1), respondentMetaData, meals);
var interview = new Interview24(ObjectRef.empty(), interviewDate, IntRef.of(-1), respondentMetaData, meals);
respondentMetaData.parentInterviewRef().setValue(interview);
meals.forEach(meal24->meal24.parentInterviewRef().setValue(interview));
return interview;
}

@Override
public Respondent24 parentRespondent() {
return parentRespondentRef.getValue();
}

@Override
public int interviewOrdinal() {
return interviewOrdinalRef().getValue();
}

public boolean matchesRespondent(final Respondent24 candidate) {
return Objects.equals(respondent, candidate);
return Objects.equals(parentRespondent(), candidate);
}

}
Loading

0 comments on commit ff92009

Please sign in to comment.