Replace native SQL which contains group by clause with type safe DSL.

This commit is contained in:
takezoe
2013-06-26 15:57:36 +09:00
parent 1216c64272
commit 3429d0d9bf

View File

@@ -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
} }