Skip to content

Commit

Permalink
Merge pull request #230 from chuuddo/fix-missing-parent
Browse files Browse the repository at this point in the history
Fix adding parent after child in TransformToTree
  • Loading branch information
RolandPheasant committed Jun 10, 2019
2 parents b6d60da + de94676 commit 16d5a9c
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 21 deletions.
43 changes: 22 additions & 21 deletions DynamicData.Tests/Cache/TransformTreeFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,19 +126,33 @@ public void AddMissingChild()
[Fact]
public void AddMissingParent()
{
var minion = new EmployeeDto(1) { BossId = 2, Name = "DogsBody" };
var boss = new EmployeeDto(2) { BossId = 0, Name = "Boss" };
var emp10 = new EmployeeDto(10) { BossId = 11, Name = "Employee10" };
var emp11 = new EmployeeDto(11) { BossId = 0, Name = "Employee11" };
var emp12 = new EmployeeDto(12) { BossId = 13, Name = "Employee12" };
var emp13 = new EmployeeDto(13) { BossId = 11, Name = "Employee13" };

_sourceCache.AddOrUpdate(boss);
_sourceCache.AddOrUpdate(minion);
_sourceCache.AddOrUpdate(emp10);
_sourceCache.AddOrUpdate(emp11);
_sourceCache.AddOrUpdate(emp12);
_sourceCache.AddOrUpdate(emp13);

_result.Count.Should().Be(1);

var firstNode = _result.Items.First();
firstNode.Item.Should().Be(boss);
var emp11Node = _result.Lookup(11);
emp11Node.HasValue.Should().BeTrue();
emp11Node.Value.Children.Count.Should().Be(2);

var childNode = firstNode.Children.Items.First();
childNode.Item.Should().Be(minion);
var emp10Node = emp11Node.Value.Children.Lookup(10);
emp10Node.HasValue.Should().BeTrue();
emp10Node.Value.Children.Count.Should().Be(0);

var emp13Node = emp11Node.Value.Children.Lookup(13);
emp13Node.HasValue.Should().BeTrue();
emp13Node.Value.Children.Count.Should().Be(1);

var emp12Node = emp13Node.Value.Children.Lookup(12);
emp12Node.HasValue.Should().BeTrue();
emp12Node.Value.Children.Count.Should().Be(0);
}

[Fact]
Expand All @@ -165,19 +179,6 @@ public void ChangeParent()
emp3.Children.Lookup(4).HasValue.Should().BeFalse();
}

[Fact]
public void AddParent()
{
_sourceCache.AddOrUpdate(new EmployeeDto(1) { BossId = 2, Name = "E1" });
_sourceCache.AddOrUpdate(new EmployeeDto(2) { BossId = 1, Name = "E2" });

//we expect the children of node 4 to be pushed up become new roots
_result.Count.Should().Be(1);

var firstNode = _result.Items.First();
firstNode.Item.Id.Should().Be(1);
}

[Fact]
public void UseCustomFilter()
{
Expand Down
19 changes: 19 additions & 0 deletions DynamicData/Cache/Internal/TreeBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ public TreeBuilder([NotNull] IObservable<IChangeSet<TObject, TKey>> source, [Not
.Transform((t, v) => new Node<TObject, TKey>(t, v))
.AsObservableCache();
var groupedByPivot = allNodes.Connect()
.Synchronize(locker)
.Group(x => _pivotOn(x.Item))
.AsObservableCache();
void UpdateChildren(Node<TObject, TKey> parentNode)
{
var lookup = groupedByPivot.Lookup(parentNode.Key);
if (lookup.HasValue)
{
var children = lookup.Value.Cache.Items;
parentNode.Update(u => u.AddOrUpdate(children));
children.ForEach(x => x.Parent = parentNode);
}
}
//as nodes change, maintain parent and children
var parentSetter = allNodes.Connect()
.Do(changes =>
Expand All @@ -65,6 +81,7 @@ public TreeBuilder([NotNull] IObservable<IChangeSet<TObject, TKey>> source, [Not
switch (change.Reason)
{
case ChangeReason.Add:
UpdateChildren(change.Current);
break;
case ChangeReason.Update:
{
Expand Down Expand Up @@ -129,6 +146,7 @@ public TreeBuilder([NotNull] IObservable<IChangeSet<TObject, TKey>> source, [Not
// update the parent node
node.Parent = p;
updater.AddOrUpdate(node);
UpdateChildren(node);
break;
}
Expand Down Expand Up @@ -198,6 +216,7 @@ public TreeBuilder([NotNull] IObservable<IChangeSet<TObject, TKey>> source, [Not
parentSetter.Dispose();
allData.Dispose();
allNodes.Dispose();
groupedByPivot.Dispose();
refilterObservable.OnCompleted();
});
});
Expand Down

0 comments on commit 16d5a9c

Please sign in to comment.