Skip to content

Commit f044fcc

Browse files
Adds review changes
1 parent ee1712c commit f044fcc

File tree

4 files changed

+33
-42
lines changed

4 files changed

+33
-42
lines changed

spring-boot/specification/src/main/java/io/reflectoring/specification/repository/CustomProductRepository.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import org.springframework.data.jpa.domain.Specification;
66
import org.springframework.stereotype.Component;
77

8-
import javax.persistence.criteria.*;
9-
import java.lang.reflect.Type;
108
import java.util.ArrayList;
119
import java.util.List;
1210

@@ -34,41 +32,38 @@ public List<Product> getPremiumProducts(String name, List<Category> categories)
3432
.and(isPremium()));
3533
}
3634

37-
public List<Product> getQueryResult(List<QueryInput> queryInputs){
38-
if(queryInputs.size()>0) {
39-
return productRepository.findAll(getSpecificationFromQuery(queryInputs));
35+
36+
public List<Product> getQueryResult(List<Filter> filters){
37+
if(filters.size()>0) {
38+
return productRepository.findAll(getSpecificationFromFilters(filters));
4039
}else {
4140
return productRepository.findAll();
4241
}
4342
}
4443

45-
private Specification<Product> getSpecificationFromQuery(List<QueryInput> queryInput) {
46-
Specification<Product> specification = where(createSpecification(queryInput.remove(0)));
47-
for (QueryInput input : queryInput) {
48-
if(input.isOptional()){
49-
specification = specification.or(createSpecification(input));
50-
}else {
51-
specification = specification.and(createSpecification(input));
52-
}
44+
private Specification<Product> getSpecificationFromFilters(List<Filter> filter) {
45+
Specification<Product> specification = where(createSpecification(filter.remove(0)));
46+
for (Filter input : filter) {
47+
specification = specification.and(createSpecification(input));
5348
}
5449
return specification;
5550
}
5651

57-
private Specification<Product> createSpecification(QueryInput input) {
52+
private Specification<Product> createSpecification(Filter input) {
5853
switch (input.getOperator()){
59-
case EQ:
54+
case EQUALS:
6055
return (root, query, criteriaBuilder) ->
6156
criteriaBuilder.equal(root.get(input.getField()),
6257
castToRequiredType(root.get(input.getField()).getJavaType(), input.getValue()));
6358
case NOT_EQ:
6459
return (root, query, criteriaBuilder) ->
6560
criteriaBuilder.notEqual(root.get(input.getField()),
6661
castToRequiredType(root.get(input.getField()).getJavaType(), input.getValue()));
67-
case GT:
62+
case GREATER_THAN:
6863
return (root, query, criteriaBuilder) ->
6964
criteriaBuilder.gt(root.get(input.getField()),
7065
(Number) castToRequiredType(root.get(input.getField()).getJavaType(), input.getValue()));
71-
case LT:
66+
case LESS_THAN:
7267
return (root, query, criteriaBuilder) ->
7368
criteriaBuilder.lt(root.get(input.getField()),
7469
(Number) castToRequiredType(root.get(input.getField()).getJavaType(), input.getValue()));
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99
@Getter
1010
@Setter
1111
@Builder
12-
public class QueryInput {
12+
public class Filter {
1313
private String field;
1414
private QueryOperator operator;
1515
private String value;
1616
private List<String> values;//Used in case of IN operator
17-
private boolean isOptional;
1817
}

spring-boot/specification/src/main/java/io/reflectoring/specification/repository/QueryOperator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package io.reflectoring.specification.repository;
22

33
public enum QueryOperator {
4-
GT,
5-
LT,
6-
EQ,
4+
GREATER_THAN,
5+
LESS_THAN,
6+
EQUALS,
77
LIKE,
88
NOT_EQ,
99
IN

spring-boot/specification/src/test/java/io/reflectoring/specification/repository/CustomProductRepositoryTest.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,46 +37,43 @@ void testGetPremiumProducts() {
3737

3838
@Test
3939
void testDynamicSpecification() {
40-
QueryInput nameLike = QueryInput.builder()
40+
Filter nameLike = Filter.builder()
4141
.field("name")
4242
.operator(QueryOperator.LIKE)
4343
.value("jacket")
44-
.isOptional(false)
4544
.build();
46-
QueryInput categories = QueryInput.builder()
45+
Filter categories = Filter.builder()
4746
.field("category")
4847
.operator(QueryOperator.IN)
4948
.values(List.of(Category.MEN_FASHION.name(), Category.WOMEN_FASHION.name()))
50-
.isOptional(false)
5149
.build();
52-
List<QueryInput> queries = new ArrayList<>();
53-
queries.add(nameLike);
54-
queries.add(categories);
55-
List<Product> products = productAdapter.getQueryResult(queries);
50+
List<Filter> filters = new ArrayList<>();
51+
filters.add(nameLike);
52+
filters.add(categories);
53+
List<Product> products = productAdapter.getQueryResult(filters);
5654
assertEquals(2, products.size());
5755

58-
QueryInput lowRange = QueryInput.builder()
56+
Filter lowRange = Filter.builder()
5957
.field("price")
60-
.operator(QueryOperator.LT)
58+
.operator(QueryOperator.LESS_THAN)
6159
.value("1000")
62-
.isOptional(false)
6360
.build();
6461
categories.setValues(List.of(Category.MOBILE.name(), Category.TV_APPLIANCES.name()));
65-
queries = new ArrayList<>();
66-
queries.add(lowRange);
67-
queries.add(categories);
62+
filters = new ArrayList<>();
63+
filters.add(lowRange);
64+
filters.add(categories);
6865

69-
products = productAdapter.getQueryResult(queries);
66+
products = productAdapter.getQueryResult(filters);
7067
assertEquals(2, products.size());
7168

72-
QueryInput priceEquals = QueryInput.builder()
69+
Filter priceEquals = Filter.builder()
7370
.field("price")
74-
.operator(QueryOperator.EQ)
71+
.operator(QueryOperator.EQUALS)
7572
.value("1100")
7673
.build();
77-
queries = new ArrayList<>();
78-
queries.add(priceEquals);
79-
products = productAdapter.getQueryResult(queries);
74+
filters = new ArrayList<>();
75+
filters.add(priceEquals);
76+
products = productAdapter.getQueryResult(filters);
8077
assertEquals(1, products.size());
8178
}
8279
}

0 commit comments

Comments
 (0)