mirror of
https://github.com/coder/coder.git
synced 2025-07-13 21:36:50 +00:00
feat(coderd): add parameter insights to template insights (#8656)
This commit is contained in:
committed by
GitHub
parent
2ed453035e
commit
d3991fac26
@ -596,6 +596,21 @@ func isNotNull(v interface{}) bool {
|
||||
// these methods remain unimplemented in the FakeQuerier.
|
||||
var ErrUnimplemented = xerrors.New("unimplemented")
|
||||
|
||||
func uniqueSortedUUIDs(uuids []uuid.UUID) []uuid.UUID {
|
||||
set := make(map[uuid.UUID]struct{})
|
||||
for _, id := range uuids {
|
||||
set[id] = struct{}{}
|
||||
}
|
||||
unique := make([]uuid.UUID, 0, len(set))
|
||||
for id := range set {
|
||||
unique = append(unique, id)
|
||||
}
|
||||
slices.SortFunc(unique, func(a, b uuid.UUID) bool {
|
||||
return a.String() < b.String()
|
||||
})
|
||||
return unique
|
||||
}
|
||||
|
||||
func (*FakeQuerier) AcquireLock(_ context.Context, _ int64) error {
|
||||
return xerrors.New("AcquireLock must only be called within a transaction")
|
||||
}
|
||||
@ -2122,6 +2137,100 @@ func (q *FakeQuerier) GetTemplateInsights(_ context.Context, arg database.GetTem
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (q *FakeQuerier) GetTemplateParameterInsights(ctx context.Context, arg database.GetTemplateParameterInsightsParams) ([]database.GetTemplateParameterInsightsRow, error) {
|
||||
err := validateDatabaseType(arg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
q.mutex.RLock()
|
||||
defer q.mutex.RUnlock()
|
||||
|
||||
// WITH latest_workspace_builds ...
|
||||
latestWorkspaceBuilds := make(map[uuid.UUID]database.WorkspaceBuildTable)
|
||||
for _, wb := range q.workspaceBuilds {
|
||||
if wb.CreatedAt.Before(arg.StartTime) || wb.CreatedAt.Equal(arg.EndTime) || wb.CreatedAt.After(arg.EndTime) {
|
||||
continue
|
||||
}
|
||||
if latestWorkspaceBuilds[wb.WorkspaceID].BuildNumber < wb.BuildNumber {
|
||||
latestWorkspaceBuilds[wb.WorkspaceID] = wb
|
||||
}
|
||||
}
|
||||
if len(arg.TemplateIDs) > 0 {
|
||||
for wsID := range latestWorkspaceBuilds {
|
||||
ws, err := q.getWorkspaceByIDNoLock(ctx, wsID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if slices.Contains(arg.TemplateIDs, ws.TemplateID) {
|
||||
delete(latestWorkspaceBuilds, wsID)
|
||||
}
|
||||
}
|
||||
}
|
||||
// WITH unique_template_params ...
|
||||
num := int64(0)
|
||||
uniqueTemplateParams := make(map[string]*database.GetTemplateParameterInsightsRow)
|
||||
uniqueTemplateParamWorkspaceBuildIDs := make(map[string][]uuid.UUID)
|
||||
for _, wb := range latestWorkspaceBuilds {
|
||||
tv, err := q.getTemplateVersionByIDNoLock(ctx, wb.TemplateVersionID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, tvp := range q.templateVersionParameters {
|
||||
if tvp.TemplateVersionID != tv.ID {
|
||||
continue
|
||||
}
|
||||
key := fmt.Sprintf("%s:%s:%s:%s", tvp.Name, tvp.DisplayName, tvp.Description, tvp.Options)
|
||||
if _, ok := uniqueTemplateParams[key]; !ok {
|
||||
num++
|
||||
uniqueTemplateParams[key] = &database.GetTemplateParameterInsightsRow{
|
||||
Num: num,
|
||||
Name: tvp.Name,
|
||||
DisplayName: tvp.DisplayName,
|
||||
Description: tvp.Description,
|
||||
Options: tvp.Options,
|
||||
}
|
||||
}
|
||||
uniqueTemplateParams[key].TemplateIDs = append(uniqueTemplateParams[key].TemplateIDs, tv.TemplateID.UUID)
|
||||
uniqueTemplateParamWorkspaceBuildIDs[key] = append(uniqueTemplateParamWorkspaceBuildIDs[key], wb.ID)
|
||||
}
|
||||
}
|
||||
// SELECT ...
|
||||
counts := make(map[string]map[string]int64)
|
||||
for key, utp := range uniqueTemplateParams {
|
||||
for _, wbp := range q.workspaceBuildParameters {
|
||||
if !slices.Contains(uniqueTemplateParamWorkspaceBuildIDs[key], wbp.WorkspaceBuildID) {
|
||||
continue
|
||||
}
|
||||
if wbp.Name != utp.Name {
|
||||
continue
|
||||
}
|
||||
if counts[key] == nil {
|
||||
counts[key] = make(map[string]int64)
|
||||
}
|
||||
counts[key][wbp.Value]++
|
||||
}
|
||||
}
|
||||
|
||||
var rows []database.GetTemplateParameterInsightsRow
|
||||
for key, utp := range uniqueTemplateParams {
|
||||
for value, count := range counts[key] {
|
||||
rows = append(rows, database.GetTemplateParameterInsightsRow{
|
||||
Num: utp.Num,
|
||||
TemplateIDs: uniqueSortedUUIDs(utp.TemplateIDs),
|
||||
Name: utp.Name,
|
||||
DisplayName: utp.DisplayName,
|
||||
Description: utp.Description,
|
||||
Options: utp.Options,
|
||||
Value: value,
|
||||
Count: count,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
func (q *FakeQuerier) GetTemplateVersionByID(ctx context.Context, templateVersionID uuid.UUID) (database.TemplateVersion, error) {
|
||||
q.mutex.RLock()
|
||||
defer q.mutex.RUnlock()
|
||||
|
Reference in New Issue
Block a user