diff --git a/app/jsx/app/menu.jsx b/app/jsx/app/menu.jsx
index 3733551..50e89f1 100644
--- a/app/jsx/app/menu.jsx
+++ b/app/jsx/app/menu.jsx
@@ -17,7 +17,7 @@ var Menu = React.createClass({
return (
{team.name}
diff --git a/db/stat.go b/db/stat.go
index 8d1e37c..c7e3f39 100644
--- a/db/stat.go
+++ b/db/stat.go
@@ -17,194 +17,187 @@ type (
}
)
-const orgTopQuery = `
-select
- %s as item,
- sum(c.commits) as commits,
- sum(c.additions) - sum(c.deletions) as delta
-from contribs c
-join members m on
- c.author = m.user and
- c.owner = m.org
+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
- m.team_id = t.id
-where
- c.owner = :org and
- c.week >= :from and
- c.week <= :to
-group by item
-order by commits desc`
-
-const orgActivityQuery = `
-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 members m on
- c.author = m.user and
- c.owner = m.org
-join teams t on
- m.team_id = t.id
-where
- c.owner = :org and
- c.week >= :from and
- c.week <= :to
-group by item, week
-order by week, commits desc`
-
-const teamTopQuery = `
-select
- %s as item,
- sum(c.commits) as commits,
- sum(c.additions) - sum(c.deletions) as delta
-from contribs c
-join members m on
- c.author = m.user and
- c.owner = m.org
-join teams t on
- m.team_id = t.id and
- t.name = :team
-where
- c.owner = :org and
- c.week >= :from and
- c.week <= :to
-group by item
-order by commits desc`
-
-const teamActivityQuery = `
-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 members m on
- c.author = m.user and
- c.owner = m.org
-join teams t on
- m.team_id = t.id and
- t.name = :team
-where
- c.owner = :org and
- c.week >= :from and
- c.week <= :to
-group by item, week
-order by week, commits desc`
-
-const userTopQuery = `
-select
- c.repo as item,
- sum(c.commits) as commits,
- sum(c.additions) - sum(c.deletions) as delta
-from contribs c
-where
- c.owner = :org and
- c.author = :user and
- c.week >= :from and
- c.week <= :to
-group by item
-order by commits desc`
-
-const userActivityQuery = `
-select
- c.week as week,
- c.repo as item,
- sum(c.commits) as commits,
- sum(c.additions) - sum(c.deletions) as delta
-from contribs c
-where
- c.owner = :org and
- c.author = :user and
- c.week >= :from and
- c.week <= :to
-group by item
-order by week, commits desc`
-
-const repoTopQuery = `
-select
- %s as item,
- sum(c.commits) as commits,
- sum(c.additions) - sum(c.deletions) as delta
-from contribs c
-join members m on
- c.author = m.user and
- c.owner = m.org
-join teams t on
- m.team_id = t.id
-where
- c.owner = :org and
- c.repo = :repo and
- c.week >= :from and
- c.week <= :to
-group by item
-order by commits desc`
-
-const repoActivityQuery = `
-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 members m on
- c.author = m.user and
- c.owner = m.org
-join teams t on
- m.team_id = t.id
-where
- c.owner = :org and
- c.repo = :repo and
- c.week >= :from and
- c.week <= :to
-group by week, item
-order by commits desc`
+ 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(p map[string]interface{}) (res []StatItem) {
defer measure("StatOrgTop", time.Now())
- mustSelectN(&res, fmt.Sprintf(orgTopQuery, p["item"]), p)
+ mustSelectN(&res, fmt.Sprintf(`
+ select
+ %s as item,
+ sum(c.commits) as commits,
+ sum(c.additions) - sum(c.deletions) as delta
+ from contribs c
+ `+joinContribFT+`
+ where
+ o.login = :org and
+ c.week >= :from and
+ c.week <= :to
+ group by item
+ order by commits desc
+ `, p["item"]), p)
return
}
func StatOrgActivity(p map[string]interface{}) (res []StatPoint) {
defer measure("StatOrgActivity", time.Now())
- mustSelectN(&res, fmt.Sprintf(orgActivityQuery, p["item"]), p)
+ 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
+ `+joinContribFT+`
+ where
+ o.login = :org and
+ c.week >= :from and
+ c.week <= :to
+ group by item, week
+ order by week, commits desc
+ `, p["item"]), p)
return
}
func StatTeamTop(p map[string]interface{}) (res []StatItem) {
defer measure("StatTeamTop", time.Now())
- mustSelectN(&res, fmt.Sprintf(teamTopQuery, p["item"]), p)
+ mustSelectN(&res, fmt.Sprintf(`
+ select
+ %s as item,
+ sum(c.commits) as commits,
+ sum(c.additions) - sum(c.deletions) as delta
+ from contribs c
+ `+joinContribFT+`
+ where
+ o.login = :org 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(p map[string]interface{}) (res []StatPoint) {
defer measure("StatTeamActivity", time.Now())
- mustSelectN(&res, fmt.Sprintf(teamActivityQuery, p["item"]), p)
+ 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
+ `+joinContribFT+`
+ where
+ o.login = :org 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(p map[string]interface{}) (res []StatItem) {
defer measure("StatUserTop", time.Now())
- mustSelectN(&res, userTopQuery, p)
+ 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
+ c.org_id = o.id
+ join users u on
+ c.user_id = u.id
+ join repos r on
+ c.repo_id = r.id
+ where
+ o.login = :org and
+ u.login = :user and
+ c.week >= :from and
+ c.week <= :to
+ group by item
+ order by commits desc
+ `, p)
return
}
func StatUserActivity(p map[string]interface{}) (res []StatPoint) {
defer measure("StatUserActivity", time.Now())
- mustSelectN(&res, userActivityQuery, p)
+ 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
+ c.org_id = o.id
+ join users u on
+ c.user_id = u.id
+ join repos r on
+ c.repo_id = r.id
+ where
+ o.login = :org and
+ u.login = :user and
+ c.week >= :from and
+ c.week <= :to
+ group by item
+ order by week, commits desc
+ `, p)
return
}
func StatRepoTop(p map[string]interface{}) (res []StatItem) {
defer measure("StatRepoTop", time.Now())
- mustSelectN(&res, fmt.Sprintf(repoTopQuery, p["item"]), p)
+ mustSelectN(&res, fmt.Sprintf(`
+ select
+ %s as item,
+ sum(c.commits) as commits,
+ sum(c.additions) - sum(c.deletions) as delta
+ from contribs c
+ `+joinContribFT+`
+ where
+ o.login = :org 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(p map[string]interface{}) (res []StatPoint) {
defer measure("StatRepoActivity", time.Now())
- mustSelectN(&res, fmt.Sprintf(repoActivityQuery, p["item"]), p)
+ 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
+ `+joinContribFT+`
+ where
+ o.login = :org and
+ r.name = :repo and
+ c.week >= :from and
+ c.week <= :to
+ group by week, item
+ order by commits desc
+ `, p["item"]), p)
return
}
diff --git a/server/request.go b/server/request.go
index 9562101..4b94c3b 100644
--- a/server/request.go
+++ b/server/request.go
@@ -81,11 +81,11 @@ func parseStatRequest(r *http.Request) *statRequest {
var item string
switch val := r.FormValue("item"); val {
case "author", "user":
- item = "c.author"
+ item = "u.login"
case "team":
item = "t.name"
default:
- item = "c.repo"
+ item = "r.name"
}
return &statRequest{