From 289d2eaec993b929a546cec1175f0f2437c33048 Mon Sep 17 00:00:00 2001 From: aniruddhzaveri Date: Sat, 14 Sep 2024 13:58:39 +0200 Subject: [PATCH] coderabbit and fixed client and server style --- .../assessment/service/ResultService.java | 35 +++++++++++-------- .../assessment/web/ResultResource.java | 2 +- .../Modal/feedback-modal.component.html | 7 +++- .../feedback-analysis.service.ts | 2 +- .../webapp/i18n/de/programmingExercise.json | 3 +- .../webapp/i18n/en/programmingExercise.json | 3 +- .../feedback-analysis.component.spec.ts | 1 - .../feedback-analysis.service.spec.ts | 9 ++++- 8 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/tum/cit/aet/artemis/assessment/service/ResultService.java b/src/main/java/de/tum/cit/aet/artemis/assessment/service/ResultService.java index a6ff3e57ab4d..0302b8947cb6 100644 --- a/src/main/java/de/tum/cit/aet/artemis/assessment/service/ResultService.java +++ b/src/main/java/de/tum/cit/aet/artemis/assessment/service/ResultService.java @@ -560,37 +560,42 @@ public FeedbackAnalysisResponseDTO getFeedbackDetailsOnPage(long exerciseId, Sea List feedbackDetails = studentParticipationRepository.findAggregatedFeedbackByExerciseId(exerciseId); String searchTerm = search.getSearchTerm() != null ? search.getSearchTerm().toLowerCase() : ""; - long totalFeedbackCount = feedbackDetails.size(); - - Predicate matchesSearchTerm = detail -> searchTerm.isEmpty() || detail.detailText().toLowerCase().contains(searchTerm) - || detail.testCaseName().toLowerCase().contains(searchTerm) || String.valueOf(detail.count()).contains(searchTerm) - || String.valueOf(detail.taskNumber()).contains(searchTerm) || String.valueOf(detail.relativeCount()).contains(searchTerm); - feedbackDetails = feedbackDetails.stream().map(detail -> { double relativeCount = (detail.count() * 100.0) / distinctResultCount; - int taskNumber = IntStream.range(0, tasks.size()) - .filter(i -> tasks.stream().toList().get(i).getTestCases().stream().anyMatch(tc -> tc.getTestName().equals(detail.testCaseName()))).findFirst().orElse(-1) + 1; + int taskNumber = determineTaskNumberOfTestCase(detail.testCaseName(), tasks); return new FeedbackDetailDTO(detail.count(), relativeCount, detail.detailText(), detail.testCaseName(), taskNumber); - }).filter(matchesSearchTerm).collect(Collectors.toList()); + }).filter(matchesSearchTerm(searchTerm)).sorted(getComparatorForFeedbackDetails(search)).toList(); + + return paginateFeedbackDetails(feedbackDetails, search.getPage(), search.getPageSize()); + } + + private Predicate matchesSearchTerm(String searchTerm) { + return detail -> searchTerm.isEmpty() || detail.detailText().toLowerCase().contains(searchTerm) || detail.testCaseName().toLowerCase().contains(searchTerm) + || String.valueOf(detail.count()).contains(searchTerm) || String.valueOf(detail.taskNumber()).contains(searchTerm) + || String.valueOf(detail.relativeCount()).contains(searchTerm); + } + private Comparator getComparatorForFeedbackDetails(SearchTermPageableSearchDTO search) { Map> comparators = Map.of("count", Comparator.comparingLong(FeedbackDetailDTO::count), "detailText", Comparator.comparing(FeedbackDetailDTO::detailText, String.CASE_INSENSITIVE_ORDER), "testCaseName", Comparator.comparing(FeedbackDetailDTO::testCaseName, String.CASE_INSENSITIVE_ORDER), "taskNumber", Comparator.comparingInt(FeedbackDetailDTO::taskNumber), "relativeCount", Comparator.comparingDouble(FeedbackDetailDTO::relativeCount)); - Comparator comparator = comparators.getOrDefault(search.getSortedColumn(), (a, b) -> 0); - feedbackDetails.sort(search.getSortingOrder() == SortingOrder.ASCENDING ? comparator : comparator.reversed()); + return search.getSortingOrder() == SortingOrder.ASCENDING ? comparator : comparator.reversed(); + } - int pageSize = search.getPageSize(); - int page = search.getPage(); + private int determineTaskNumberOfTestCase(String testCaseName, Set tasks) { + return IntStream.range(0, tasks.size()).filter(i -> tasks.stream().toList().get(i).getTestCases().stream().anyMatch(tc -> tc.getTestName().equals(testCaseName))) + .findFirst().orElse(-1) + 1; + } + private FeedbackAnalysisResponseDTO paginateFeedbackDetails(List feedbackDetails, int page, int pageSize) { int start = (page - 1) * pageSize; int end = Math.min(start + pageSize, feedbackDetails.size()); - List paginatedFeedbackDetails = feedbackDetails.subList(start, end); int totalPages = (feedbackDetails.size() + pageSize - 1) / pageSize; - return new FeedbackAnalysisResponseDTO(new SearchResultPageDTO<>(paginatedFeedbackDetails, totalPages), totalFeedbackCount); + return new FeedbackAnalysisResponseDTO(new SearchResultPageDTO<>(paginatedFeedbackDetails, totalPages), feedbackDetails.size()); } } diff --git a/src/main/java/de/tum/cit/aet/artemis/assessment/web/ResultResource.java b/src/main/java/de/tum/cit/aet/artemis/assessment/web/ResultResource.java index a69b3c583014..66badd3e24eb 100644 --- a/src/main/java/de/tum/cit/aet/artemis/assessment/web/ResultResource.java +++ b/src/main/java/de/tum/cit/aet/artemis/assessment/web/ResultResource.java @@ -292,7 +292,7 @@ public ResponseEntity createResultForExternalSubmission(@PathVariable Lo * @param search The pageable search DTO containing page number, page size, sorting options, and a search term for filtering results. * @return A {@link ResponseEntity} containing a {@link FeedbackAnalysisResponseDTO}, which includes the paginated feedback details and the total count of distinct results. */ - @PostMapping("/exercises/{exerciseId}/feedback-details-paged") + @PostMapping("exercises/{exerciseId}/feedback-details-paged") @EnforceAtLeastEditorInExercise public ResponseEntity getFeedbackDetailsPaged(@PathVariable long exerciseId, @RequestBody SearchTermPageableSearchDTO search) { FeedbackAnalysisResponseDTO response = resultService.getFeedbackDetailsOnPage(exerciseId, search); diff --git a/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/Modal/feedback-modal.component.html b/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/Modal/feedback-modal.component.html index 25ab8fdda6c4..eec7a8257dd9 100644 --- a/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/Modal/feedback-modal.component.html +++ b/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/Modal/feedback-modal.component.html @@ -25,5 +25,10 @@
- + diff --git a/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/feedback-analysis.service.ts b/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/feedback-analysis.service.ts index 1bc472908658..780a3b2a7a0c 100644 --- a/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/feedback-analysis.service.ts +++ b/src/main/webapp/app/exercises/programming/manage/grading/feedback-analysis/feedback-analysis.service.ts @@ -15,7 +15,7 @@ export interface FeedbackDetail { taskNumber: number; } -@Injectable({ providedIn: 'root' }) +@Injectable() export class FeedbackAnalysisService extends BaseApiHttpService { constructor() { super(); diff --git a/src/main/webapp/i18n/de/programmingExercise.json b/src/main/webapp/i18n/de/programmingExercise.json index 778a92e7ce7c..3bb9dd85ea35 100644 --- a/src/main/webapp/i18n/de/programmingExercise.json +++ b/src/main/webapp/i18n/de/programmingExercise.json @@ -332,7 +332,8 @@ "error": "Beim Laden des Feedback ist ein Fehler aufgetreten.", "feedbackModal": { "header": "Fehler Details", - "feedbackTitle": "Testfall Feedback" + "feedbackTitle": "Testfall Feedback", + "ok": "Ok" } }, "help": { diff --git a/src/main/webapp/i18n/en/programmingExercise.json b/src/main/webapp/i18n/en/programmingExercise.json index fc28afe8a12a..7315277b5e6d 100644 --- a/src/main/webapp/i18n/en/programmingExercise.json +++ b/src/main/webapp/i18n/en/programmingExercise.json @@ -334,7 +334,8 @@ "error": "An error occurred while loading the feedback.", "feedbackModal": { "header": "Error Details", - "feedbackTitle": "Test Case Feedback" + "feedbackTitle": "Test Case Feedback", + "ok": "Ok" } }, "help": { diff --git a/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.component.spec.ts b/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.component.spec.ts index 234af2ab44e4..072c9dfca4a9 100644 --- a/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.component.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.component.spec.ts @@ -35,7 +35,6 @@ describe('FeedbackAnalysisComponent', () => { FeedbackAnalysisService, ], }).compileComponents(); - fixture = TestBed.createComponent(FeedbackAnalysisComponent); component = fixture.componentInstance; feedbackAnalysisService = fixture.debugElement.injector.get(FeedbackAnalysisService); diff --git a/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.service.spec.ts b/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.service.spec.ts index 52ff16cc5548..5784177baecc 100644 --- a/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.service.spec.ts +++ b/src/test/javascript/spec/component/programming-exercise/feedback-analysis/feedback-analysis.service.spec.ts @@ -1,6 +1,7 @@ import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { FeedbackAnalysisResponse, FeedbackAnalysisService, FeedbackDetail } from 'app/exercises/programming/manage/grading/feedback-analysis/feedback-analysis.service'; +import { SearchTermPageableSearch, SortingOrder } from 'app/shared/table/pageable-table'; describe('FeedbackAnalysisService', () => { let service: FeedbackAnalysisService; @@ -32,7 +33,13 @@ describe('FeedbackAnalysisService', () => { describe('search', () => { it('should retrieve feedback details for a given exercise', async () => { - const pageable = { page: 1, pageSize: 10, searchTerm: '', sortingOrder: 'ASC', sortedColumn: 'count' }; + const pageable: SearchTermPageableSearch = { + page: 1, + pageSize: 10, + searchTerm: '', + sortingOrder: SortingOrder.ASCENDING, + sortedColumn: 'count', + }; const exerciseId = 1; const responsePromise = service.search(pageable, { exerciseId });