adds application level issue sorting (fixes #19)

Fri, 09 Oct 2020 15:35:48 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 09 Oct 2020 15:35:48 +0200
changeset 121
428dca747d6b
parent 120
5d4c12338fe0
child 122
b2edd3d14135

adds application level issue sorting (fixes #19)

src/main/java/de/uapcore/lightpit/dao/postgres/PGIssueDao.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/modules/ProjectsModule.java file | annotate | diff | comparison | revisions
src/main/java/de/uapcore/lightpit/viewmodel/util/IssueSorter.java file | annotate | diff | comparison | revisions
     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 +}

mercurial