25 |
25 |
26 package de.uapcore.lightpit.dao |
26 package de.uapcore.lightpit.dao |
27 |
27 |
28 import de.uapcore.lightpit.entities.* |
28 import de.uapcore.lightpit.entities.* |
29 import de.uapcore.lightpit.types.IssueHistoryType |
29 import de.uapcore.lightpit.types.IssueHistoryType |
|
30 import de.uapcore.lightpit.types.RelationType |
30 import de.uapcore.lightpit.types.WebColor |
31 import de.uapcore.lightpit.types.WebColor |
31 import de.uapcore.lightpit.viewmodel.ComponentSummary |
32 import de.uapcore.lightpit.viewmodel.ComponentSummary |
32 import de.uapcore.lightpit.viewmodel.IssueSummary |
33 import de.uapcore.lightpit.viewmodel.IssueSummary |
33 import de.uapcore.lightpit.viewmodel.VersionSummary |
34 import de.uapcore.lightpit.viewmodel.VersionSummary |
34 import org.intellij.lang.annotations.Language |
35 import org.intellij.lang.annotations.Language |
478 private val issueQuery = |
479 private val issueQuery = |
479 """ |
480 """ |
480 select issueid, |
481 select issueid, |
481 i.project, p.name as projectname, p.node as projectnode, |
482 i.project, p.name as projectname, p.node as projectnode, |
482 component, c.name as componentname, c.node as componentnode, |
483 component, c.name as componentname, c.node as componentnode, |
483 status, category, subject, i.description, |
484 status, phase, category, subject, i.description, |
484 userid, username, givenname, lastname, mail, |
485 userid, username, givenname, lastname, mail, |
485 created, updated, eta, affected, resolved |
486 created, updated, eta, affected, resolved |
486 from lpit_issue i |
487 from lpit_issue i |
487 join lpit_project p on i.project = projectid |
488 join lpit_project p on i.project = projectid |
|
489 join lpit_issue_phases using (status) |
488 left join lpit_component c on component = c.id |
490 left join lpit_component c on component = c.id |
489 left join lpit_user on userid = assignee |
491 left join lpit_user on userid = assignee |
490 """.trimIndent() |
492 """.trimIndent() |
491 |
493 |
492 private fun ResultSet.extractIssue(): Issue { |
494 private fun ResultSet.extractIssue(): Issue { |
532 setIntOrNull(i++, resolved?.id) |
534 setIntOrNull(i++, resolved?.id) |
533 } |
535 } |
534 return i |
536 return i |
535 } |
537 } |
536 |
538 |
537 override fun listIssues(project: Project): List<Issue> = |
539 override fun listIssues(project: Project, includeDone: Boolean): List<Issue> = |
538 withStatement("$issueQuery where i.project = ?") { |
540 withStatement("$issueQuery where i.project = ? and (? or phase < 2)") { |
539 setInt(1, project.id) |
541 setInt(1, project.id) |
|
542 setBoolean(2, includeDone) |
540 queryAll { it.extractIssue() } |
543 queryAll { it.extractIssue() } |
541 } |
544 } |
542 |
545 |
543 override fun listIssues(project: Project, version: Version?, component: Component?): List<Issue> = |
546 override fun listIssues(project: Project, includeDone: Boolean, version: Version?, component: Component?): List<Issue> = |
544 withStatement( |
547 withStatement( |
545 """$issueQuery where i.project = ? and |
548 """$issueQuery where i.project = ? and |
|
549 (? or phase < 2) and |
546 (not ? or ? in (resolved, affected)) and (not ? or (resolved is null and affected is null)) and |
550 (not ? or ? in (resolved, affected)) and (not ? or (resolved is null and affected is null)) and |
547 (not ? or component = ?) and (not ? or component is null) |
551 (not ? or component = ?) and (not ? or component is null) |
548 """.trimIndent() |
552 """.trimIndent() |
549 ) { |
553 ) { |
550 fun <T : Entity> applyFilter(search: T?, fflag: Int, nflag: Int, idcol: Int) { |
554 fun <T : Entity> applyFilter(search: T?, fflag: Int, nflag: Int, idcol: Int) { |
557 setBoolean(nflag, false) |
561 setBoolean(nflag, false) |
558 setInt(idcol, search.id) |
562 setInt(idcol, search.id) |
559 } |
563 } |
560 } |
564 } |
561 setInt(1, project.id) |
565 setInt(1, project.id) |
562 applyFilter(version, 2, 4, 3) |
566 setBoolean(2, includeDone) |
563 applyFilter(component, 5, 7, 6) |
567 applyFilter(version, 3, 5, 4) |
|
568 applyFilter(component, 6, 8, 7) |
564 |
569 |
565 queryAll { it.extractIssue() } |
570 queryAll { it.extractIssue() } |
566 } |
571 } |
567 |
572 |
568 override fun findIssue(id: Int): Issue? = |
573 override fun findIssue(id: Int): Issue? = |
676 withStatement("select from_issue, type from lpit_issue_relation where to_issue = ?") { |
681 withStatement("select from_issue, type from lpit_issue_relation where to_issue = ?") { |
677 setInt(1, issue.id) |
682 setInt(1, issue.id) |
678 queryAll { IssueRelation(issue, findIssue(it.getInt("from_issue"))!!, it.getEnum("type"), true) } |
683 queryAll { IssueRelation(issue, findIssue(it.getInt("from_issue"))!!, it.getEnum("type"), true) } |
679 }.forEach(this::add) |
684 }.forEach(this::add) |
680 } |
685 } |
|
686 |
|
687 override fun getIssueRelationMap(project: Project, includeDone: Boolean): IssueRelationMap = |
|
688 withStatement( |
|
689 """ |
|
690 select r.from_issue, r.to_issue, r.type |
|
691 from lpit_issue_relation r |
|
692 join lpit_issue i on i.issueid = r.from_issue |
|
693 join lpit_issue_phases p on i.status = p.status |
|
694 where i.project = ? and (? or p.phase < 2) |
|
695 """.trimIndent() |
|
696 ) { |
|
697 setInt(1, project.id) |
|
698 setBoolean(2, includeDone) |
|
699 queryAll { Pair(it.getInt("from_issue"), Pair(it.getInt("to_issue"), it.getEnum<RelationType>("type"))) } |
|
700 }.groupBy({it.first},{it.second}) |
681 //</editor-fold> |
701 //</editor-fold> |
682 |
702 |
683 //<editor-fold desc="IssueComment"> |
703 //<editor-fold desc="IssueComment"> |
684 |
704 |
685 private fun ResultSet.extractIssueComment() = |
705 private fun ResultSet.extractIssueComment() = |