Refactor runBenchmark in SkillTreeViewModel for New Report Generation Flow

This commit updates the runBenchmark method in the SkillTreeViewModel class to align with the new report generation flow. The updated method does the following:

1. Checks if a benchmark is already running to prevent overlapping runs.
2. Sets a flag to indicate that the benchmark is running and notifies the UI.
3. Reverses the selected node hierarchy for report generation.
4. Loops through each node in the reversed hierarchy to:
  - Generate a unique UUID for each test run.
  - Create a ReportRequestBody object.
  - Call the generateSingleReport method in the BenchmarkService.
  - Update the UI after each single report is generated.

5. After all single reports are generated, it calls the generateCombinedReport method in the BenchmarkService, passing in all the generated UUIDs.

6. Finally, it sets the benchmark running flag to false and notifies the UI.

This change improves the report generation flow and allows for both individual and combined reports.
This commit is contained in:
hunteraraujo
2023-09-18 19:55:01 -07:00
parent 5814c5a365
commit bf03dd8739
2 changed files with 44 additions and 24 deletions

View File

@@ -7,6 +7,7 @@ import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:graphview/GraphView.dart';
import 'package:uuid/uuid.dart';
class SkillTreeViewModel extends ChangeNotifier {
// TODO: Potentially move to task queue view model when we create one
@@ -130,32 +131,58 @@ class SkillTreeViewModel extends ChangeNotifier {
}
}
// TODO: Update to actual implementation
Future<void> runBenchmark(ReportRequestBody reportRequestBody) async {
// TODO: Update to actual implementation
Future<void> runBenchmark() async {
// Set the benchmark running flag to true
isBenchmarkRunning = true;
notifyListeners();
try {
final result = await benchmarkService.generateReport(reportRequestBody);
// Pretty-print the JSON result
String prettyResult = JsonEncoder.withIndent(' ').convert(result);
print("Report generated: $prettyResult");
} catch (e) {
print("Failed to generate report: $e");
}
// Initialize an empty list to collect unique UUIDs for test runs
List<String> testRunIds = [];
isBenchmarkRunning = false;
try {
// Reverse the selected node hierarchy
final reversedSelectedNodeHierarchy =
List.from(_selectedNodeHierarchy!.reversed);
// Loop through the reversed node hierarchy to generate reports for each node
for (var node in reversedSelectedNodeHierarchy) {
// Generate a unique UUID for the test run
final uuid = const Uuid().v4();
// Create a ReportRequestBody object
final reportRequestBody = ReportRequestBody(
test: node.data.name, testRunId: uuid, mock: true);
// Call generateSingleReport with the created ReportRequestBody object
final singleReport =
await benchmarkService.generateSingleReport(reportRequestBody);
print("Single report generated: $singleReport");
// Add the unique UUID to the list
// TODO: We should check if the test passed. If not we short circuit.
// TODO: We should create a model to track our active tests
testRunIds.add(uuid);
// Notify the UI
notifyListeners();
}
// TODO: Update to actual implementation
Future<void> requestBenchmarkStatusUpdate(int lastUpdateTime) async {
try {
final result = await benchmarkService.pollUpdates(lastUpdateTime);
print("Updates polled: $result");
// Generate a combined report using all the unique UUIDs
final combinedReport =
await benchmarkService.generateCombinedReport(testRunIds);
// Pretty-print the JSON result
String prettyResult =
JsonEncoder.withIndent(' ').convert(combinedReport);
print("Combined report generated: $prettyResult");
} catch (e) {
print("Failed to poll updates: $e");
print("Failed to generate reports: $e");
}
// Set the benchmark running flag to false
isBenchmarkRunning = false;
notifyListeners();
}
// Getter to expose nodes for the View

View File

@@ -56,15 +56,8 @@ class TaskQueueView extends StatelessWidget {
onPressed: viewModel.isBenchmarkRunning
? null
: () {
// Create a ReportRequestBody with hardcoded values
ReportRequestBody reportRequestBody = ReportRequestBody(
category: "",
tests: testNames,
mock: true,
);
// Call runBenchmark method from SkillTreeViewModel
viewModel.runBenchmark(reportRequestBody);
viewModel.runBenchmark();
},
child: Row(
mainAxisAlignment: