This is the codeAbility Sharing Platform! Learn more about the codeAbility Sharing Platform.

Skip to content
Snippets Groups Projects
Commit dfaa215f authored by Eduard Frankford's avatar Eduard Frankford
Browse files

added query for number of views and downloads and improved ui

parent 94fe0fb0
Branches
2 merge requests!62created achievementService and separated some functionality out of...,!45Achievements
package at.ac.uibk.gitsearch.repository;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import at.ac.uibk.gitsearch.domain.Statistics;
......@@ -14,4 +16,13 @@ import at.ac.uibk.gitsearch.domain.Statistics;
public interface StatisticsRepository extends JpaRepository<Statistics, Long> {
Optional<Statistics> findByExerciseID(String id);
@Query(value = "SELECT SUM(u.views) FROM statistics u WHERE u.exercise_id IN (?1)", nativeQuery = true)
Optional<Integer> findNumberOfViewsByExerciseIDs(List<String> list);
@Query(value = "SELECT SUM(u.downloads) FROM statistics u WHERE u.exercise_id IN (?1)", nativeQuery = true)
Optional<Integer> findNumberOfDownloadsByExerciseIDs(List<String> list);
@Query(value = "SELECT SUM(u.downloads), SUM(u.views) FROM statistics u WHERE u.exercise_id IN (?1)", nativeQuery = true)
Optional<List<Integer>> findNumberOfDownloadsAndViewsByExerciseIDs(List<String> list);
}
package at.ac.uibk.gitsearch.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.codeability.sharing.plugins.api.search.SearchResultDTO;
......@@ -9,46 +13,73 @@ import org.codeability.sharing.plugins.api.search.SearchResultsDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import at.ac.uibk.gitsearch.repository.StatisticsRepository;
import at.ac.uibk.gitsearch.service.dto.StatisticsDTO;
@Service
@Transactional
public class AchievementService {
private final Logger log = LoggerFactory.getLogger(AchievementService.class);
private final SearchService searchService;
private final StatisticsService statisticsService;
private final UserService userService;
private final StatisticsRepository statisticsRepository;
public AchievementService(SearchService searchService, StatisticsService statisticsService, UserService userService) {
public AchievementService(SearchService searchService, StatisticsService statisticsService, UserService userService, StatisticsRepository statisticsRepository) {
this.searchService = searchService;
this.statisticsService = statisticsService;
this.userService = userService;
this.statisticsRepository = statisticsRepository;
}
public StatisticsDTO searchUserStatistics(String email) throws IOException {
SearchResultsDTO results = searchService.searchResultForAuthorEmail(email, 1000);
int totalAmountOfViews = 0;
int totalAmountOfDownloads = 0;
for (SearchResultDTO result : results.getSearchResult()) {
Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID((result.getExerciseId()));
if (statisticsDTO.isPresent()) {
StatisticsDTO newStats = statisticsDTO.get();
totalAmountOfViews += newStats.getViews();
totalAmountOfDownloads += newStats.getDownloads();
}
List<SearchResultDTO> result = results.getSearchResult();
List<String> query = new ArrayList<String>();
for (int i = 0; i < result.size() ; i++) {
query.add(result.get(i).getExerciseId());
}
StatisticsDTO toReturn = new StatisticsDTO();
toReturn.setViews(totalAmountOfViews);
toReturn.setDownloads(totalAmountOfDownloads);
Optional<Integer> totalAmountOfDownloads = statisticsRepository.findNumberOfDownloadsByExerciseIDs(query);
Optional<Integer> totalAmountOfViews = statisticsRepository.findNumberOfViewsByExerciseIDs(query);
if(totalAmountOfDownloads.isPresent()){
toReturn.setDownloads(totalAmountOfDownloads.get());
}else {
toReturn.setDownloads(0);
}
if(totalAmountOfViews.isPresent()){
toReturn.setViews(totalAmountOfViews.get());
}else {
toReturn.setViews(0);
}
log.info("Returning " + toReturn.getViews() + " views and " + toReturn.getDownloads() + " downloads");
return toReturn;
}
}
// Maybe to use later
// Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID((result.getExerciseId()));
// if (statisticsDTO.isPresent()) {
// StatisticsDTO newStats = statisticsDTO.get();
// totalAmountOfViews += newStats.getViews();
// totalAmountOfDownloads += newStats.getDownloads();
// }
\ No newline at end of file
......@@ -55,4 +55,5 @@ public interface StatisticsService {
Page<StatisticsDTO> search(String query, Pageable pageable);
Optional<StatisticsDTO> findOneByExerciseID(String id);
}
......@@ -16,11 +16,8 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
<<<<<<< HEAD
import at.ac.uibk.gitsearch.es.model.DocumentInfo;
import at.ac.uibk.gitsearch.service.AchievementService;
=======
>>>>>>> a29c1043321f9ebc48ee4d9248eae33e254b66e1
import at.ac.uibk.gitsearch.service.SearchService;
import at.ac.uibk.gitsearch.service.StatisticsService;
import at.ac.uibk.gitsearch.service.UserService;
......@@ -61,24 +58,7 @@ public class AchievementResource {
public ResponseEntity<StatisticsDTO> searchUserStatistics() throws IOException {
String email = userService.getUserWithAuthorities().get().getEmail();
log.debug("REST request to search statistics for user {}", email);
<<<<<<< HEAD
StatisticsDTO toReturn = achievementService.searchUserStatistics(email);
=======
SearchResultsDTO results = searchService.searchResultForAuthorEmail(email, 1000);
int totalAmountOfViews = 0;
int totalAmountOfDownloads = 0;
for (SearchResultDTO result : results.getSearchResult()) {
Optional<StatisticsDTO> statisticsDTO = statisticsService.findOneByExerciseID((result.getExerciseId()));
if (statisticsDTO.isPresent()) {
StatisticsDTO newStats = statisticsDTO.get();
totalAmountOfViews += newStats.getViews();
totalAmountOfDownloads += newStats.getDownloads();
}
}
StatisticsDTO toReturn = new StatisticsDTO();
toReturn.setViews(totalAmountOfViews);
toReturn.setDownloads(totalAmountOfDownloads);
>>>>>>> a29c1043321f9ebc48ee4d9248eae33e254b66e1
return new ResponseEntity<StatisticsDTO>(toReturn, HttpStatus.OK);
......
#H2 Server Properties
#Sun Jun 27 15:48:16 CEST 2021
#Mon Jul 05 20:07:59 CEST 2021
0=JHipster H2 (Disk)|org.h2.Driver|jdbc\:h2\:file\:./target/h2db/db/gitsearch|gitsearch
webSSL=false
webAllowOthers=true
......
......@@ -4,8 +4,8 @@
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- The FILE and ASYNC appenders are here as examples for a production configuration -->
<!--
<!-- The FILE and ASYNC appenders are here as examples for a production configuration -->
<!--
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
......@@ -46,6 +46,8 @@
<logger name="org.hibernate.validator" level="WARN"/>
<logger name="org.hibernate" level="WARN"/>
<logger name="org.hibernate.ejb.HibernatePersistence" level="OFF"/>
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.type" level="TRACE" />
<logger name="org.springframework" level="WARN"/>
<logger name="org.springframework.web" level="WARN"/>
<logger name="org.springframework.security" level="WARN"/>
......
<h2>{{ 'achievements.title' | translate}}</h2>
<h3>{{ 'achievements.toComplete' | translate}}</h3>
<p></p>
<ul class="list-group" *ngIf="statistics">
<li *ngIf="statistics?.views > config.views[1] && statistics?.views <= config.views[2]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.views[2]}} {{ 'achievements.views' |
translate}}</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.views / config.views[2] * 100" [striped]="true"
*ngIf="statistics?.views <= config.views[2]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.views > config.views[2]" class="greeniconcolor"></fa-icon>
<div class="container-fluid" style="padding-left: 3%; padding-right: 3%; max-width: 1700px;">
<h2>{{ 'achievements.title' | translate}}</h2>
<h3>{{ 'achievements.toComplete' | translate}}</h3>
<p></p>
<ul class="list-group" *ngIf="statistics">
<li *ngIf="statistics?.views > config.views[1] && statistics?.views <= config.views[2]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.views[2]}} {{ 'achievements.views' |
translate}}</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.views / config.views[2] * 100" [striped]="true"
*ngIf="statistics?.views <= config.views[2]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.views > config.views[2]" class="greeniconcolor"></fa-icon>
</div>
</div>
</div>
</li>
<li *ngIf="statistics?.views > config.views[0] && statistics?.views <= config.views[1]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.views[1]}} {{ 'achievements.views' |
translate}}</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.views / config.views[1] * 100" [striped]="true"
*ngIf="statistics?.views <= config.views[1]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.views > config.views[1]" class="greeniconcolor"></fa-icon>
</li>
<li *ngIf="statistics?.views > config.views[0] && statistics?.views <= config.views[1]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.views[1]}} {{ 'achievements.views' |
translate}}</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.views / config.views[1] * 100" [striped]="true"
*ngIf="statistics?.views <= config.views[1]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.views > config.views[1]" class="greeniconcolor"></fa-icon>
</div>
</div>
</div>
</li>
<li *ngIf="statistics?.views <= config.views[0]" class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.views[0]}} {{ 'achievements.views' |
translate}} </div>
<div id="wide">
<ngb-progressbar *ngIf="statistics?.views <= config.views[0]" type="success"
[value]="statistics?.views / config.views[0] * 100" [striped]="true">
</ngb-progressbar>
<fa-icon *ngIf="statistics?.views > config.views[0]" icon="check" class="greeniconcolor"></fa-icon>
</li>
<li *ngIf="statistics?.views <= config.views[0]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.views[0]}} {{ 'achievements.views' |
translate}} </div>
<div id="wide">
<ngb-progressbar *ngIf="statistics?.views <= config.views[0]" type="success"
[value]="statistics?.views / config.views[0] * 100" [striped]="true">
</ngb-progressbar>
<fa-icon *ngIf="statistics?.views > config.views[0]" icon="check" class="greeniconcolor"></fa-icon>
</div>
</div>
</div>
</li>
<li *ngIf="statistics?.downloads > config.downloads[1] && statistics?.downloads <= config.views[2]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.downloads[2]}} downloads</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.downloads / config.downloads[2] * 100"
[striped]="true" *ngIf="statistics?.downloads <= config.downloads[2]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.downloads > config.downloads[2]" class="greeniconcolor">
</fa-icon>
</li>
<li *ngIf="statistics?.downloads > config.downloads[1] && statistics?.downloads <= config.views[2]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.downloads[2]}} downloads</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.downloads / config.downloads[2] * 100"
[striped]="true" *ngIf="statistics?.downloads <= config.downloads[2]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.downloads > config.downloads[2]" class="greeniconcolor">
</fa-icon>
</div>
</div>
</div>
</li>
<li *ngIf="statistics?.downloads > config.downloads[0] && statistics?.downloads <= config.views[1]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.downloads[1]}} downloads</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.downloads / config.downloads[1] * 100"
[striped]="true" *ngIf="statistics?.downloads <= config.downloads[1]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.downloads > config.downloads[1]" class="greeniconcolor">
</fa-icon>
</li>
<li *ngIf="statistics?.downloads > config.downloads[0] && statistics?.downloads <= config.views[1]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.downloads[1]}} downloads</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.downloads / config.downloads[1] * 100"
[striped]="true" *ngIf="statistics?.downloads <= config.downloads[1]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.downloads > config.downloads[1]" class="greeniconcolor">
</fa-icon>
</div>
</div>
</div>
</li>
<li *ngIf="statistics?.downloads <= config.downloads[0]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.downloads[0]}} downloads</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.downloads / config.downloads[0] * 100"
[striped]="true" *ngIf="statistics?.downloads <= config.downloads[0]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.downloads > config.downloads[0]" class="greeniconcolor">
</fa-icon>
</li>
<li *ngIf="statistics?.downloads <= config.downloads[0]"
class="list-group-item justify-content-between align-items-center">
<div id="parent">
<div id="narrow">{{ 'achievements.moreThan' | translate}} {{config.downloads[0]}} downloads</div>
<div id="wide">
<ngb-progressbar type="success" [value]="statistics?.downloads / config.downloads[0] * 100"
[striped]="true" *ngIf="statistics?.downloads <= config.downloads[0]">
</ngb-progressbar>
<fa-icon icon="check" *ngIf="statistics?.downloads > config.downloads[0]" class="greeniconcolor">
</fa-icon>
</div>
</div>
</div>
</li>
</ul>
</li>
</ul>
<!-- <button (click) = "buildAchievements()" class="btn btn-primary"> Get number of views </button> -->
<!-- <button (click) = "buildAchievements()" class="btn btn-primary"> Get number of views </button> -->
<!-- <ul class="list-group" *ngIf="statistics">
<!-- <ul class="list-group" *ngIf="statistics">
<li class="list-group-item d-flex justify-content-between align-items-center">
More than 500 views
<span *ngIf="statistics?.views <= 500" class="badge badge-primary badge-pill">{{statistics?.views}}</span>
......@@ -120,79 +122,81 @@
</li>
</ul> -->
<p></p>
<h3>{{ 'achievements.completed' | translate}}</h3>
<p></p>
<div class="grid-container" *ngIf="statistics">
<div class=" justify-content-between align-items-center">
<p></p>
<h3>{{ 'achievements.completed' | translate}}</h3>
<p></p>
<div class="grid-container" *ngIf="statistics">
<div class=" justify-content-between align-items-center">
<fa-icon [ngbTooltip]="helpViewsGold" icon="trophy" class="goldiconcolor big-icon"></fa-icon>
<fa-icon *ngIf="statistics?.views > config.views[2] || statistics?.downloads > config.downloads[2]" [ngbTooltip]="helpViewsGold" icon="trophy" class="goldiconcolor big-icon"></fa-icon>
<ng-template #helpViewsGold> Gold Achievements</ng-template>
<div class="justify-content-between align-items-center">
<ng-template #helpViewsGold> Gold Achievements</ng-template>
<div class="justify-content-between align-items-center">
<div class="badge" *ngIf="statistics?.views > config.views[2]">
{{ 'achievements.moreThan' | translate}} {{config.views[2]}} {{ 'achievements.views' |
translate}}
</div>
<br>
<div class="badge" *ngIf="statistics?.views > config.views[2]">
{{ 'achievements.moreThan' | translate}} {{config.views[2]}} {{ 'achievements.views' |
translate}}
</div>
<div class="badge" *ngIf="statistics?.downloads > config.downloads[2]">
{{ 'achievements.moreThan' | translate}} {{config.downloads[2]}} {{ 'achievements.downloads' |
translate}}
</div>
<br>
<div class="badge" *ngIf="statistics?.downloads > config.downloads[2]">
{{ 'achievements.moreThan' | translate}} {{config.downloads[2]}} {{ 'achievements.downloads' |
translate}}
</div>
</div>
</div>
</div>
<div class="justify-content-between align-items-center">
<div class="justify-content-between align-items-center">
<fa-icon [ngbTooltip]="helpViewsSilver" icon="trophy" class="silvericoncolor big-icon"></fa-icon>
<fa-icon *ngIf="statistics?.views > config.views[1] || statistics?.downloads > config.downloads[1]" [ngbTooltip]="helpViewsSilver" icon="trophy" class="silvericoncolor big-icon"></fa-icon>
<ng-template #helpViewsSilver> Silver Achievements </ng-template>
<ng-template #helpViewsSilver> Silver Achievements </ng-template>
<div class="justify-content-between align-items-center">
<div class="justify-content-between align-items-center">
<div class="badge" *ngIf="statistics?.views > config.views[1]">
{{ 'achievements.moreThan' | translate}} {{config.views[1]}} {{ 'achievements.views' |
translate}}
</div>
<div class="badge" *ngIf="statistics?.views > config.views[1]">
{{ 'achievements.moreThan' | translate}} {{config.views[1]}} {{ 'achievements.views' |
translate}}
</div>
<br>
<br>
<div class="badge" *ngIf="statistics?.downloads > config.downloads[1]">
{{ 'achievements.moreThan' | translate}} {{config.downloads[1]}} {{ 'achievements.downloads' |
translate}}
</div>
<div class="badge" *ngIf="statistics?.downloads > config.downloads[1]">
{{ 'achievements.moreThan' | translate}} {{config.downloads[1]}} {{ 'achievements.downloads' |
translate}}
</div>
</div>
</div>
<div class=" justify-content-between align-items-center">
</div>
<div class=" justify-content-between align-items-center">
<fa-icon *ngIf="statistics?.views > config.views[0] || statistics?.downloads > config.downloads[0]" [ngbTooltip]="helpViewsBronze" icon="trophy" class="bronzeiconcolor big-icon"></fa-icon>
<fa-icon [ngbTooltip]="helpViewsBronze" icon="trophy" class="bronzeiconcolor big-icon"></fa-icon>
<ng-template #helpViewsBronze> Bronce achievements </ng-template>
<ng-template #helpViewsBronze> Bronce achievements </ng-template>
<div class="justify-content-between align-items-center">
<div class="justify-content-between align-items-center">
<div class="badge" *ngIf="statistics?.views > config.views[0]">
{{ 'achievements.moreThan' | translate}} {{config.views[0]}} {{ 'achievements.views' |
translate}}
</div>
<div class="badge" *ngIf="statistics?.views > config.views[0]">
{{ 'achievements.moreThan' | translate}} {{config.views[0]}} {{ 'achievements.views' |
translate}}
</div>
<br>
<br>
<div class="badge" *ngIf="statistics?.downloads > config.downloads[0]">
{{ 'achievements.moreThan' | translate}} {{config.downloads[0]}} {{ 'achievements.downloads' |
translate}}
</div>
<div class="badge" *ngIf="statistics?.downloads > config.downloads[0]">
{{ 'achievements.moreThan' | translate}} {{config.downloads[0]}} {{ 'achievements.downloads' |
translate}}
</div>
</div>
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment