Skip to content

Commit 8a7875d

Browse files
committed
using note specification for advanced paging queries
1 parent 76619cb commit 8a7875d

5 files changed

Lines changed: 47 additions & 18 deletions

File tree

src/main/java/edu/tamu/app/controller/NoteController.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@
99
import org.springframework.web.bind.annotation.RestController;
1010

1111
import edu.tamu.app.model.Note;
12-
import edu.tamu.app.model.Service;
1312
import edu.tamu.app.model.repo.NoteRepo;
1413
import edu.tamu.app.model.request.FilteredPageRequest;
1514
import edu.tamu.framework.aspect.annotation.ApiCredentials;
1615
import edu.tamu.framework.aspect.annotation.ApiData;
1716
import edu.tamu.framework.aspect.annotation.ApiMapping;
18-
import edu.tamu.framework.aspect.annotation.ApiModel;
1917
import edu.tamu.framework.aspect.annotation.ApiValidatedModel;
2018
import edu.tamu.framework.aspect.annotation.ApiValidation;
2119
import edu.tamu.framework.aspect.annotation.ApiVariable;
@@ -30,14 +28,10 @@ public class NoteController {
3028
@Autowired
3129
private NoteRepo noteRepo;
3230

33-
@ApiMapping("/by-service/{pinned}")
31+
@ApiMapping("/query")
3432
@Auth(role = "ROLE_ANONYMOUS")
35-
public ApiResponse getAllNotesByService(@ApiModel Service service, @ApiVariable String pinned) {
36-
if (Boolean.valueOf(pinned)) {
37-
return new ApiResponse(SUCCESS, noteRepo.findAllByServiceAndPinnedTrue(service));
38-
} else {
39-
return new ApiResponse(SUCCESS, noteRepo.findAllByService(service));
40-
}
33+
public ApiResponse getAllNotesByService(@ApiData FilteredPageRequest filteredPageRequest) {
34+
return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.getSpecification(), filteredPageRequest.getPageRequest()));
4135
}
4236

4337
@ApiMapping("/{id}")
@@ -71,7 +65,7 @@ public ApiResponse remove(@ApiValidatedModel Note note) {
7165
@ApiMapping("/page")
7266
@Auth(role = "ROLE_ANONYMOUS")
7367
public ApiResponse page(@ApiData FilteredPageRequest filteredPageRequest) {
74-
return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.toPageRequest()));
68+
return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.getPageRequest()));
7569
}
7670

7771
}

src/main/java/edu/tamu/app/model/repo/NoteRepo.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@
99
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
1010

1111
import edu.tamu.app.model.Note;
12-
import edu.tamu.app.model.Service;
1312
import edu.tamu.app.model.repo.custom.NoteRepoCustom;
1413

1514
public interface NoteRepo extends JpaRepository<Note, Long>, NoteRepoCustom, JpaSpecificationExecutor<Note> {
1615

1716
public Page<Note> findAll(Specification<Note> specification, Pageable pageable);
1817

18+
public List<Note> findAll(Specification<Note> specification);
19+
1920
public Page<Note> findAll(Pageable pageable);
2021

21-
public List<Note> findAllByService(Service service);
22+
public List<Note> findAllByServiceId(Long id);
2223

23-
public List<Note> findAllByServiceAndPinnedTrue(Service service);
24+
public List<Note> findAllByServiceIdAndPinnedTrue(Long id);
2425

2526
public void delete(Note note);
2627

src/main/java/edu/tamu/app/model/repo/impl/ServiceRepoImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Service update(Service service) {
4545

4646
@Override
4747
public void delete(Service service) {
48-
noteRepo.findAllByService(service).parallelStream().forEach(note -> {
48+
noteRepo.findAllByServiceId(service.getId()).parallelStream().forEach(note -> {
4949
noteRepo.delete(note);
5050
});
5151
serviceRepo.delete(service.getId());

src/main/java/edu/tamu/app/model/repo/specification/NoteSpecification.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
public class NoteSpecification<E> implements Specification<E> {
1515

16-
@SuppressWarnings("unused")
1716
private Map<String, String[]> filters;
1817

1918
public NoteSpecification(Map<String, String[]> filters) {
@@ -22,8 +21,32 @@ public NoteSpecification(Map<String, String[]> filters) {
2221

2322
@Override
2423
public Predicate toPredicate(Root<E> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
25-
List<Predicate> datePredicates = new ArrayList<Predicate>();
26-
return cb.and(datePredicates.toArray(new Predicate[datePredicates.size()]));
24+
25+
List<Predicate> pinnedPredicates = new ArrayList<Predicate>();
26+
List<Predicate> servicePredicates = new ArrayList<Predicate>();
27+
28+
for (Map.Entry<String, String[]> entry : filters.entrySet()) {
29+
String key = entry.getKey();
30+
String[] values = entry.getValue();
31+
32+
switch (key) {
33+
case "pinned":
34+
for (String value : values) {
35+
pinnedPredicates.add(cb.like(cb.lower(root.get(key).as(String.class)), "%" + value.toLowerCase() + "%"));
36+
}
37+
break;
38+
case "service":
39+
for (String value : values) {
40+
servicePredicates.add(cb.like(cb.lower(root.get(key).get("id").as(String.class)), "%" + value.toLowerCase() + "%"));
41+
}
42+
break;
43+
default:
44+
break;
45+
}
46+
47+
}
48+
49+
return cb.and(cb.and(pinnedPredicates.toArray(new Predicate[pinnedPredicates.size()])), cb.and(servicePredicates.toArray(new Predicate[servicePredicates.size()])));
2750
}
2851

2952
}

src/main/java/edu/tamu/app/model/request/FilteredPageRequest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
import org.springframework.data.domain.PageRequest;
77
import org.springframework.data.domain.Sort;
88

9+
import com.fasterxml.jackson.annotation.JsonIgnore;
10+
11+
import edu.tamu.app.model.Note;
12+
import edu.tamu.app.model.repo.specification.NoteSpecification;
13+
914
public class FilteredPageRequest {
1015

1116
private int pageNumber;
@@ -22,7 +27,13 @@ public FilteredPageRequest() {
2227

2328
}
2429

25-
public PageRequest toPageRequest() {
30+
@JsonIgnore
31+
public NoteSpecification<Note> getSpecification() {
32+
return new NoteSpecification<Note>(filters);
33+
}
34+
35+
@JsonIgnore
36+
public PageRequest getPageRequest() {
2637
return new PageRequest(pageNumber - 1, pageSize, new Sort(Sort.Direction.fromString(direction), properties));
2738
}
2839

0 commit comments

Comments
 (0)