private async Task UpdateIsRightAnswerForSubmission(AutomaticExerciseChecking checking) { await db.UserExerciseSubmissions .Where(s => s.AutomaticCheckingId == checking.Id) .ForEachAsync(s => s.AutomaticCheckingIsRightAnswer = checking.IsRightAnswer); }
private async Task <AutomaticExerciseChecking> UpdateAutomaticExerciseChecking(AutomaticExerciseChecking checking, RunningResults result) { var compilationErrorHash = (await textsRepo.AddText(result.CompilationOutput)).Hash; var output = result.GetOutput().NormalizeEoln(); var outputHash = (await textsRepo.AddText(output)).Hash; var logs = result.GetLogs().NormalizeEoln(); var logsHash = (await textsRepo.AddText(logs)).Hash; var isWebRunner = checking.CourseId == "web" && checking.SlideId == Guid.Empty; var exerciseSlide = isWebRunner ? null : (ExerciseSlide)(await courseManager.GetCourseAsync(checking.CourseId)) .GetSlideById(checking.SlideId, true); var isRightAnswer = IsRightAnswer(result, output, exerciseSlide?.Exercise); var elapsed = DateTime.Now - checking.Timestamp; elapsed = elapsed < TimeSpan.FromDays(1) ? elapsed : new TimeSpan(0, 23, 59, 59); var newChecking = new AutomaticExerciseChecking { Id = checking.Id, CourseId = checking.CourseId, SlideId = checking.SlideId, UserId = checking.UserId, Timestamp = checking.Timestamp, CompilationErrorHash = compilationErrorHash, IsCompilationError = result.Verdict == Verdict.CompilationError, OutputHash = outputHash, ExecutionServiceName = checking.ExecutionServiceName, Status = result.Verdict == Verdict.SandboxError ? AutomaticExerciseCheckingStatus.Error : AutomaticExerciseCheckingStatus.Done, DisplayName = checking.DisplayName, Elapsed = elapsed, IsRightAnswer = isRightAnswer, CheckingAgentName = checking.CheckingAgentName, Points = result.Points, DebugLogsHash = logsHash }; return(newChecking); }
private async Task <AutomaticExerciseChecking> UpdateAutomaticExerciseChecking(AutomaticExerciseChecking checking, RunningResults result) { var compilationErrorHash = (await textsRepo.AddText(result.CompilationOutput)).Hash; var output = result.GetOutput().NormalizeEoln(); var outputHash = (await textsRepo.AddText(output)).Hash; var isWebRunner = checking.CourseId == "web" && checking.SlideId == Guid.Empty; var exerciseSlide = isWebRunner ? null : (ExerciseSlide)courseManager.GetCourse(checking.CourseId).GetSlideById(checking.SlideId); var expectedOutput = exerciseSlide?.Exercise.ExpectedOutput.NormalizeEoln(); var isRightAnswer = result.Verdict == Verdict.Ok && output.Equals(expectedOutput); var score = isRightAnswer ? exerciseSlide.Exercise.CorrectnessScore : 0; /* For skipped slides score is always 0 */ if (visitsRepo.IsSkipped(checking.CourseId, checking.SlideId, checking.UserId)) { score = 0; } var newChecking = new AutomaticExerciseChecking { Id = checking.Id, CourseId = checking.CourseId, SlideId = checking.SlideId, UserId = checking.UserId, Timestamp = checking.Timestamp, CompilationErrorHash = compilationErrorHash, IsCompilationError = result.Verdict == Verdict.CompilationError, OutputHash = outputHash, ExecutionServiceName = checking.ExecutionServiceName, Status = AutomaticExerciseCheckingStatus.Done, DisplayName = checking.DisplayName, Elapsed = DateTime.Now - checking.Timestamp, IsRightAnswer = isRightAnswer, Score = score, }; return(newChecking); }
public async Task <int> AddUserExerciseSubmission( string courseId, Guid slideId, string code, string compilationError, string output, string userId, string executionServiceName, string displayName, Language language, string sandbox, bool hasAutomaticChecking, AutomaticExerciseCheckingStatus?status = AutomaticExerciseCheckingStatus.Waiting) { if (string.IsNullOrWhiteSpace(code)) { code = "// no code"; } var hash = (await textsRepo.AddText(code)).Hash; var compilationErrorHash = (await textsRepo.AddText(compilationError)).Hash; var outputHash = (await textsRepo.AddText(output)).Hash; AutomaticExerciseChecking automaticChecking; if (hasAutomaticChecking) { automaticChecking = new AutomaticExerciseChecking { CourseId = courseId, SlideId = slideId, UserId = userId, Timestamp = DateTime.Now, CompilationErrorHash = compilationErrorHash, IsCompilationError = !string.IsNullOrWhiteSpace(compilationError), OutputHash = outputHash, ExecutionServiceName = executionServiceName, DisplayName = displayName, Status = status.Value, IsRightAnswer = false, }; db.AutomaticExerciseCheckings.Add(automaticChecking); } else { automaticChecking = null; } var submission = new UserExerciseSubmission { CourseId = courseId, SlideId = slideId, UserId = userId, Timestamp = DateTime.Now, SolutionCodeHash = hash, CodeHash = code.Split('\n').Select(x => x.Trim()).Aggregate("", (x, y) => x + y).GetHashCode(), Likes = new List <Like>(), AutomaticChecking = automaticChecking, AutomaticCheckingIsRightAnswer = automaticChecking?.IsRightAnswer ?? true, Language = language, Sandbox = sandbox }; db.UserExerciseSubmissions.Add(submission); await db.SaveChangesAsync(); return(submission.Id); }
private void UpdateIsRightAnswerForSubmission(AutomaticExerciseChecking checking) { db.UserExerciseSubmissions .Where(s => s.AutomaticCheckingId == checking.Id) .ForEach(s => s.AutomaticCheckingIsRightAnswer = checking.IsRightAnswer); }