Conditionally join foreign tables
This commit is contained in:
parent
5d3200b5db
commit
d315f272c7
82
db/stat.go
82
db/stat.go
|
@ -17,19 +17,6 @@ type (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const joinContribFT = `
|
|
||||||
join team_members tm on
|
|
||||||
c.user_id = tm.user_id and
|
|
||||||
c.org_id = tm.org_id
|
|
||||||
join orgs o on
|
|
||||||
c.org_id = o.id
|
|
||||||
join teams t on
|
|
||||||
tm.team_id = t.id
|
|
||||||
join users u on
|
|
||||||
c.user_id = u.id
|
|
||||||
join repos r on
|
|
||||||
c.repo_id = r.id`
|
|
||||||
|
|
||||||
func StatOrgTop(login string, p map[string]interface{}) (res []StatItem) {
|
func StatOrgTop(login string, p map[string]interface{}) (res []StatItem) {
|
||||||
defer measure(time.Now(), "StatOrgTop")
|
defer measure(time.Now(), "StatOrgTop")
|
||||||
mustSelectN(&res, fmt.Sprintf(`
|
mustSelectN(&res, fmt.Sprintf(`
|
||||||
|
@ -38,7 +25,9 @@ func StatOrgTop(login string, p map[string]interface{}) (res []StatItem) {
|
||||||
sum(c.commits) as commits,
|
sum(c.commits) as commits,
|
||||||
sum(c.additions) - sum(c.deletions) as delta
|
sum(c.additions) - sum(c.deletions) as delta
|
||||||
from contribs c
|
from contribs c
|
||||||
`+joinContribFT+`
|
join orgs o
|
||||||
|
on o.id = c.org_id
|
||||||
|
`+joinContribFT(p["item"])+`
|
||||||
where
|
where
|
||||||
o.login = :org and
|
o.login = :org and
|
||||||
c.repo_id in `+reposScope(login)+` and
|
c.repo_id in `+reposScope(login)+` and
|
||||||
|
@ -59,7 +48,9 @@ func StatOrgActivity(login string, p map[string]interface{}) (res []StatPoint) {
|
||||||
sum(c.additions) - sum(c.deletions) as delta,
|
sum(c.additions) - sum(c.deletions) as delta,
|
||||||
c.week as week
|
c.week as week
|
||||||
from contribs c
|
from contribs c
|
||||||
`+joinContribFT+`
|
join orgs o on
|
||||||
|
o.id = c.org_id
|
||||||
|
`+joinContribFT(p["item"])+`
|
||||||
where
|
where
|
||||||
o.login = :org and
|
o.login = :org and
|
||||||
c.repo_id in `+reposScope(login)+` and
|
c.repo_id in `+reposScope(login)+` and
|
||||||
|
@ -79,7 +70,14 @@ func StatTeamTop(login string, p map[string]interface{}) (res []StatItem) {
|
||||||
sum(c.commits) as commits,
|
sum(c.commits) as commits,
|
||||||
sum(c.additions) - sum(c.deletions) as delta
|
sum(c.additions) - sum(c.deletions) as delta
|
||||||
from contribs c
|
from contribs c
|
||||||
`+joinContribFT+`
|
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
|
where
|
||||||
o.login = :org and
|
o.login = :org and
|
||||||
c.repo_id in `+reposScope(login)+` and
|
c.repo_id in `+reposScope(login)+` and
|
||||||
|
@ -101,7 +99,14 @@ func StatTeamActivity(login string, p map[string]interface{}) (res []StatPoint)
|
||||||
sum(c.additions) - sum(c.deletions) as delta,
|
sum(c.additions) - sum(c.deletions) as delta,
|
||||||
c.week as week
|
c.week as week
|
||||||
from contribs c
|
from contribs c
|
||||||
`+joinContribFT+`
|
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
|
where
|
||||||
o.login = :org and
|
o.login = :org and
|
||||||
c.repo_id in `+reposScope(login)+` and
|
c.repo_id in `+reposScope(login)+` and
|
||||||
|
@ -123,7 +128,7 @@ func StatUserTop(login string, p map[string]interface{}) (res []StatItem) {
|
||||||
sum(c.additions) - sum(c.deletions) as delta
|
sum(c.additions) - sum(c.deletions) as delta
|
||||||
from contribs c
|
from contribs c
|
||||||
join orgs o on
|
join orgs o on
|
||||||
c.org_id = o.id
|
o.id = c.org_id
|
||||||
join users u on
|
join users u on
|
||||||
c.user_id = u.id
|
c.user_id = u.id
|
||||||
join repos r on
|
join repos r on
|
||||||
|
@ -150,7 +155,7 @@ func StatUserActivity(login string, p map[string]interface{}) (res []StatPoint)
|
||||||
sum(c.additions) - sum(c.deletions) as delta
|
sum(c.additions) - sum(c.deletions) as delta
|
||||||
from contribs c
|
from contribs c
|
||||||
join orgs o on
|
join orgs o on
|
||||||
c.org_id = o.id
|
o.id = c.org_id
|
||||||
join users u on
|
join users u on
|
||||||
c.user_id = u.id
|
c.user_id = u.id
|
||||||
join repos r on
|
join repos r on
|
||||||
|
@ -175,7 +180,11 @@ func StatRepoTop(login string, p map[string]interface{}) (res []StatItem) {
|
||||||
sum(c.commits) as commits,
|
sum(c.commits) as commits,
|
||||||
sum(c.additions) - sum(c.deletions) as delta
|
sum(c.additions) - sum(c.deletions) as delta
|
||||||
from contribs c
|
from contribs c
|
||||||
`+joinContribFT+`
|
join orgs o on
|
||||||
|
o.id = c.org_id
|
||||||
|
join repos r on
|
||||||
|
c.repo_id = r.id
|
||||||
|
`+joinContribFT(p["item"])+`
|
||||||
where
|
where
|
||||||
o.login = :org and
|
o.login = :org and
|
||||||
c.repo_id in `+reposScope(login)+` and
|
c.repo_id in `+reposScope(login)+` and
|
||||||
|
@ -197,7 +206,11 @@ func StatRepoActivity(login string, p map[string]interface{}) (res []StatPoint)
|
||||||
sum(c.commits) as commits,
|
sum(c.commits) as commits,
|
||||||
sum(c.additions) - sum(c.deletions) as delta
|
sum(c.additions) - sum(c.deletions) as delta
|
||||||
from contribs c
|
from contribs c
|
||||||
`+joinContribFT+`
|
join orgs o on
|
||||||
|
o.id = c.org_id
|
||||||
|
join repos r on
|
||||||
|
c.repo_id = r.id
|
||||||
|
`+joinContribFT(p["item"])+`
|
||||||
where
|
where
|
||||||
o.login = :org and
|
o.login = :org and
|
||||||
c.repo_id in `+reposScope(login)+` and
|
c.repo_id in `+reposScope(login)+` and
|
||||||
|
@ -210,11 +223,32 @@ func StatRepoActivity(login string, p map[string]interface{}) (res []StatPoint)
|
||||||
return
|
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 {
|
func reposScope(login string) string {
|
||||||
return fmt.Sprintf(`(
|
return fmt.Sprintf(`(
|
||||||
select repo_id
|
select
|
||||||
|
distinct(repo_id)
|
||||||
from team_repos tr
|
from team_repos tr
|
||||||
join team_members tm on tr.team_id = tm.team_id
|
join team_members tm on
|
||||||
join users u on u.login = %q
|
tm.team_id = tr.team_id
|
||||||
|
join users u on
|
||||||
|
u.login = %q
|
||||||
)`, login)
|
)`, login)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue