255 lines
6.8 KiB
Go
255 lines
6.8 KiB
Go
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
type (
|
|
StatItem struct {
|
|
Item string `json:"item"`
|
|
Commits int `json:"commits"`
|
|
Delta int `json:"delta"`
|
|
}
|
|
StatPoint struct {
|
|
StatItem
|
|
Week uint64 `json:"week"`
|
|
}
|
|
)
|
|
|
|
func StatOrgTop(login string, p map[string]interface{}) (res []StatItem) {
|
|
defer measure(time.Now(), "StatOrgTop")
|
|
mustSelectN(&res, fmt.Sprintf(`
|
|
select
|
|
%s as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta
|
|
from contribs c
|
|
join orgs o
|
|
on o.id = c.org_id
|
|
`+joinContribFT(p["item"])+`
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item
|
|
order by commits desc
|
|
`, p["item"]), p)
|
|
return
|
|
}
|
|
|
|
func StatOrgActivity(login string, p map[string]interface{}) (res []StatPoint) {
|
|
defer measure(time.Now(), "StatOrgActivity")
|
|
mustSelectN(&res, fmt.Sprintf(`
|
|
select
|
|
%s as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta,
|
|
c.week as week
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
`+joinContribFT(p["item"])+`
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item, week
|
|
order by week, commits desc
|
|
`, p["item"]), p)
|
|
return
|
|
}
|
|
|
|
func StatTeamTop(login string, p map[string]interface{}) (res []StatItem) {
|
|
defer measure(time.Now(), "StatTeamTop")
|
|
mustSelectN(&res, fmt.Sprintf(`
|
|
select
|
|
%s as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
join team_members tm on
|
|
c.user_id = tm.user_id and
|
|
c.org_id = tm.org_id
|
|
join teams t on
|
|
t.id = tm.team_id
|
|
`+joinContribFT(p["item"])+`
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
t.name = :team and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item
|
|
order by commits desc
|
|
`, p["item"]), p)
|
|
return
|
|
}
|
|
|
|
func StatTeamActivity(login string, p map[string]interface{}) (res []StatPoint) {
|
|
defer measure(time.Now(), "StatTeamActivity")
|
|
mustSelectN(&res, fmt.Sprintf(`
|
|
select
|
|
%s as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta,
|
|
c.week as week
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
join team_members tm on
|
|
c.user_id = tm.user_id and
|
|
c.org_id = tm.org_id
|
|
join teams t on
|
|
tm.team_id = t.id
|
|
`+joinContribFT(p["item"])+`
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
t.name = :team and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item, week
|
|
order by week, commits desc
|
|
`, p["item"]), p)
|
|
return
|
|
}
|
|
|
|
func StatUserTop(login string, p map[string]interface{}) (res []StatItem) {
|
|
defer measure(time.Now(), "StatUserTop")
|
|
mustSelectN(&res, `
|
|
select
|
|
r.name as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
join users u on
|
|
c.user_id = u.id
|
|
join repos r on
|
|
c.repo_id = r.id
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
u.login = :user and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item
|
|
order by commits desc
|
|
`, p)
|
|
return
|
|
}
|
|
|
|
func StatUserActivity(login string, p map[string]interface{}) (res []StatPoint) {
|
|
defer measure(time.Now(), "StatUserActivity")
|
|
mustSelectN(&res, `
|
|
select
|
|
c.week as week,
|
|
r.name as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
join users u on
|
|
c.user_id = u.id
|
|
join repos r on
|
|
c.repo_id = r.id
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
u.login = :user and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item
|
|
order by week, commits desc
|
|
`, p)
|
|
return
|
|
}
|
|
|
|
func StatRepoTop(login string, p map[string]interface{}) (res []StatItem) {
|
|
defer measure(time.Now(), "StatRepoTop")
|
|
mustSelectN(&res, fmt.Sprintf(`
|
|
select
|
|
%s as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
join repos r on
|
|
c.repo_id = r.id
|
|
`+joinContribFT(p["item"])+`
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
r.name = :repo and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by item
|
|
order by commits desc
|
|
`, p["item"]), p)
|
|
return
|
|
}
|
|
|
|
func StatRepoActivity(login string, p map[string]interface{}) (res []StatPoint) {
|
|
defer measure(time.Now(), "StatRepoActivity")
|
|
mustSelectN(&res, fmt.Sprintf(`
|
|
select
|
|
c.week as week,
|
|
%s as item,
|
|
sum(c.commits) as commits,
|
|
sum(c.additions) - sum(c.deletions) as delta
|
|
from contribs c
|
|
join orgs o on
|
|
o.id = c.org_id
|
|
join repos r on
|
|
c.repo_id = r.id
|
|
`+joinContribFT(p["item"])+`
|
|
where
|
|
o.login = :org and
|
|
c.repo_id in `+reposScope(login)+` and
|
|
r.name = :repo and
|
|
c.week >= :from and
|
|
c.week <= :to
|
|
group by week, item
|
|
order by commits desc
|
|
`, p["item"]), p)
|
|
return
|
|
}
|
|
|
|
func joinContribFT(item interface{}) string {
|
|
switch item {
|
|
case "r.name":
|
|
return "join repos r on c.repo_id = r.id"
|
|
case "u.login":
|
|
return "join users u on c.user_id = u.id"
|
|
case "t.name":
|
|
return `
|
|
join team_members tm on
|
|
tm.user_id = c.user_id and
|
|
tm.org_id = c.org_id
|
|
join teams t on
|
|
t.id = tm.team_id`
|
|
default:
|
|
panic("unreachable")
|
|
}
|
|
}
|
|
|
|
func reposScope(login string) string {
|
|
return fmt.Sprintf(`(
|
|
select
|
|
distinct(repo_id)
|
|
from team_repos tr
|
|
join team_members tm on
|
|
tm.team_id = tr.team_id
|
|
join users u on
|
|
u.login = %q
|
|
)`, login)
|
|
}
|