532 setIntOrNull(i++, resolved?.id) |
532 setIntOrNull(i++, resolved?.id) |
533 } |
533 } |
534 return i |
534 return i |
535 } |
535 } |
536 |
536 |
|
537 override fun listIssues(project: Project): List<Issue> = |
|
538 withStatement("$issueQuery where i.project = ?") { |
|
539 setInt(1, project.id) |
|
540 queryAll { it.extractIssue() } |
|
541 } |
|
542 |
537 override fun listIssues(project: Project, version: Version?, component: Component?): List<Issue> = |
543 override fun listIssues(project: Project, version: Version?, component: Component?): List<Issue> = |
538 withStatement( |
544 withStatement( |
539 """$issueQuery where |
545 """$issueQuery where i.project = ? and |
540 (not ? or i.project = ?) and |
|
541 (not ? or ? in (resolved, affected)) and (not ? or (resolved is null and affected is null)) and |
546 (not ? or ? in (resolved, affected)) and (not ? or (resolved is null and affected is null)) and |
542 (not ? or component = ?) and (not ? or component is null) |
547 (not ? or component = ?) and (not ? or component is null) |
543 """.trimIndent() |
548 """.trimIndent() |
544 ) { |
549 ) { |
545 fun <T : Entity> applyFilter(search: T?, fflag: Int, nflag: Int, idcol: Int) { |
550 fun <T : Entity> applyFilter(search: T?, fflag: Int, nflag: Int, idcol: Int) { |
551 setBoolean(fflag, true) |
556 setBoolean(fflag, true) |
552 setBoolean(nflag, false) |
557 setBoolean(nflag, false) |
553 setInt(idcol, search.id) |
558 setInt(idcol, search.id) |
554 } |
559 } |
555 } |
560 } |
556 setBoolean(1, true) |
561 setInt(1, project.id) |
557 setInt(2, project.id) |
562 applyFilter(version, 2, 4, 3) |
558 applyFilter(version, 3, 5, 4) |
563 applyFilter(component, 5, 7, 6) |
559 applyFilter(component, 6, 8, 7) |
|
560 |
564 |
561 queryAll { it.extractIssue() } |
565 queryAll { it.extractIssue() } |
562 } |
566 } |
563 |
567 |
564 override fun findIssue(id: Int): Issue? = |
568 override fun findIssue(id: Int): Issue? = |
625 setInt(9, eventid) |
629 setInt(9, eventid) |
626 executeUpdate() |
630 executeUpdate() |
627 } |
631 } |
628 } |
632 } |
629 |
633 |
|
634 //</editor-fold> |
|
635 |
|
636 //<editor-fold desc="Issue Relations"> |
|
637 override fun insertIssueRelation(rel: IssueRelation) { |
|
638 withStatement( |
|
639 """ |
|
640 insert into lpit_issue_relation (from_issue, to_issue, type) |
|
641 values (?, ?, ?::relation_type) |
|
642 on conflict do nothing |
|
643 """.trimIndent() |
|
644 ) { |
|
645 if (rel.reverse) { |
|
646 setInt(2, rel.from.id) |
|
647 setInt(1, rel.to.id) |
|
648 } else { |
|
649 setInt(1, rel.from.id) |
|
650 setInt(2, rel.to.id) |
|
651 } |
|
652 setEnum(3, rel.type) |
|
653 executeUpdate() |
|
654 } |
|
655 } |
|
656 |
|
657 override fun deleteIssueRelation(rel: IssueRelation) { |
|
658 withStatement("delete from lpit_issue_relation where from_issue = ? and to_issue = ? and type=?::relation_type") { |
|
659 if (rel.reverse) { |
|
660 setInt(2, rel.from.id) |
|
661 setInt(1, rel.to.id) |
|
662 } else { |
|
663 setInt(1, rel.from.id) |
|
664 setInt(2, rel.to.id) |
|
665 } |
|
666 setEnum(3, rel.type) |
|
667 executeUpdate() |
|
668 } |
|
669 } |
|
670 |
|
671 override fun listIssueRelations(issue: Issue): List<IssueRelation> = buildList { |
|
672 withStatement("select to_issue, type from lpit_issue_relation where from_issue = ?") { |
|
673 setInt(1, issue.id) |
|
674 queryAll { IssueRelation(issue, findIssue(it.getInt("to_issue"))!!, it.getEnum("type"), false) } |
|
675 }.forEach(this::add) |
|
676 withStatement("select from_issue, type from lpit_issue_relation where to_issue = ?") { |
|
677 setInt(1, issue.id) |
|
678 queryAll { IssueRelation(issue, findIssue(it.getInt("from_issue"))!!, it.getEnum("type"), true) } |
|
679 }.forEach(this::add) |
|
680 } |
630 //</editor-fold> |
681 //</editor-fold> |
631 |
682 |
632 //<editor-fold desc="IssueComment"> |
683 //<editor-fold desc="IssueComment"> |
633 |
684 |
634 private fun ResultSet.extractIssueComment() = |
685 private fun ResultSet.extractIssueComment() = |