From 55ae78208e38eb92d916c0b3c45c4e9cebfc14c9 Mon Sep 17 00:00:00 2001
From: Lunny Xiao <xiaolunwen@gmail.com>
Date: Tue, 14 Feb 2017 11:46:46 +0800
Subject: [PATCH] Small optimization for getTeamIDs (#919)

* small optimization for getTeamIDs

* rename getOrgTeamIDs to getUserTeamIDs and remove orderby
---
 models/models.go |  1 +
 models/org.go    | 22 ++++++++++++----------
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/models/models.go b/models/models.go
index 7f0ef59547..27b49755aa 100644
--- a/models/models.go
+++ b/models/models.go
@@ -30,6 +30,7 @@ import (
 
 // Engine represents a xorm engine or session.
 type Engine interface {
+	Table(tableNameOrBean interface{}) *xorm.Session
 	Count(interface{}) (int64, error)
 	Decr(column string, arg ...interface{}) *xorm.Session
 	Delete(interface{}) (int64, error)
diff --git a/models/org.go b/models/org.go
index f68c2b9fcb..6da54300cb 100644
--- a/models/org.go
+++ b/models/org.go
@@ -563,18 +563,20 @@ func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team,
 		Find(&teams)
 }
 
+func (org *User) getUserTeamIDs(e Engine, userID int64) ([]int64, error) {
+	teamIDs := make([]int64, 0, org.NumTeams)
+	return teamIDs, e.
+		Table("team").
+		Cols("team.id").
+		Where("`team_user`.org_id = ?", org.ID).
+		Join("INNER", "team_user", "`team_user`.team_id = team.id").
+		And("`team_user`.uid = ?", userID).
+		Find(&teamIDs)
+}
+
 // GetUserTeamIDs returns of all team IDs of the organization that user is member of.
 func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) {
-	teams, err := org.getUserTeams(x, userID, "team.id")
-	if err != nil {
-		return nil, fmt.Errorf("getUserTeams [%d]: %v", userID, err)
-	}
-
-	teamIDs := make([]int64, len(teams))
-	for i := range teams {
-		teamIDs[i] = teams[i].ID
-	}
-	return teamIDs, nil
+	return org.getUserTeamIDs(x, userID)
 }
 
 // GetUserTeams returns all teams that belong to user,