experimentDetailsFromState builds ExperimentDetails from a state.json.
(workflowID, branchName string, state *ExperimentState)
| 673 | |
| 674 | // experimentDetailsFromState builds ExperimentDetails from a state.json. |
| 675 | func experimentDetailsFromState(workflowID, branchName string, state *ExperimentState) *ExperimentDetails { |
| 676 | experiments := make([]ExperimentVariantStats, 0, len(state.Counts)) |
| 677 | for name, variants := range state.Counts { |
| 678 | total := 0 |
| 679 | for _, c := range variants { |
| 680 | total += c |
| 681 | } |
| 682 | experiments = append(experiments, ExperimentVariantStats{ |
| 683 | Name: name, |
| 684 | Variants: variants, |
| 685 | Total: total, |
| 686 | }) |
| 687 | } |
| 688 | slices.SortFunc(experiments, func(a, b ExperimentVariantStats) int { |
| 689 | switch { |
| 690 | case a.Name < b.Name: |
| 691 | return -1 |
| 692 | case a.Name > b.Name: |
| 693 | return 1 |
| 694 | default: |
| 695 | return 0 |
| 696 | } |
| 697 | }) |
| 698 | |
| 699 | recentRuns := state.Runs |
| 700 | const maxRecentRuns = 10 |
| 701 | if len(recentRuns) > maxRecentRuns { |
| 702 | recentRuns = recentRuns[len(recentRuns)-maxRecentRuns:] |
| 703 | } |
| 704 | |
| 705 | return &ExperimentDetails{ |
| 706 | WorkflowID: workflowID, |
| 707 | Branch: branchName, |
| 708 | TotalRuns: experimentTotalRuns(state), |
| 709 | Experiments: experiments, |
| 710 | RecentRuns: recentRuns, |
| 711 | } |
| 712 | } |
| 713 | |
| 714 | // experimentTotalRuns returns the total number of runs recorded in the state. |
| 715 | // Prefers the runs array length when non-empty; falls back to summing all variant counts. |