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/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:graphview/GraphView.dart'; import 'package:graphview/GraphView.dart';
import 'package:uuid/uuid.dart';
class SkillTreeViewModel extends ChangeNotifier { class SkillTreeViewModel extends ChangeNotifier {
// TODO: Potentially move to task queue view model when we create one // TODO: Potentially move to task queue view model when we create one
@@ -130,34 +131,60 @@ class SkillTreeViewModel extends ChangeNotifier {
} }
} }
// TODO: Update to actual implementation // TODO: Update to actual implementation
Future<void> runBenchmark(ReportRequestBody reportRequestBody) async { Future<void> runBenchmark() async {
// Set the benchmark running flag to true
isBenchmarkRunning = true; isBenchmarkRunning = true;
notifyListeners(); notifyListeners();
// Initialize an empty list to collect unique UUIDs for test runs
List<String> testRunIds = [];
try { try {
final result = await benchmarkService.generateReport(reportRequestBody); // 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();
}
// Generate a combined report using all the unique UUIDs
final combinedReport =
await benchmarkService.generateCombinedReport(testRunIds);
// Pretty-print the JSON result // Pretty-print the JSON result
String prettyResult = JsonEncoder.withIndent(' ').convert(result); String prettyResult =
print("Report generated: $prettyResult"); JsonEncoder.withIndent(' ').convert(combinedReport);
print("Combined report generated: $prettyResult");
} catch (e) { } catch (e) {
print("Failed to generate report: $e"); print("Failed to generate reports: $e");
} }
// Set the benchmark running flag to false
isBenchmarkRunning = false; isBenchmarkRunning = false;
notifyListeners(); notifyListeners();
} }
// TODO: Update to actual implementation
Future<void> requestBenchmarkStatusUpdate(int lastUpdateTime) async {
try {
final result = await benchmarkService.pollUpdates(lastUpdateTime);
print("Updates polled: $result");
} catch (e) {
print("Failed to poll updates: $e");
}
}
// Getter to expose nodes for the View // Getter to expose nodes for the View
List<SkillTreeNode> get skillTreeNodes => _skillTreeNodes; List<SkillTreeNode> get skillTreeNodes => _skillTreeNodes;

View File

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