[MM-26969] Add team filters to search teams (#15065)

* Add team filters to search teams

Remove unneeded logs

Add team filters to search teams

* Use bool pointers for filters

Re-add include group constrained

Fix lint

Return the union of filters
Этот коммит содержится в:
Farhan Munshi
2020-07-27 15:11:39 -04:00
коммит произвёл GitHub
родитель fbde669dda
Коммит c511042c0f
9 изменённых файлов: 216 добавлений и 84 удалений

Просмотреть файл

@@ -372,20 +372,94 @@ func (s SqlTeamStore) GetByNames(names []string) ([]*model.Team, *model.AppError
return teams, nil
}
func (s SqlTeamStore) teamSearchQuery(term string, opts *model.TeamSearch, countQuery bool) sq.SelectBuilder {
var selectStr string
if countQuery {
selectStr = "count(*)"
} else {
selectStr = "*"
}
query := s.getQueryBuilder().
Select(selectStr).
From("Teams as t")
// Don't order or limit if getting count
if !countQuery {
query = query.OrderBy("t.DisplayName")
if opts.IsPaginated() {
query = query.Limit(uint64(*opts.PerPage)).Offset(uint64(*opts.Page * *opts.PerPage))
}
}
if len(term) > 0 {
term = sanitizeSearchTerm(term, "\\")
term = wildcardSearchTerm(term)
operatorKeyword := "ILIKE"
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
operatorKeyword = "LIKE"
}
query = query.Where(fmt.Sprintf("(Name %[1]s ? OR DisplayName %[1]s ?)", operatorKeyword), term, term)
}
var teamFilters sq.Sqlizer
var openInviteFilter sq.Sqlizer
if opts.AllowOpenInvite != nil {
if *opts.AllowOpenInvite {
openInviteFilter = sq.Eq{"AllowOpenInvite": true}
} else {
openInviteFilter = sq.And{
sq.Or{
sq.NotEq{"AllowOpenInvite": true},
sq.Eq{"AllowOpenInvite": nil},
},
sq.Or{
sq.NotEq{"GroupConstrained": true},
sq.Eq{"GroupConstrained": nil},
},
}
}
teamFilters = openInviteFilter
}
var groupConstrainedFilter sq.Sqlizer
if opts.GroupConstrained != nil {
if *opts.GroupConstrained {
groupConstrainedFilter = sq.Eq{"GroupConstrained": true}
} else {
groupConstrainedFilter = sq.Or{
sq.NotEq{"GroupConstrained": true},
sq.Eq{"GroupConstrained": nil},
}
}
if teamFilters == nil {
teamFilters = groupConstrainedFilter
} else {
teamFilters = sq.Or{teamFilters, groupConstrainedFilter}
}
}
query = query.Where(teamFilters)
return query
}
// SearchAll returns from the database a list of teams that match the Name or DisplayName
// passed as the term search parameter.
func (s SqlTeamStore) SearchAll(term string) ([]*model.Team, *model.AppError) {
func (s SqlTeamStore) SearchAll(term string, opts *model.TeamSearch) ([]*model.Team, *model.AppError) {
var teams []*model.Team
term = sanitizeSearchTerm(term, "\\")
term = wildcardSearchTerm(term)
operatorKeyword := "ILIKE"
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
operatorKeyword = "LIKE"
queryString, args, err := s.teamSearchQuery(term, opts, false).ToSql()
if err != nil {
return nil, model.NewAppError("SqlTeamStore.SearchAll", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError)
}
queryString := fmt.Sprintf("SELECT * FROM Teams WHERE Name %[1]s :Term OR DisplayName %[1]s :Term", operatorKeyword)
if _, err := s.GetReplica().Select(&teams, queryString, map[string]interface{}{"Term": term}); err != nil {
if _, err = s.GetReplica().Select(&teams, queryString, args...); err != nil {
return nil, model.NewAppError("SqlTeamStore.SearchAll", "store.sql_team.search_all_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError)
}
@@ -393,24 +467,23 @@ func (s SqlTeamStore) SearchAll(term string) ([]*model.Team, *model.AppError) {
}
// SearchAllPaged returns a teams list and the total count of teams that matched the search.
func (s SqlTeamStore) SearchAllPaged(term string, page int, perPage int) ([]*model.Team, int64, *model.AppError) {
func (s SqlTeamStore) SearchAllPaged(term string, opts *model.TeamSearch) ([]*model.Team, int64, *model.AppError) {
var teams []*model.Team
var totalCount int64
offset := page * perPage
term = sanitizeSearchTerm(term, "\\")
term = wildcardSearchTerm(term)
operatorKeyword := "ILIKE"
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
operatorKeyword = "LIKE"
queryString, args, err := s.teamSearchQuery(term, opts, false).ToSql()
if err != nil {
return nil, 0, model.NewAppError("SqlTeamStore.SearchAllPage", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError)
}
queryString := fmt.Sprintf("SELECT * FROM Teams WHERE Name %[1]s :Term OR DisplayName %[1]s :Term ORDER BY DisplayName, Name LIMIT :Limit OFFSET :Offset", operatorKeyword)
if _, err := s.GetReplica().Select(&teams, queryString, map[string]interface{}{"Term": term, "Limit": perPage, "Offset": offset}); err != nil {
if _, err = s.GetReplica().Select(&teams, queryString, args...); err != nil {
return nil, 0, model.NewAppError("SqlTeamStore.SearchAllPage", "store.sql_team.search_all_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError)
}
queryString = fmt.Sprintf("SELECT COUNT(*) FROM Teams WHERE Name %[1]s :Term OR DisplayName %[1]s :Term", operatorKeyword)
totalCount, err := s.GetReplica().SelectInt(queryString, map[string]interface{}{"Term": term})
queryString, args, err = s.teamSearchQuery(term, opts, true).ToSql()
if err != nil {
return nil, 0, model.NewAppError("SqlTeamStore.SearchAllPage", "store.sql.build_query.app_error", nil, err.Error(), http.StatusInternalServerError)
}
totalCount, err = s.GetReplica().SelectInt(queryString, args...)
if err != nil {
return nil, 0, model.NewAppError("SqlTeamStore.SearchAllPage", "store.sql_team.search_all_team.app_error", nil, "term="+term+", "+err.Error(), http.StatusInternalServerError)
}