diff --git a/src/main/resources/update/1_4.sql b/src/main/resources/update/1_4.sql index a68ca43..2d3c492 100644 --- a/src/main/resources/update/1_4.sql +++ b/src/main/resources/update/1_4.sql @@ -8,3 +8,17 @@ ALTER TABLE GROUP_MEMBER ADD CONSTRAINT IDX_GROUP_MEMBER_FK1 FOREIGN KEY (USER_NAME) REFERENCES ACCOUNT (USER_NAME); ALTER TABLE ACCOUNT ADD COLUMN GROUP_ACCOUNT BOOLEAN NOT NULL DEFAULT FALSE; + +CREATE OR REPLACE VIEW ISSUE_OUTLINE_VIEW AS + SELECT + A.USER_NAME, + A.REPOSITORY_NAME, + A.ISSUE_ID, + NVL(B.COMMENT_COUNT, 0) AS COMMENT_COUNT + FROM ISSUE A + LEFT OUTER JOIN ( + SELECT USER_NAME, REPOSITORY_NAME, ISSUE_ID, COUNT(COMMENT_ID) AS COMMENT_COUNT FROM ISSUE_COMMENT + WHERE ACTION IN ('comment', 'close_comment', 'reopen_comment') + GROUP BY USER_NAME, REPOSITORY_NAME, ISSUE_ID + ) B + ON (A.USER_NAME = B.USER_NAME AND A.REPOSITORY_NAME = B.REPOSITORY_NAME AND A.ISSUE_ID = B.ISSUE_ID); diff --git a/src/main/scala/model/Issue.scala b/src/main/scala/model/Issue.scala index d134b8e..769b059 100644 --- a/src/main/scala/model/Issue.scala +++ b/src/main/scala/model/Issue.scala @@ -7,6 +7,11 @@ def byPrimaryKey(owner: String, repository: String) = byRepository(owner, repository) } +object IssueOutline extends Table[(String, String, Int, Int)]("ISSUE_OUTLINE_VIEW") with IssueTemplate { + def commentCount = column[Int]("COMMENT_COUNT") + def * = userName ~ repositoryName ~ issueId ~ commentCount +} + object Issues extends Table[Issue]("ISSUE") with IssueTemplate with MilestoneTemplate { def openedUserName = column[String]("OPENED_USER_NAME") def assignedUserName = column[String]("ASSIGNED_USER_NAME") diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 25eae21..01a8cba 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -99,47 +99,38 @@ def searchIssue(owner: String, repository: String, condition: IssueSearchCondition, filter: String, userName: Option[String], offset: Int, limit: Int): List[(Issue, List[Label], Int)] = { - // get issues and comment count - val issues = searchIssueQuery(owner, repository, condition, filter, userName) - .leftJoin(Query(IssueComments) - .filter { t => - (t.byRepository(owner, repository)) && - (t.action inSetBind Seq("comment", "close_comment", "reopen_comment")) + // get issues and comment count and labels + searchIssueQuery(owner, repository, condition, filter, userName) + .innerJoin(IssueOutline).on { (t1, t2) => t1.byIssue(t2.userName, t2.repositoryName, t2.issueId) } + .leftJoin (IssueLabels) .on { case ((t1, t2), t3) => t1.byIssue(t3.userName, t3.repositoryName, t3.issueId) } + .leftJoin (Labels) .on { case (((t1, t2), t3), t4) => t3.byLabel(t4.userName, t4.repositoryName, t4.labelId) } + .map { case (((t1, t2), t3), t4) => + (t1, t2.commentCount, t4.labelId.?, t4.labelName.?, t4.color.?) } - .groupBy { _.issueId } - .map { case (issueId, t) => issueId ~ t.length }).on((t1, t2) => t1.issueId is t2._1) - .sortBy { case (t1, t2) => - (condition.sort match { - case "created" => t1.registeredDate - case "comments" => t2._2 - case "updated" => t1.updatedDate - }) match { - case sort => condition.direction match { - case "asc" => sort asc - case "desc" => sort desc + .sortBy(_._4) // labelName + .sortBy { case (t1, commentCount, _,_,_) => + (condition.sort match { + case "created" => t1.registeredDate + case "comments" => commentCount + case "updated" => t1.updatedDate + }) match { + case sort => condition.direction match { + case "asc" => sort asc + case "desc" => sort desc + } } } - } - .map { case (t1, t2) => (t1, t2._2.ifNull(0)) } - .drop(offset).take(limit) - .list - - // get labels - val labels = Query(IssueLabels) - .innerJoin(Labels).on { (t1, t2) => - t1.byLabel(t2.userName, t2.repositoryName, t2.labelId) - } - .filter { case (t1, t2) => - (t1.byRepository(owner, repository)) && - (t1.issueId inSetBind (issues.map(_._1.issueId))) - } - .sortBy { case (t1, t2) => t1.issueId ~ t2.labelName } - .map { case (t1, t2) => (t1.issueId, t2) } - .list - - issues.map { case (issue, commentCount) => - (issue, labels.collect { case (issueId, labels) if(issueId == issue.issueId) => labels }, commentCount) - } + .drop(offset).take(limit) + .list + .splitWith(_._1.issueId == _._1.issueId) + .map { issues => issues.head match { + case (issue, commentCount, _,_,_) => + (issue, + issues.flatMap { t => t._3.map ( + Label(issue.userName, issue.repositoryName, _, t._4.get, t._5.get) + )} toList, + commentCount) + }} toList } /**