dataset studentsSummary over s : Student {
	column id: s.ID
	column name: s.name
	column phone: s.contact.phone
	
	column items_completed: s.grades.size
	column final_grade : s.getFinalGrade()

	column course_outcome {
		if (final_grade < 50) {
			return "fail";
		}
		else if (final_grade < 70) {
			return "good";
		}
		else if (final_grade < 90) {
			return "notable";
		}
		else {
			return "excellent";
		}
	}
}

@cached
operation Student getFinalGrade() {
	return self.grades
			.collect(g | g.points * g.item.percentage)
			.sum() / 100;
}


dataset studentsContact over s : Student {
	properties [ID as StudentId, name]
	reference contact[email, phone]
}


dataset remoteStudents over s : Student {
	guard: s.isRemote

	properties[ID, name]
}

dataset finalExamAssistants over s : Student
	from : Student.all.select(s |
			s.grades.exists(g | g.item.name == "Final Exam")) {

	properties[ID, name]
}


dataset studentGrades over s : Student {
	properties[ID, name]

	grid {
		keys: EvaluationItem.all
		header: key.name
		body: s.grades.selectOne(g | g.item == key)?.points
	}

	column final_grade : s.getFinalGrade()
}


dataset numbers over n from : 1.to(5) {
	column number : n
	column squared : n * n

	grid {
		keys: 2.to(5)
		header: "times_" + key
		body: n * key
	}
}


dataset gradesDetails over g : Grade {
	properties[points]
	reference item[name]
	from student : g.eContainer {
		column id : student.ID
		column final_grade : student.getFinalGrade()
		column grade_lowerthan_final : g.points < final_grade
	}
}


dataset studentGradesPostProcessed over s : Student {
	properties[ID]

	@fillNulls 0
	grid {
		keys: EvaluationItem.all
		header: key.name
		body: s.grades.selectOne(g | g.item == key)?.points
	}

	column final_grade : s.getFinalGrade()
	@normalize 100
	column final_grade_normalized : final_grade
}