diff -r 61669abf277f -r e8eecee6aadf src/main/kotlin/de/uapcore/lightpit/util/Issues.kt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/kotlin/de/uapcore/lightpit/util/Issues.kt Fri Apr 02 11:59:14 2021 +0200 @@ -0,0 +1,71 @@ +/* + * Copyright 2021 Mike Becker. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package de.uapcore.lightpit.util + +import de.uapcore.lightpit.entities.Component +import de.uapcore.lightpit.entities.Issue +import de.uapcore.lightpit.entities.Project +import de.uapcore.lightpit.entities.Version +import de.uapcore.lightpit.types.IssueStatusPhase + +data class IssueFilter( + val project: Filter = AllFilter(), + val version: Filter = AllFilter(), + val component: Filter = AllFilter() +) + +data class IssueSorter(val criteria: List) : Comparator { + enum class Field { + DONE, ETA, UPDATED + } + + data class Criteria(val field: Field, val asc: Boolean) + + override fun compare(left: Issue, right: Issue): Int { + if (left == right) { + return 0; + } + for (c in criteria) { + val result = when (c.field) { + Field.DONE -> (left.status.phase == IssueStatusPhase.Done).compareTo(right.status.phase == IssueStatusPhase.Done) + Field.ETA -> { + val l = left.eta + val r = right.eta + if (l == null && r == null) 0 + else if (l == null) 1 + else if (r == null) -1 + else l.compareTo(r) + } + Field.UPDATED -> left.updated.compareTo(right.updated) + } + if (result != 0) { + return if (c.asc) result else -result + } + } + return 0 + } +} +