public static Node GetOther(this NodeRelation rel, Node oneSide) { if (rel.Node1 != oneSide && rel.Node2 != oneSide) { throw new InvalidOperationException($"Node {oneSide} is not a part of relation {rel}."); } return(oneSide == rel.Node1 ? rel.Node2 : rel.Node1); }
protected void CommitBoundChange(Bound record) { var root1 = record.Item1.ResolveRoot(); var node1 = this.metadataIndexed.AllocateNode(root1.CurrentPath); var root2 = record.Item2.ResolveRoot(); var node2 = this.metadataIndexed.AllocateNode(root2.CurrentPath); var link = new NodeRelation(RelationKind.Bound, node1, node2); var nodeRecord = new NodeRecord(record.BatchIndex, record.StageName, record.PluginId, record.PluginMetadata, record.Tags, null, new NodeRelation[] { link }); node1.AddRecord(nodeRecord); node2.AddRecord(nodeRecord); }
public void AddRelation(NodeRelation relation) { if (relation.Node1 == this || relation.Node2 == this) { if (!this.relations.ContainsKey(relation.RelationKind)) { this.relations.Add(relation.RelationKind, new List <NodeRelation>()); } if (!this.relations[relation.RelationKind].Contains(relation)) { this.relations[relation.RelationKind].Add(relation); } } }
protected void CommitGeneratedChange(Generated record) { var subjectRoots = record.Subject.ResolveRoots(); var subjectNodes = new List <Node>(); foreach (var r in subjectRoots) { subjectNodes.Add(this.metadataIndexed.AllocateNode(r.CurrentPath)); } if (record.From != null) { NodeRelation[] relations = new NodeRelation[subjectNodes.Count]; var fromNode = this.metadataIndexed.AllocateNode(record.From.ResolveRoot().CurrentPath); for (var i = 0; i < subjectNodes.Count; i++) { relations[i] = new NodeRelation(RelationKind.GeneratedFrom, subjectNodes[i], fromNode); } var nodeRecord = new NodeRecord(record.BatchIndex, record.StageName, record.PluginId, record.PluginMetadata, record.Tags, ChangeKind.Created, relations); foreach (var n in subjectNodes) { n.AddRecord(nodeRecord); } foreach (var link in relations) { fromNode.AddRelation(link); } } else { var nodeRecord = new NodeRecord(record.BatchIndex, record.StageName, record.PluginId, record.PluginMetadata, record.Tags, ChangeKind.Created, null); foreach (var n in subjectNodes) { n.AddRecord(nodeRecord); } } }