Fri, 09 Oct 2020 15:35:48 +0200
adds application level issue sorting (fixes #19)
1.1 --- a/src/main/java/de/uapcore/lightpit/dao/postgres/PGIssueDao.java Fri Oct 09 11:57:05 2020 +0200 1.2 +++ b/src/main/java/de/uapcore/lightpit/dao/postgres/PGIssueDao.java Fri Oct 09 15:35:48 2020 +0200 1.3 @@ -56,8 +56,7 @@ 1.4 "from lpit_issue i " + 1.5 "join lpit_project p on project = projectid " + 1.6 "left join lpit_user on userid = assignee " + 1.7 - "where project = ? "+ 1.8 - "order by eta asc, updated desc"); 1.9 + "where project = ? "); 1.10 1.11 listForVersion = connection.prepareStatement( 1.12 "with issue_version as ( "+ 1.13 @@ -70,8 +69,7 @@ 1.14 "join lpit_project p on project = projectid " + 1.15 "left join issue_version using (issueid) "+ 1.16 "left join lpit_user on userid = assignee " + 1.17 - "where coalesce(versionid,-1) = ? "+ 1.18 - "order by eta asc, updated desc" 1.19 + "where coalesce(versionid,-1) = ? " 1.20 ); 1.21 1.22 find = connection.prepareStatement(
2.1 --- a/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 09 11:57:05 2020 +0200 2.2 +++ b/src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java Fri Oct 09 15:35:48 2020 +0200 2.3 @@ -33,6 +33,7 @@ 2.4 import de.uapcore.lightpit.dao.DataAccessObjects; 2.5 import de.uapcore.lightpit.entities.*; 2.6 import de.uapcore.lightpit.viewmodel.*; 2.7 +import de.uapcore.lightpit.viewmodel.util.IssueSorter; 2.8 import org.slf4j.Logger; 2.9 import org.slf4j.LoggerFactory; 2.10 2.11 @@ -197,6 +198,11 @@ 2.12 final var detailView = viewModel.getProjectDetails(); 2.13 final var issues = issueDao.list(version); 2.14 for (var issue : issues) issueDao.joinVersionInformation(issue); 2.15 + issues.sort(new IssueSorter( 2.16 + new IssueSorter.Criteria(IssueSorter.Field.PHASE, true), 2.17 + new IssueSorter.Criteria(IssueSorter.Field.ETA, true), 2.18 + new IssueSorter.Criteria(IssueSorter.Field.UPDATED, false) 2.19 + )); 2.20 detailView.updateDetails(issues, version); 2.21 2.22 return forwardView(req, viewModel, "project-details");
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/src/main/java/de/uapcore/lightpit/viewmodel/util/IssueSorter.java Fri Oct 09 15:35:48 2020 +0200 3.3 @@ -0,0 +1,78 @@ 3.4 +package de.uapcore.lightpit.viewmodel.util; 3.5 + 3.6 +import de.uapcore.lightpit.entities.Issue; 3.7 +import de.uapcore.lightpit.entities.IssueStatus; 3.8 + 3.9 +import java.util.Arrays; 3.10 +import java.util.Comparator; 3.11 + 3.12 +public class IssueSorter implements Comparator<Issue> { 3.13 + 3.14 + public enum Field { 3.15 + PHASE, ETA, UPDATED 3.16 + } 3.17 + 3.18 + public static class Criteria { 3.19 + private Field field; 3.20 + private boolean asc; 3.21 + 3.22 + public Criteria(Field field, boolean asc) { 3.23 + this.field = field; 3.24 + this.asc = asc; 3.25 + } 3.26 + 3.27 + @Override 3.28 + public boolean equals(Object obj) { 3.29 + if (obj == null || !obj.getClass().equals(Criteria.class)) 3.30 + return false; 3.31 + final var other = (Criteria)obj; 3.32 + return other.field.equals(field) && other.asc == asc; 3.33 + } 3.34 + } 3.35 + 3.36 + private final Criteria[] criteria; 3.37 + 3.38 + public IssueSorter(Criteria ... criteria) { 3.39 + this.criteria = criteria; 3.40 + } 3.41 + 3.42 + private int compare(Issue left, Issue right, Criteria criteria) { 3.43 + int result; 3.44 + switch (criteria.field) { 3.45 + case PHASE: 3.46 + result = Boolean.compare( 3.47 + left.getPhase() == IssueStatus.PHASE_DONE, 3.48 + right.getPhase() == IssueStatus.PHASE_DONE); 3.49 + break; 3.50 + case ETA: 3.51 + if (left.getEta() != null && right.getEta() != null) 3.52 + result = left.getEta().compareTo(right.getEta()); 3.53 + else 3.54 + result = left != null ? -1 : 1; 3.55 + break; 3.56 + case UPDATED: 3.57 + result = left.getUpdated().compareTo(right.getUpdated()); 3.58 + break; 3.59 + default: 3.60 + throw new UnsupportedOperationException(); 3.61 + } 3.62 + return criteria.asc ? result : -result; 3.63 + } 3.64 + 3.65 + @Override 3.66 + public int compare(Issue left, Issue right) { 3.67 + for (var c : criteria) { 3.68 + int r = compare(left, right, c); 3.69 + if (r != 0) return r; 3.70 + } 3.71 + return 0; 3.72 + } 3.73 + 3.74 + @Override 3.75 + public boolean equals(Object o) { 3.76 + if (o == null || !o.getClass().equals(IssueSorter.class)) 3.77 + return false; 3.78 + final var other = (IssueSorter) o; 3.79 + return Arrays.equals(criteria, other.criteria); 3.80 + } 3.81 +}