From 278c2958695550a4985e031d9626481c7733da37 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Dieguez Date: Thu, 30 Apr 2020 16:28:59 +0200 Subject: [PATCH] Move Rolestore.GetByNames query to raw query (#14403) Given that this query is part of the top 5 most used queries we want to move it to use raw queries instead of gorp so we can get rid of the reflection overhead --- store/sqlstore/role_store.go | 40 +++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/store/sqlstore/role_store.go b/store/sqlstore/role_store.go index 0de3c23d6f..63c7f30ad8 100644 --- a/store/sqlstore/role_store.go +++ b/store/sqlstore/role_store.go @@ -191,28 +191,44 @@ func (s *SqlRoleStore) GetByName(name string) (*model.Role, *model.AppError) { } func (s *SqlRoleStore) GetByNames(names []string) ([]*model.Role, *model.AppError) { - var dbRoles []*Role - if len(names) == 0 { return []*model.Role{}, nil } - var searchPlaceholders []string - var parameters = map[string]interface{}{} - for i, value := range names { - searchPlaceholders = append(searchPlaceholders, fmt.Sprintf(":Name%d", i)) - parameters[fmt.Sprintf("Name%d", i)] = value + failure := func(e error) ([]*model.Role, *model.AppError) { + return nil, model.NewAppError("SqlRoleStore.GetByNames", "store.sql_role.get_by_names.app_error", nil, e.Error(), http.StatusInternalServerError) } - searchTerm := "Name IN (" + strings.Join(searchPlaceholders, ", ") + ")" + query := s.getQueryBuilder(). + Select("Id, Name, DisplayName, Description, CreateAt, UpdateAt, DeleteAt, Permissions, SchemeManaged, BuiltIn"). + From("Roles"). + Where(sq.Eq{"Name": names}) + queryString, args, err := query.ToSql() + if err != nil { + return failure(err) + } - if _, err := s.GetReplica().Select(&dbRoles, "SELECT * from Roles WHERE "+searchTerm, parameters); err != nil { - return nil, model.NewAppError("SqlRoleStore.GetByNames", "store.sql_role.get_by_names.app_error", nil, err.Error(), http.StatusInternalServerError) + rows, err := s.GetReplica().Db.Query(queryString, args...) + if err != nil { + return failure(err) } var roles []*model.Role - for _, dbRole := range dbRoles { - roles = append(roles, dbRole.ToModel()) + defer rows.Close() + for rows.Next() { + var role Role + err = rows.Scan( + &role.Id, &role.Name, &role.DisplayName, &role.Description, + &role.CreateAt, &role.UpdateAt, &role.DeleteAt, &role.Permissions, + &role.SchemeManaged, &role.BuiltIn) + if err != nil { + return failure(err) + } + roles = append(roles, role.ToModel()) + } + err = rows.Err() + if err != nil { + return failure(err) } return roles, nil