public IEnumerable <DependencyGraphNode> GetGraph(Schedule schedule) { if (_dictionary.ContainsKey(schedule)) { return(_dictionary[schedule]); } var graph = _builder.GetGraph(schedule); _dictionary[schedule] = graph; return(graph); }
public bool IsConflictSerializable(Schedule schedule) { var graph = _builder.GetGraph(schedule); foreach (var node in graph) { if (_cycleChecker.HasCycles(node)) { return(false); } } return(true); }
public Schedule GetSerialSchedule(Schedule originalSchedule) { if (!_analyzer.IsConflictSerializable(originalSchedule)) { //throw new InvalidOperationException("Cannot generate a serial schedule for a non-conflict serializable graph."); MessageBox.Show("Cannot generate a serial schedule for a non-conflict serializable graph."); } var graph = _builder.GetGraph(originalSchedule); // walk through the graph until a node is found that has no // dependencies, or all dependencies that we've already satisfied. // Continue until we're done. var processedNodes = new List <DependencyGraphNode>(); var steps = new List <TransactionStep>(); foreach (var node in graph) { if (!node.Dependencies.Any()) { GenerateSchedule(node, processedNodes, steps); } } while (originalSchedule.Steps.Length > steps.Count) { foreach (var node in graph) { GenerateSchedule(node, processedNodes, steps); } } return(new Schedule() { Steps = steps.ToArray() }); }