Пример #1
0
 private async Task UpdateIsRightAnswerForSubmission(AutomaticExerciseChecking checking)
 {
     await db.UserExerciseSubmissions
     .Where(s => s.AutomaticCheckingId == checking.Id)
     .ForEachAsync(s => s.AutomaticCheckingIsRightAnswer = checking.IsRightAnswer);
 }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
 private void UpdateIsRightAnswerForSubmission(AutomaticExerciseChecking checking)
 {
     db.UserExerciseSubmissions
     .Where(s => s.AutomaticCheckingId == checking.Id)
     .ForEach(s => s.AutomaticCheckingIsRightAnswer = checking.IsRightAnswer);
 }