Skip to content

Commit

Permalink
#110 Improve read performance of Employeeorder objects in chicoree by…
Browse files Browse the repository at this point in the history
… moving filtering to database
  • Loading branch information
KlausRicharz committed May 16, 2022
1 parent 45b9bad commit 6239a19
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import static org.tb.common.util.DateUtils.validateDate;

import java.util.stream.Collectors;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -31,10 +31,10 @@ protected ActionForward executeAuthenticated(ActionMapping mapping, TimereportFo
}
var employeecontractId = chicoreeSessionStore.getLoginEmployeecontractId().orElseThrow();
var date = form.getDateTyped();
var employeeorders = employeeorderDAO.getEmployeeOrdersByEmployeeContractId(employeecontractId)
.stream()
.filter(employeeorder -> employeeorder.isValidAt(date))
.collect(Collectors.toList());
var employeeorders = employeeorderDAO.getEmployeeordersByEmployeeContractIdAndCustomerorderIdValidAt(
employeecontractId,
date,
form.getOrderId() != null ? Optional.of(form.getOrderIdTyped()) : Optional.empty());
chicoreeSessionStore.setEmployeeorders(employeeorders);
if(form.getOrderId() != null && !form.getOrderId().isBlank()) {
chicoreeSessionStore.setCustomerorder(form.getOrderIdTyped(), employeeorders);
Expand Down
29 changes: 24 additions & 5 deletions src/main/java/org/tb/order/persistence/EmployeeorderDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
Expand Down Expand Up @@ -170,13 +171,12 @@ public List<Employeeorder> getEmployeeordersByOrderIdAndEmployeeContractId(long
.collect(Collectors.toList());
}

private Specification<Employeeorder> showOnlyValid() {
LocalDate now = DateUtils.today();
private Specification<Employeeorder> showOnlyValid(LocalDate date) {
return (root, query, builder) -> {
var fromDateLess = builder.lessThanOrEqualTo(root.get(Employeeorder_.fromDate), now);
var fromDateLess = builder.lessThanOrEqualTo(root.get(Employeeorder_.fromDate), date);
var untilDateNullOrGreater = builder.or(
builder.isNull(root.get(Employeeorder_.untilDate)),
builder.greaterThanOrEqualTo(root.get(Employeeorder_.untilDate), now)
builder.greaterThanOrEqualTo(root.get(Employeeorder_.untilDate), date)
);
return builder.and(fromDateLess, untilDateNullOrGreater);
};
Expand Down Expand Up @@ -227,7 +227,7 @@ public List<Employeeorder> getEmployeeordersByFilters(Boolean showInvalid, Strin
return employeeorderRepository.findAll((Specification<Employeeorder>) (root, query, builder) -> {
Set<Predicate> predicates = new HashSet<>();
if(!TRUE.equals(showInvalid)) {
predicates.add(showOnlyValid().toPredicate(root, query, builder));
predicates.add(showOnlyValid(DateUtils.today()).toPredicate(root, query, builder));
}
if(employeeContractId != null && employeeContractId > 0) {
predicates.add(matchingEmployeecontractId(employeeContractId).toPredicate(root, query, builder));
Expand Down Expand Up @@ -260,6 +260,24 @@ public List<Employeeorder> getEmployeeordersByFilters(Boolean showInvalid, Strin
return getEmployeeordersByFilters(showInvalid, filter, employeeContractId, customerOrderId, null);
}

public List<Employeeorder> getEmployeeordersByEmployeeContractIdAndCustomerorderIdValidAt(long employeeContractId,
LocalDate date, Optional<Long> customerOrderId) {
return employeeorderRepository.findAll((Specification<Employeeorder>) (root, query, builder) -> {
Set<Predicate> predicates = new HashSet<>();
predicates.add(showOnlyValid(date).toPredicate(root, query, builder));
predicates.add(matchingEmployeecontractId(employeeContractId).toPredicate(root, query, builder));
customerOrderId.ifPresent(id -> {
predicates.add(matchingCustomerorderId(id).toPredicate(root, query, builder));
});
return builder.and(predicates.toArray(new Predicate[0]));
}).stream()
.sorted(comparing((Employeeorder e) -> e.getEmployeecontract().getEmployee().getSign())
.thenComparing((Employeeorder e) -> e.getSuborder().getCustomerorder().getSign())
.thenComparing((Employeeorder e) -> e.getSuborder().getSign())
.thenComparing(Employeeorder::getFromDate))
.collect(Collectors.toList());
}

public void save(Employeeorder eo) {
employeeorderRepository.save(eo);
}
Expand All @@ -280,4 +298,5 @@ public boolean deleteEmployeeorderById(long eoId) {
}
return deleteOk;
}

}

0 comments on commit 6239a19

Please sign in to comment.