/* TODO(andgein): Remove isRightAnswer? */ public async Task<UserExerciseSubmission> AddUserExerciseSubmission(string courseId, Guid slideId, string code, bool isRightAnswer, string compilationError, string output, string userId, string executionServiceName, string displayName) { 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; var 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 = AutomaticExerciseCheckingStatus.Waiting, IsRightAnswer = isRightAnswer, }; db.AutomaticExerciseCheckings.Add(automaticChecking); 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 = isRightAnswer, }; db.UserExerciseSubmissions.Add(submission); try { await db.SaveChangesAsync(); } catch (DbEntityValidationException e) { log.Error(e); throw new Exception( string.Join("\r\n", e.EntityValidationErrors.SelectMany(v => v.ValidationErrors).Select(err => err.PropertyName + " " + err.ErrorMessage))); } return submission; }
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; 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; }
protected void Save(AutomaticExerciseChecking checking) { db.AutomaticExerciseCheckings.AddOrUpdate(checking); UpdateIsRightAnswerForSubmission(checking); db.SaveChanges(); }
private void UpdateIsRightAnswerForSubmission(AutomaticExerciseChecking checking) { db.UserExerciseSubmissions .Where(s => s.AutomaticCheckingId == checking.Id) .ForEach(s => s.AutomaticCheckingIsRightAnswer = checking.IsRightAnswer); }