globalDuplicateDiagnostics static method
({Map<String, List<String> > duplicateOptions, Set<String> duplicatedQuestionKeys, Set<String> duplicatedStepKeys, List<String> emptyQuestionStepKeys, Map<String, List<String> > questionKeyToStepKeys})
globalDuplicateDiagnostics(
- QuizModel quiz
Retourne les doublons avec détails :
- stepKeys et questionKeys dupliqués,
- les stepKeys dans lesquels apparaissent les questions dupliquées,
- les stepKeys qui n'ont aucune question,
- les questions avec des options dupliquées (par key).
Implementation
static ({
Set<String> duplicatedStepKeys,
Set<String> duplicatedQuestionKeys,
Map<String, List<String>> questionKeyToStepKeys,
List<String> emptyQuestionStepKeys,
Map<String, List<String>> duplicateOptions,
}) globalDuplicateDiagnostics(QuizModel quiz) {
final stepKeySeen = <String>{};
final duplicatedStepKeys = <String>{};
final questionKeySeen = <String>{};
final duplicatedQuestionKeys = <String>{};
final questionKeyToStepKeys = <String, List<String>>{};
final emptyQuestionStepKeys = <String>[];
final duplicateOptions = <String, List<String>>{}; // questionKey -> duplicated option keys
for (var step in quiz.steps) {
// Check duplicated stepKey
if (!stepKeySeen.add(step.stepKey)) {
duplicatedStepKeys.add(step.stepKey);
}
// Check empty steps
if (step.displayableQuestions.isEmpty) {
emptyQuestionStepKeys.add(step.stepKey);
}
// Check duplicated questionKey
for (var question in step.displayableQuestions) {
final key = question.questionKey;
questionKeyToStepKeys.putIfAbsent(key, () => []);
questionKeyToStepKeys[key]!.add(step.stepKey);
if (!questionKeySeen.add(key)) {
duplicatedQuestionKeys.add(key);
}
// Check for duplicated option keys within the question
if (question.options != null) {
final seenOptionKeys = <String>{};
final duplicates = <String>{};
for (var opt in question.options!) {
if (!seenOptionKeys.add(opt.key)) {
duplicates.add(opt.key);
}
}
if (duplicates.isNotEmpty) {
duplicateOptions[key] = duplicates.toList();
}
}
}
}
return (
duplicatedStepKeys: duplicatedStepKeys,
duplicatedQuestionKeys: duplicatedQuestionKeys,
questionKeyToStepKeys: {
for (var entry in questionKeyToStepKeys.entries)
if (duplicatedQuestionKeys.contains(entry.key)) entry.key: entry.value
},
emptyQuestionStepKeys: emptyQuestionStepKeys,
duplicateOptions: duplicateOptions,
);
}