Skip to content

Commit a5d756c

Browse files
Adds the ability to select the operator to combine the advanced search fields.
There's a huge UX flaw here: try to use min and max delivery fee with the operator OR. Makes sense, but confuses the user. Agree?
1 parent b7fb971 commit a5d756c

3 files changed

Lines changed: 16 additions & 6 deletions

File tree

src/main/java/dev/drugowick/jpaqueriesblogpost/infrastructure/repository/CustomRestaurantRepositoryImpl.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,35 @@ public List<Restaurant> advancedSearch(AdvancedSearch advancedSearch) {
2929
jpql.append("from Restaurant where 1=1 ");
3030

3131
var parameters = new HashMap<String, Object>();
32+
var logicalOperator = advancedSearch.getLogicalOperator().equals("AND") ? "AND" : "OR";
3233

3334
if (StringUtils.hasLength(advancedSearch.getName())) {
34-
jpql.append("and name like :name ");
35+
jpql.append(logicalOperator + " name like :name ");
3536
parameters.put("name", "%" + advancedSearch.getName() + "%");
3637
}
3738

3839
if (StringUtils.hasLength(advancedSearch.getAddress())) {
39-
jpql.append("and address like :address ");
40+
jpql.append(logicalOperator + " address like :address ");
4041
parameters.put("address", "%" + advancedSearch.getAddress() + "%");
4142
}
4243

4344
if (advancedSearch.getMinDeliveryFee() != null) {
44-
jpql.append("and deliveryFee >= :startFee ");
45+
jpql.append(logicalOperator + " deliveryFee >= :startFee ");
4546
parameters.put("startFee", advancedSearch.getMinDeliveryFee());
4647
}
4748

4849
if (advancedSearch.getMaxDeliveryFee() != null) {
49-
jpql.append("and deliveryFee <= :endingFee ");
50+
jpql.append(logicalOperator + " deliveryFee <= :endingFee ");
5051
parameters.put("endingFee", advancedSearch.getMaxDeliveryFee());
5152
}
5253

5354
if (StringUtils.hasLength(advancedSearch.getCuisine())) {
54-
jpql.append("and cuisine.name like :cuisine ");
55+
jpql.append(logicalOperator + " cuisine.name like :cuisine ");
5556
parameters.put("cuisine", "%" + advancedSearch.getCuisine() + "%");
5657
}
5758

5859
if (StringUtils.hasLength(advancedSearch.getCity())) {
59-
jpql.append("and city like :city ");
60+
jpql.append(logicalOperator + " city like :city ");
6061
parameters.put("city", "%" + advancedSearch.getCity() + "%");
6162
}
6263

src/main/java/dev/drugowick/jpaqueriesblogpost/web/pages/dto/AdvancedSearch.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ public class AdvancedSearch {
1616
private String city;
1717
private String grabngo;
1818
private String active;
19+
20+
private String logicalOperator = "AND";
1921
}

src/main/resources/templates/advancedSearch.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ <h4>Filter Restaurants</h4>
7070
</select>
7171
</div>
7272
-->
73+
<div class="form-group row">
74+
<label class="col col-sm-4" for="logicalOperator">Logical Operator</label>
75+
<select class="form-control col-sm-8" id="logicalOperator" name="logicalOperator">
76+
<option th:selected="${search.getLogicalOperator() == 'AND'}" value="AND">AND</option>
77+
<option th:selected="${search.getLogicalOperator()} == 'OR'" value="OR">OR</option>
78+
</select>
79+
</div>
7380
<div class="form-group row">
7481
<div class="col col-sm-4"></div>
7582
<input class="btn btn-primary col col-sm-8" type="submit" value="Submit">

0 commit comments

Comments
 (0)