@@ -2073,7 +2073,92 @@ func (q *FakeQuerier) GetTemplateParameterInsights(ctx context.Context, arg data
2073
2073
return nil ,err
2074
2074
}
2075
2075
2076
- panic ("not implemented" )
2076
+ q .mutex .RLock ()
2077
+ defer q .mutex .RUnlock ()
2078
+
2079
+ // WITH latest_workspace_builds ...
2080
+ latestWorkspaceBuilds := make (map [uuid.UUID ]database.WorkspaceBuild )
2081
+ for _ ,wb := range q .workspaceBuilds {
2082
+ if wb .CreatedAt .Before (arg .StartTime )|| wb .CreatedAt .Equal (arg .EndTime )|| wb .CreatedAt .After (arg .EndTime ) {
2083
+ continue
2084
+ }
2085
+ if latestWorkspaceBuilds [wb .WorkspaceID ].BuildNumber < wb .BuildNumber {
2086
+ latestWorkspaceBuilds [wb .WorkspaceID ]= wb
2087
+ }
2088
+ }
2089
+ if len (arg .TemplateIDs )> 0 {
2090
+ for wsID := range latestWorkspaceBuilds {
2091
+ ws ,err := q .getWorkspaceByIDNoLock (ctx ,wsID )
2092
+ if err != nil {
2093
+ return nil ,err
2094
+ }
2095
+ if slices .Contains (arg .TemplateIDs ,ws .TemplateID ) {
2096
+ delete (latestWorkspaceBuilds ,wsID )
2097
+ }
2098
+ }
2099
+ }
2100
+ // WITH unique_template_params ...
2101
+ num := int64 (0 )
2102
+ uniqueTemplateParams := make (map [string ]* database.GetTemplateParameterInsightsRow )
2103
+ uniqueTemplateParamWorkspaceBuildIDs := make (map [string ][]uuid.UUID )
2104
+ for _ ,wb := range latestWorkspaceBuilds {
2105
+ tv ,err := q .getTemplateVersionByIDNoLock (ctx ,wb .TemplateVersionID )
2106
+ if err != nil {
2107
+ return nil ,err
2108
+ }
2109
+ for _ ,tvp := range q .templateVersionParameters {
2110
+ if tvp .TemplateVersionID != tv .ID {
2111
+ continue
2112
+ }
2113
+ key := fmt .Sprintf ("%s:%s:%s:%s" ,tvp .Name ,tvp .DisplayName ,tvp .Description ,tvp .Options )
2114
+ if _ ,ok := uniqueTemplateParams [key ];! ok {
2115
+ num ++
2116
+ uniqueTemplateParams [key ]= & database.GetTemplateParameterInsightsRow {
2117
+ Num :num ,
2118
+ Name :tvp .Name ,
2119
+ DisplayName :tvp .DisplayName ,
2120
+ Description :tvp .Description ,
2121
+ Options :tvp .Options ,
2122
+ }
2123
+ }
2124
+ uniqueTemplateParams [key ].TemplateIDs = append (uniqueTemplateParams [key ].TemplateIDs ,tv .TemplateID .UUID )
2125
+ uniqueTemplateParamWorkspaceBuildIDs [key ]= append (uniqueTemplateParamWorkspaceBuildIDs [key ],wb .ID )
2126
+ }
2127
+ }
2128
+ // SELECT ...
2129
+ counts := make (map [string ]map [string ]int64 )
2130
+ for key ,utp := range uniqueTemplateParams {
2131
+ for _ ,wbp := range q .workspaceBuildParameters {
2132
+ if ! slices .Contains (uniqueTemplateParamWorkspaceBuildIDs [key ],wbp .WorkspaceBuildID ) {
2133
+ continue
2134
+ }
2135
+ if wbp .Name != utp .Name {
2136
+ continue
2137
+ }
2138
+ if counts [key ]== nil {
2139
+ counts [key ]= make (map [string ]int64 )
2140
+ }
2141
+ counts [key ][wbp.Value ]++
2142
+ }
2143
+ }
2144
+
2145
+ var rows []database.GetTemplateParameterInsightsRow
2146
+ for key ,utp := range uniqueTemplateParams {
2147
+ for value ,count := range counts [key ] {
2148
+ rows = append (rows , database.GetTemplateParameterInsightsRow {
2149
+ Num :utp .Num ,
2150
+ TemplateIDs :utp .TemplateIDs ,
2151
+ Name :utp .Name ,
2152
+ DisplayName :utp .DisplayName ,
2153
+ Description :utp .Description ,
2154
+ Options :utp .Options ,
2155
+ Value :value ,
2156
+ Count :count ,
2157
+ })
2158
+ }
2159
+ }
2160
+
2161
+ return rows ,nil
2077
2162
}
2078
2163
2079
2164
func (q * FakeQuerier )GetTemplateVersionByID (ctx context.Context ,templateVersionID uuid.UUID ) (database.TemplateVersion ,error ) {