mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-08 14:35:52 +01:00
Replace native SQL which contains group by clause with type safe DSL.
This commit is contained in:
@@ -2,8 +2,6 @@ package service
|
|||||||
|
|
||||||
import scala.slick.driver.H2Driver.simple._
|
import scala.slick.driver.H2Driver.simple._
|
||||||
import Database.threadLocalSession
|
import Database.threadLocalSession
|
||||||
import scala.slick.jdbc.{StaticQuery => Q}
|
|
||||||
import Q.interpolation
|
|
||||||
|
|
||||||
import model._
|
import model._
|
||||||
import Milestones._
|
import Milestones._
|
||||||
@@ -16,8 +14,14 @@ trait MilestonesService {
|
|||||||
|
|
||||||
def updateMilestone(milestone: Milestone): Unit =
|
def updateMilestone(milestone: Milestone): Unit =
|
||||||
Query(Milestones)
|
Query(Milestones)
|
||||||
.filter { m => (m.userName is milestone.userName.bind) && (m.repositoryName is milestone.repositoryName.bind) && (m.milestoneId is milestone.milestoneId.bind)}
|
.filter { m =>
|
||||||
.map { m => m.title ~ m.description.? ~ m.dueDate.? ~ m.closedDate.? }
|
(m.userName is milestone.userName.bind) &&
|
||||||
|
(m.repositoryName is milestone.repositoryName.bind) &&
|
||||||
|
(m.milestoneId is milestone.milestoneId.bind)
|
||||||
|
}
|
||||||
|
.map { m =>
|
||||||
|
m.title ~ m.description.? ~ m.dueDate.? ~ m.closedDate.?
|
||||||
|
}
|
||||||
.update (
|
.update (
|
||||||
milestone.title,
|
milestone.title,
|
||||||
milestone.description,
|
milestone.description,
|
||||||
@@ -30,35 +34,57 @@ trait MilestonesService {
|
|||||||
|
|
||||||
def deleteMilestone(owner: String, repository: String, milestoneId: Int): Unit = {
|
def deleteMilestone(owner: String, repository: String, milestoneId: Int): Unit = {
|
||||||
Query(Issues)
|
Query(Issues)
|
||||||
.filter { i => (i.userName is owner.bind) && (i.repositoryName is repository.bind) && (i.milestoneId is milestoneId.bind)}
|
.filter { t =>
|
||||||
.map { i => i.milestoneId.? }
|
(t.userName is owner.bind) &&
|
||||||
|
(t.repositoryName is repository.bind) &&
|
||||||
|
(t.milestoneId is milestoneId.bind)
|
||||||
|
}
|
||||||
|
.map(_.milestoneId.?)
|
||||||
.update(None)
|
.update(None)
|
||||||
|
|
||||||
Query(Milestones)
|
Query(Milestones)
|
||||||
.filter { i => (i.userName is owner.bind) && (i.repositoryName is repository.bind) && (i.milestoneId is milestoneId.bind)}
|
.filter { t =>
|
||||||
|
(t.userName is owner.bind) &&
|
||||||
|
(t.repositoryName is repository.bind) &&
|
||||||
|
(t.milestoneId is milestoneId.bind)
|
||||||
|
}
|
||||||
.delete
|
.delete
|
||||||
}
|
}
|
||||||
|
|
||||||
def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] =
|
def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] =
|
||||||
Query(Milestones)
|
Query(Milestones)
|
||||||
.filter(m => (m.userName is owner.bind) && (m.repositoryName is repository.bind) && (m.milestoneId is milestoneId.bind))
|
.filter { m =>
|
||||||
|
(m.userName is owner.bind) &&
|
||||||
|
(m.repositoryName is repository.bind) &&
|
||||||
|
(m.milestoneId is milestoneId.bind)
|
||||||
|
}
|
||||||
.sortBy(_.milestoneId desc)
|
.sortBy(_.milestoneId desc)
|
||||||
.firstOption
|
.firstOption
|
||||||
|
|
||||||
def getMilestoneIssueCounts(owner: String, repository: String): Map[(Int, Boolean), Int] =
|
def getMilestoneIssueCounts(owner: String, repository: String): Map[(Int, Boolean), Int] =
|
||||||
sql"""
|
Issues
|
||||||
select MILESTONE_ID, CLOSED, COUNT(ISSUE_ID)
|
.filter { t =>
|
||||||
from ISSUE
|
(t.userName is owner.bind) &&
|
||||||
where USER_NAME = $owner AND REPOSITORY_NAME = $repository AND MILESTONE_ID IS NOT NULL
|
(t.repositoryName is repository.bind) &&
|
||||||
group by USER_NAME, REPOSITORY_NAME, MILESTONE_ID, CLOSED"""
|
(t.milestoneId isNotNull)
|
||||||
.as[(Int, Boolean, Int)]
|
}
|
||||||
|
.groupBy { t =>
|
||||||
|
t.milestoneId ~ t.closed
|
||||||
|
}
|
||||||
|
.map { case (t1, t2) =>
|
||||||
|
t1._1 ~ t1._2 ~ t2.length
|
||||||
|
}
|
||||||
.list
|
.list
|
||||||
.map { case (milestoneId, closed, count) => (milestoneId, closed) -> count }
|
.map { case (milestoneId, closed, count) =>
|
||||||
|
(milestoneId, closed) -> count
|
||||||
|
}
|
||||||
.toMap
|
.toMap
|
||||||
|
|
||||||
def getMilestones(owner: String, repository: String): List[Milestone] =
|
def getMilestones(owner: String, repository: String): List[Milestone] =
|
||||||
Query(Milestones)
|
Query(Milestones)
|
||||||
.filter(m => (m.userName is owner.bind) && (m.repositoryName is repository.bind))
|
.filter { t =>
|
||||||
|
(t.userName is owner.bind) && (t.repositoryName is repository.bind)
|
||||||
|
}
|
||||||
.sortBy(_.milestoneId desc)
|
.sortBy(_.milestoneId desc)
|
||||||
.list
|
.list
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user