diff --git a/src/main/java/upc/edu/gessi/repo/controller/ReviewsAPI.java b/src/main/java/upc/edu/gessi/repo/controller/ReviewsAPI.java index 290f9fa..e2b396a 100644 --- a/src/main/java/upc/edu/gessi/repo/controller/ReviewsAPI.java +++ b/src/main/java/upc/edu/gessi/repo/controller/ReviewsAPI.java @@ -5,7 +5,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import upc.edu.gessi.repo.dto.Review.ReviewDTO; -import upc.edu.gessi.repo.dto.Review.ReviewFeatureDTO; +import upc.edu.gessi.repo.dto.Review.ReviewFeatureRequestDTO; +import upc.edu.gessi.repo.dto.Review.ReviewFeatureResponseDTO; import java.util.List; @@ -20,7 +21,7 @@ ResponseEntity extractReviews( @RequestParam(name = "market-segment", defaultValue = "Communication", required = false) String marketSegment); @ApiOperation("Fetch reviews based on features") - @GetMapping(value = "/by-features") - ResponseEntity> getReviewsByFeatures( - @RequestBody List features); + @PostMapping(value = "/by-features") + ResponseEntity> getReviewsByFeatures( + @RequestBody ReviewFeatureRequestDTO request); } diff --git a/src/main/java/upc/edu/gessi/repo/controller/impl/ReviewsController.java b/src/main/java/upc/edu/gessi/repo/controller/impl/ReviewsController.java index b1d9528..6554f56 100644 --- a/src/main/java/upc/edu/gessi/repo/controller/impl/ReviewsController.java +++ b/src/main/java/upc/edu/gessi/repo/controller/impl/ReviewsController.java @@ -10,9 +10,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import upc.edu.gessi.repo.controller.ReviewsAPI; -import upc.edu.gessi.repo.dto.MobileApplication.MobileApplicationBasicDataDTO; import upc.edu.gessi.repo.dto.Review.ReviewDTO; -import upc.edu.gessi.repo.dto.Review.ReviewFeatureDTO; +import upc.edu.gessi.repo.dto.Review.ReviewFeatureRequestDTO; +import upc.edu.gessi.repo.dto.Review.ReviewFeatureResponseDTO; import upc.edu.gessi.repo.exception.*; import upc.edu.gessi.repo.exception.Reviews.NoReviewsFoundException; import upc.edu.gessi.repo.service.MobileApplicationService; @@ -85,9 +85,11 @@ public ResponseEntity extractReviews(final Integer size, final String ma } @Override - public ResponseEntity> getReviewsByFeatures(List features) { + public ResponseEntity> getReviewsByFeatures(ReviewFeatureRequestDTO request) { try { - return new ResponseEntity<>(((ReviewService) useService(ReviewService.class)).getByFeatures(features), + return new ResponseEntity<>(((ReviewService) useService(ReviewService.class)) + .getByAppIdAndFeatures(request.getAppName(), + request.getFeatureList()), HttpStatus.OK); } catch (NoReviewsFoundException e) { return new ResponseEntity<>(null, HttpStatus.NO_CONTENT); diff --git a/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureRequestDTO.java b/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureRequestDTO.java new file mode 100644 index 0000000..5edddf3 --- /dev/null +++ b/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureRequestDTO.java @@ -0,0 +1,23 @@ +package upc.edu.gessi.repo.dto.Review; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ReviewFeatureRequestDTO implements Serializable { + + @JsonProperty("app_id") + private String appName; + + @JsonProperty("features") + private List featureList; +} diff --git a/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureDTO.java b/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureResponseDTO.java similarity index 57% rename from src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureDTO.java rename to src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureResponseDTO.java index 60be543..80735df 100644 --- a/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureDTO.java +++ b/src/main/java/upc/edu/gessi/repo/dto/Review/ReviewFeatureResponseDTO.java @@ -1,26 +1,20 @@ package upc.edu.gessi.repo.dto.Review; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import upc.edu.gessi.repo.dto.serializer.CustomDateDeserializer; -import upc.edu.gessi.repo.dto.serializer.CustomDateSerializer; import java.io.Serializable; -import java.util.Date; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) -public class ReviewFeatureDTO implements Serializable { +public class ReviewFeatureResponseDTO implements Serializable { @JsonProperty("reviewId") private String id; diff --git a/src/main/java/upc/edu/gessi/repo/repository/ReviewRepository.java b/src/main/java/upc/edu/gessi/repo/repository/ReviewRepository.java index 6b65113..e68a168 100644 --- a/src/main/java/upc/edu/gessi/repo/repository/ReviewRepository.java +++ b/src/main/java/upc/edu/gessi/repo/repository/ReviewRepository.java @@ -4,7 +4,7 @@ import org.eclipse.rdf4j.query.TupleQueryResult; import upc.edu.gessi.repo.dto.Review.ReviewDTO; -import upc.edu.gessi.repo.dto.Review.ReviewFeatureDTO; +import upc.edu.gessi.repo.dto.Review.ReviewFeatureResponseDTO; import upc.edu.gessi.repo.dto.Review.SentenceDTO; import upc.edu.gessi.repo.dto.graph.GraphReview; import upc.edu.gessi.repo.exception.Reviews.NoReviewsFoundException; @@ -34,5 +34,5 @@ List getReviewsByAppNameAndIdentifierWithLimit(String appName, String appIdentifier, Integer limit); - List findAllByFeatures(List features) throws NoReviewsFoundException; + List findAllByAppIdAndFeatures(String appId, List features) throws NoReviewsFoundException; } diff --git a/src/main/java/upc/edu/gessi/repo/repository/impl/ReviewRepositoryImpl.java b/src/main/java/upc/edu/gessi/repo/repository/impl/ReviewRepositoryImpl.java index f526779..5c67f8c 100644 --- a/src/main/java/upc/edu/gessi/repo/repository/impl/ReviewRepositoryImpl.java +++ b/src/main/java/upc/edu/gessi/repo/repository/impl/ReviewRepositoryImpl.java @@ -133,15 +133,17 @@ public List findListed(final List reviewIds) throws NoReviews @Override - public List findAllByFeatures(final List features) throws NoReviewsFoundException { - TupleQueryResult reviewsResult = runSparqlQuery(reviewQueryBuilder.findReviewsByFeatures(features)); + public List findAllByAppIdAndFeatures(final String appId, + final List features) throws NoReviewsFoundException { + TupleQueryResult reviewsResult = runSparqlQuery(reviewQueryBuilder + .findReviewsByAppIdAndFeatures(appId, features)); if (!reviewsResult.hasNext()) { throw new NoReviewsFoundException("No review was found"); } - List reviewDTOs = new ArrayList<>(); + List reviewDTOs = new ArrayList<>(); while (reviewsResult.hasNext()) { - ReviewFeatureDTO reviewFeatureDTO = getReviewFeatureDTO(reviewsResult.next()); - reviewDTOs.add(reviewFeatureDTO); + ReviewFeatureResponseDTO reviewFeatureResponseDTO = getReviewFeatureDTO(reviewsResult.next()); + reviewDTOs.add(reviewFeatureResponseDTO); } return reviewDTOs; } @@ -391,17 +393,17 @@ private void commitChanges(final List statements) { repoConnection.close(); } - private ReviewFeatureDTO getReviewFeatureDTO(final BindingSet bindings) { - ReviewFeatureDTO reviewFeatureDTO = new ReviewFeatureDTO(); + private ReviewFeatureResponseDTO getReviewFeatureDTO(final BindingSet bindings) { + ReviewFeatureResponseDTO reviewFeatureResponseDTO = new ReviewFeatureResponseDTO(); if (existsShortReviewBinding(bindings)) { if (bindings.getBinding("id") != null && bindings.getBinding("id").getValue() != null) { String idValue = bindings.getBinding("id").getValue().stringValue(); - reviewFeatureDTO.setId(idValue); + reviewFeatureResponseDTO.setId(idValue); } if (bindings.getBinding("text") != null && bindings.getBinding("text").getValue() != null) { String textValue = bindings.getBinding("text").getValue().stringValue(); - reviewFeatureDTO.setReviewText(textValue); + reviewFeatureResponseDTO.setReviewText(textValue); } } @@ -415,10 +417,10 @@ private ReviewFeatureDTO getReviewFeatureDTO(final BindingSet bindings) { String model = bindings.getBinding("model").getValue().stringValue(); featureDTO.setLanguageModel(new LanguageModelDTO(model)); } - reviewFeatureDTO.setFeatureDTOs(Collections.singletonList(featureDTO)); + reviewFeatureResponseDTO.setFeatureDTOs(Collections.singletonList(featureDTO)); - return reviewFeatureDTO; + return reviewFeatureResponseDTO; } diff --git a/src/main/java/upc/edu/gessi/repo/service/ReviewService.java b/src/main/java/upc/edu/gessi/repo/service/ReviewService.java index d85d7ef..2ceb0ba 100644 --- a/src/main/java/upc/edu/gessi/repo/service/ReviewService.java +++ b/src/main/java/upc/edu/gessi/repo/service/ReviewService.java @@ -1,7 +1,7 @@ package upc.edu.gessi.repo.service; import upc.edu.gessi.repo.dto.Review.ReviewDTO; -import upc.edu.gessi.repo.dto.Review.ReviewFeatureDTO; +import upc.edu.gessi.repo.dto.Review.ReviewFeatureResponseDTO; import upc.edu.gessi.repo.exception.Reviews.NoReviewsFoundException; import java.util.List; @@ -15,6 +15,6 @@ public interface ReviewService extends CrudService { List getByFeature(String feature); - List getByFeatures(List features) throws NoReviewsFoundException; + List getByAppIdAndFeatures(String appId, List features) throws NoReviewsFoundException; } diff --git a/src/main/java/upc/edu/gessi/repo/service/impl/ReviewServiceImpl.java b/src/main/java/upc/edu/gessi/repo/service/impl/ReviewServiceImpl.java index 7ea5638..a815020 100644 --- a/src/main/java/upc/edu/gessi/repo/service/impl/ReviewServiceImpl.java +++ b/src/main/java/upc/edu/gessi/repo/service/impl/ReviewServiceImpl.java @@ -117,7 +117,9 @@ public List getByFeature(String feature) { } @Override - public List getByFeatures(List features) throws NoReviewsFoundException { - return ((ReviewRepository) useRepository(ReviewRepository.class)).findAllByFeatures(features); + public List getByAppIdAndFeatures(String appId, + List features) throws NoReviewsFoundException { + return ((ReviewRepository) useRepository(ReviewRepository.class)) + .findAllByAppIdAndFeatures(appId, features); } } diff --git a/src/main/java/upc/edu/gessi/repo/util/ReviewQueryBuilder.java b/src/main/java/upc/edu/gessi/repo/util/ReviewQueryBuilder.java index b9141db..310113e 100644 --- a/src/main/java/upc/edu/gessi/repo/util/ReviewQueryBuilder.java +++ b/src/main/java/upc/edu/gessi/repo/util/ReviewQueryBuilder.java @@ -266,17 +266,21 @@ public String getCountQuery() { return queryBuilder.toString(); } - public String findReviewsByFeatures(final List features) { + public String findReviewsByAppIdAndFeatures(String appId, final List features) { StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append("PREFIX rdf: \n"); queryBuilder.append("PREFIX schema: \n"); queryBuilder.append("SELECT ?id ?text ?feature ?model\n"); queryBuilder.append("WHERE {\n"); - queryBuilder.append(" ?s a schema:Review ;\n"); - queryBuilder.append(" schema:identifier ?id;\n"); - queryBuilder.append(" schema:reviewBody ?text;\n"); - queryBuilder.append(" schema:additionalProperty ?reviewSentence .\n"); - queryBuilder.append(" ?reviewSentence a schema:Review;\n"); + queryBuilder.append(" ?app a schema:MobileApplication ;\n"); + queryBuilder.append(" schema:identifier \"" + appId + "\" ;\n"); + queryBuilder.append(" schema:review ?review .\n"); + queryBuilder.append(" ?review a schema:Review ;\n"); + queryBuilder.append(" schema:identifier ?id;\n"); + queryBuilder.append(" schema:reviewBody ?text;\n"); + queryBuilder.append(" schema:additionalProperty ?reviewSentence .\n"); + queryBuilder.append(" ?reviewSentence a schema:Review; \n"); queryBuilder.append(" schema:keywords ?keywords .\n"); queryBuilder.append(" ?keywords a schema:DefinedTerm ;\n"); queryBuilder.append(" schema:name ?feature ;\n"); @@ -284,15 +288,19 @@ public String findReviewsByFeatures(final List features) { queryBuilder.append(" ?languageModel a schema:softwareApplication ;\n"); queryBuilder.append(" schema:identifier ?model .\n"); queryBuilder.append(" VALUES ?feature {\n"); + for (String feature : features) { queryBuilder.append(" \"" + feature + "\"\n"); } + queryBuilder.append(" }\n"); queryBuilder.append("}\n"); + return queryBuilder.toString(); } + }