Skip to content
Snippets Groups Projects
Commit b642041f authored by Dominik Pilar's avatar Dominik Pilar
Browse files

Questionnaire answers of the users exported in archived training instance.

parent 1dddbde7
No related branches found
No related tags found
1 merge request!50Questionnaire answers of the users exported in archived training instance.
Pipeline #87665 passed with stages
in 1 minute and 52 seconds
......@@ -77,7 +77,7 @@ public class QuestionAnswer implements Serializable {
@Override
public String toString() {
return "QuestionAnswer{" +
"questionAnswerId=" + this.getQuestionAnswerId() +
"questionAnswerId=" + this.getQuestionAnswerId().getQuestionId() +
", answers='" + this.getAnswers() + '\'' +
'}';
}
......
package cz.muni.ics.kypo.training.adaptive.dto.archive.phases.questionnaire;
import java.util.List;
import java.util.Set;
public class QuestionAnswerArchiveDTO {
private String question;
private Set<String> answer;
public QuestionAnswerArchiveDTO(String question, Set<String> answer) {
this.question = question;
this.answer = answer;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public Set<String> getAnswer() {
return answer;
}
public void setAnswer(Set<String> answer) {
this.answer = answer;
}
}
......@@ -11,10 +11,13 @@ import cz.muni.ics.kypo.training.adaptive.annotations.transactions.Transactional
import cz.muni.ics.kypo.training.adaptive.domain.User;
import cz.muni.ics.kypo.training.adaptive.domain.phase.AbstractPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.QuestionnairePhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.Question;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionAnswer;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingInstance;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingRun;
import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.AbstractPhaseArchiveDTO;
import cz.muni.ics.kypo.training.adaptive.dto.archive.phases.questionnaire.QuestionAnswerArchiveDTO;
import cz.muni.ics.kypo.training.adaptive.dto.archive.training.TrainingDefinitionArchiveDTO;
import cz.muni.ics.kypo.training.adaptive.dto.archive.training.TrainingInstanceArchiveDTO;
import cz.muni.ics.kypo.training.adaptive.dto.archive.training.TrainingRunArchiveDTO;
......@@ -65,6 +68,7 @@ public class ExportImportFacade {
private static final Logger LOG = LoggerFactory.getLogger(ExportImportFacade.class);
private static final String LOGS_FOLDER = "logs";
private static final String EVENTS_FOLDER = "training_events";
private static final String QUESTIONNAIRES_ANSWERS_FOLDER = "questionnaires_answers";
private static final String RUNS_FOLDER = "training_runs";
private final ExportImportService exportImportService;
......@@ -246,6 +250,7 @@ public class ExportImportFacade {
zos.putNextEntry(runEntry);
zos.write(objectMapper.writeValueAsBytes(archivedRun));
writeQuestionsAnswers(zos, run);
List<Map<String, Object>> events = elasticsearchServiceApi.findAllEventsFromTrainingRun(run);
Map<Integer, Long> phaseStartTimestampMapping = writeEventsAndGetPhaseStartTimestampMapping(zos, run, events);
writeEventsByPhases(zos, run, events);
......@@ -288,6 +293,18 @@ public class ExportImportFacade {
}
}
private void writeQuestionsAnswers(ZipOutputStream zos, TrainingRun run) throws IOException {
Map<Long, List<QuestionAnswer>> questionsAnswersByQuestionnaires = exportImportService.findQuestionsAnswersOfQuestionnaires(run.getId());
for (Map.Entry<Long, List<QuestionAnswer>> questionAnswersByQuestionnaire : questionsAnswersByQuestionnaires.entrySet()) {
ZipEntry eventsDetailEntry = new ZipEntry(QUESTIONNAIRES_ANSWERS_FOLDER + "/training_run-id" + run.getId() + "-questionnaires" + "/questionnaire_id" + questionAnswersByQuestionnaire.getKey() + "-answers" + AbstractFileExtensions.JSON_FILE_EXTENSION);
zos.putNextEntry(eventsDetailEntry);
for(QuestionAnswer questionAnswer : questionAnswersByQuestionnaire.getValue()) {
zos.write(objectMapper.writer(new MinimalPrettyPrinter()).writeValueAsBytes(new QuestionAnswerArchiveDTO(questionAnswer.getQuestion().getText(), questionAnswer.getAnswers())));
zos.write(System.lineSeparator().getBytes());
}
}
}
private void writeConsoleCommands(ZipOutputStream zos, Integer sandboxId, List<Map<String, Object>> consoleCommands) throws IOException {
ZipEntry consoleCommandsEntry = new ZipEntry(LOGS_FOLDER + "/sandbox-" + sandboxId + "-useractions" + AbstractFileExtensions.JSON_FILE_EXTENSION);
zos.putNextEntry(consoleCommandsEntry);
......
......@@ -7,9 +7,13 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface QuestionAnswerRepository extends JpaRepository<QuestionAnswer, QuestionAnswerId>, QuerydslPredicateExecutor<QuestionAnswer> {
@Modifying
void deleteAllByTrainingRunId(Long trainingRunId);
List<QuestionAnswer> getAllByTrainingRunId(Long questionId);
}
......@@ -4,20 +4,25 @@ import cz.muni.ics.kypo.training.adaptive.domain.phase.AbstractPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.InfoPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.QuestionnairePhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.TrainingPhase;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionAnswer;
import cz.muni.ics.kypo.training.adaptive.domain.phase.questions.QuestionPhaseRelation;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingDefinition;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingInstance;
import cz.muni.ics.kypo.training.adaptive.domain.training.TrainingRun;
import cz.muni.ics.kypo.training.adaptive.exceptions.EntityErrorDetail;
import cz.muni.ics.kypo.training.adaptive.exceptions.EntityNotFoundException;
import cz.muni.ics.kypo.training.adaptive.repository.QuestionAnswerRepository;
import cz.muni.ics.kypo.training.adaptive.repository.phases.*;
import cz.muni.ics.kypo.training.adaptive.repository.training.TrainingDefinitionRepository;
import cz.muni.ics.kypo.training.adaptive.repository.training.TrainingInstanceRepository;
import cz.muni.ics.kypo.training.adaptive.repository.training.TrainingRunRepository;
import org.aspectj.weaver.patterns.TypePatternQuestions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
......@@ -30,7 +35,7 @@ public class ExportImportService {
private final TrainingDefinitionRepository trainingDefinitionRepository;
private final AbstractPhaseRepository abstractPhaseRepository;
private final QuestionPhaseRelationRepository questionPhaseRelationRepository;
private final QuestionRepository questionRepository;
private final QuestionAnswerRepository questionAnswerRepository;
private final TrainingPhaseRepository trainingPhaseRepository;
private final TrainingInstanceRepository trainingInstanceRepository;
private final TrainingRunRepository trainingRunRepository;
......@@ -41,7 +46,6 @@ public class ExportImportService {
* @param trainingDefinitionRepository the training definition repository
* @param abstractPhaseRepository the abstract phase repository
* @param questionPhaseRelationRepository the questionnaire phase repository
* @param infoPhaseRepository the info phase repository
* @param trainingPhaseRepository the training phase repository
* @param trainingInstanceRepository the training instance repository
* @param trainingRunRepository the training run repository
......@@ -50,15 +54,14 @@ public class ExportImportService {
public ExportImportService(TrainingDefinitionRepository trainingDefinitionRepository,
AbstractPhaseRepository abstractPhaseRepository,
QuestionPhaseRelationRepository questionPhaseRelationRepository,
QuestionRepository questionRepository,
InfoPhaseRepository infoPhaseRepository,
QuestionAnswerRepository questionAnswerRepository,
TrainingPhaseRepository trainingPhaseRepository,
TrainingInstanceRepository trainingInstanceRepository,
TrainingRunRepository trainingRunRepository) {
this.trainingDefinitionRepository = trainingDefinitionRepository;
this.abstractPhaseRepository = abstractPhaseRepository;
this.questionPhaseRelationRepository = questionPhaseRelationRepository;
this.questionRepository = questionRepository;
this.questionAnswerRepository = questionAnswerRepository;
this.trainingPhaseRepository = trainingPhaseRepository;
this.trainingInstanceRepository = trainingInstanceRepository;
this.trainingRunRepository = trainingRunRepository;
......@@ -84,7 +87,6 @@ public class ExportImportService {
* @param definition the {@link TrainingDefinition} to associate phase with.
*/
public TrainingPhase createTrainingPhase(TrainingPhase phase, TrainingDefinition definition) {
//phase.setOrder(abstractPhaseRepository.getCurrentMaxOrder(definition.getId()) + 1);
phase.setTrainingDefinition(definition);
phase.getTasks().forEach(task -> task.setTrainingPhase(phase));
phase.getDecisionMatrix().forEach(decisionMatrixRow -> decisionMatrixRow.setTrainingPhase(phase));
......@@ -92,7 +94,6 @@ public class ExportImportService {
}
public QuestionnairePhase createQuestionnairePhase(QuestionnairePhase phase, TrainingDefinition definition) {
//phase.setOrder(abstractPhaseRepository.getCurrentMaxOrder(definition.getId()) + 1);
phase.setTrainingDefinition(definition);
phase.getQuestions().forEach(question -> {
question.setQuestionnairePhase(phase);
......@@ -114,7 +115,6 @@ public class ExportImportService {
}
public InfoPhase createInfoPhase(InfoPhase phase, TrainingDefinition definition) {
//phase.setOrder(abstractPhaseRepository.getCurrentMaxOrder(definition.getId()) + 1);
phase.setTrainingDefinition(definition);
return abstractPhaseRepository.save(phase);
}
......@@ -168,4 +168,9 @@ public class ExportImportService {
public Set<TrainingRun> findRunsByInstanceId(Long trainingInstanceId) {
return trainingRunRepository.findAllByTrainingInstanceId(trainingInstanceId);
}
public Map<Long, List<QuestionAnswer>> findQuestionsAnswersOfQuestionnaires(Long trainingRunId) {
return questionAnswerRepository.getAllByTrainingRunId(trainingRunId).stream()
.collect(Collectors.groupingBy(questionAnswer -> questionAnswer.getQuestion().getQuestionnairePhase().getId()));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment