public void Test() { PTree <int> tree = new PTree <int>(1, 10); var parent2 = tree.AddNode(2, tree.Root); var parent3 = tree.AddNode(3, tree.Root); tree.AddNode(4, parent2); tree.AddNode(5, parent2); tree.AddNode(6, parent3); tree.AddNode(7, parent3); tree.AddNode(8, parent3); _testOutputHelper.WriteLine($"树的节点数量:{tree.Count}"); _testOutputHelper.WriteLine($"树的根节点:{tree.Root.Data}"); _testOutputHelper.WriteLine(""); _testOutputHelper.WriteLine("树的全部节点:"); foreach (var node in tree.GetChilds()) { _testOutputHelper.WriteLine($"节点数据:{node.Data},父节点index:{node.ParentIndex}"); } _testOutputHelper.WriteLine(""); _testOutputHelper.WriteLine($"节点数据为“{parent2.Data}”的子节点为:"); foreach (var node in tree.GetChilds(parent2)) { _testOutputHelper.WriteLine($"节点数据:{node.Data},父节点index:{node.ParentIndex}"); } _testOutputHelper.WriteLine(""); _testOutputHelper.WriteLine($"节点数据为“{parent3.Data}”的子节点为:"); foreach (var node in tree.GetChilds(parent3)) { _testOutputHelper.WriteLine($"节点数据:{node.Data},父节点index:{node.ParentIndex}"); } }
public void PTreeDeletesByIndexIndividualUnique() { _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString(); Cleanup(); var objs = TestResourceFactory.GetMockClassAObjects(50).ToList(); var seedIndex = new Seed32(); var seedSegment = new Seed64(); objs.ForEach(o => o.Id = seedIndex.Increment()); using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index", true)) { tree.Load(); foreach (var o in objs) tree.AddOrUpdate(new Tuple<MockClassA, long>(o, seedSegment.Increment())); Assert.AreEqual(50, tree.Length); Assert.AreEqual(5, tree.GetFirstByIndex(5)); Assert.AreEqual(5, tree.GetFirstBySegment(5)); Assert.AreEqual(1, tree.GetByIndex(5).Count()); Assert.AreEqual(1, tree.Delete(5).Length); Assert.AreEqual(50, tree.Length); Assert.AreEqual(0, tree.GetFirstByIndex(5)); } }
public dynamic Evaluate(PTree node) { switch (node) { case PInt pi: return(!(pi.Type is EInt ei && !ei.Signed) ? (dynamic)(ulong)pi.Value : pi.Value); case PString ps: return(ps.String); case PName pn when Locals.ContainsKey(pn.Name): return(Locals[pn.Name]); case PList pl: { if (!(pl[0] is PName(var name))) { throw new NotSupportedException($"First element of list {node} is not a name: {pl[0]}"); } if (Core.Statements.TryGetValue(name, out var st) && st.Execute != null) { return(st.Execute(pl, this)); } if (Core.Expressions.TryGetValue(name, out var et) && et.Execute != null) { return(et.Execute(pl, this)); } throw new NotImplementedException($"No compile-time execution of {node}"); } default: throw new NotImplementedException($"Evaluation failed on node {node}"); } }
public void PTreePushesEntities() { _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString(); Cleanup(); var objs = TestResourceFactory.GetMockClassAObjects(50).ToList(); var seedIndex = new Seed32(); var seedSegment = new Seed64(); objs.ForEach(o => o.Id = seedIndex.Increment()); var toAdd = objs.Select(o => new Tuple<MockClassA, long>(o, seedSegment.Increment())).ToList(); using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index", true)) { tree.Load(); var ids = tree.AddOrUpdateRange(toAdd); tree.AddOrUpdate(toAdd.First()); Assert.AreEqual(50, tree.Length); Assert.AreEqual(5L, tree.GetFirstByIndex(5)); Assert.AreEqual(5, tree.GetFirstBySegment(5)); Assert.AreEqual(1, tree.GetByIndex(1).Count()); Assert.AreEqual(5, tree.GetFirstBySegment(5)); } }
public static EType TypeFromName(PTree expr) { if(!(expr is PName name)) throw new NotSupportedException($"Attempted to make type from expr {expr.ToPrettyString()}"); var ns = name.Name; if(ns[0] == 'f') return new EFloat(int.Parse(ns.Substring(1))); if(ns == "vec") return EType.Vector; return ns[0] == 'i' ? new EInt(true, int.Parse(ns.Substring(1))) : new EInt(false, int.Parse(ns.Substring(1))); }
public void PTreeFetchesByIndexRange() { _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString(); Cleanup(); var objs = TestResourceFactory.GetMockClassAObjects(5000).ToList(); var seedIndex = new Seed32(); var seedSegment = new Seed64(); objs.ForEach(o => o.Id = seedIndex.Increment()); var toAdd = objs.Select(o => new Tuple<MockClassA, long>(o, seedSegment.Increment())).ToList(); using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index")) { tree.Load(); var ids = tree.AddOrUpdateRange(toAdd); Assert.AreEqual(5000, tree.Length); Assert.AreEqual(5, tree.GetFirstByIndex(5)); Assert.AreEqual(5, tree.GetFirstBySegment(5)); Assert.AreEqual(1, tree.GetByIndex(5).Count()); tree.AddOrUpdate(new Tuple<MockClassA, long>(TestResourceFactory.CreateRandom().WithId(seedIndex.Increment()), seedSegment.Increment())); Assert.AreEqual(5001, tree.Length); long[] loc; var range = tree.GetByIndexRangeInclusive(51, 250, out loc); Assert.AreEqual(200, range.Length); } using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index")) { tree.Load(); Assert.AreEqual(5001, tree.Length); } }
public void PTreeChecksAllWithLargeCount() { _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString(); Cleanup(); using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index", true)) { tree.Load(); var objs = new List<MockClassA>(); var seedIndex = new Seed32(); var seedSegment = new Seed64(); for (var i = 0; i < 5; i++) { var additions = TestResourceFactory.GetMockClassAObjects(100000).ToList(); additions.ForEach(o => o.Id = seedIndex.Increment()); tree.AddOrUpdateRange(additions.Select(o => new Tuple<MockClassA, long>(o, seedSegment.Increment())).ToList()); } Assert.AreEqual(500000, tree.Length); Assert.AreEqual(5, tree.GetFirstByIndex(5)); Assert.AreEqual(5, tree.GetFirstBySegment(5)); Assert.AreEqual(1, tree.GetByIndex(5).Count()); tree.AddOrUpdate(new Tuple<MockClassA, long>(TestResourceFactory.CreateRandom().WithId(seedIndex.Increment()), seedSegment.Increment())); Assert.AreEqual(500001, tree.Length); tree.AddOrUpdateRange( tree.AsEnumerable().First().Take(100) .Select(s => new NTreeItem<int, long>(s.Item2.Index, s.Item2.Segment)) .ToList()); Assert.AreEqual(500001, tree.Length); } }
public static string GenerateExpression(PTree expr, bool lhs = false) => Program.GenerateExpression(expr, lhs);
public void PTreeStreamsData() { _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString(); Cleanup(); var objs = TestResourceFactory.GetMockClassAObjects(5000).ToList(); var seedIndex = new Seed32(); var seedSegment = new Seed64(); objs.ForEach(o => o.Id = seedIndex.Increment()); var toAdd = objs.Select(o => new Tuple<MockClassA, long>(o, seedSegment.Increment())).ToList(); using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index")) { tree.Load(); var ids = tree.AddOrUpdateRange(toAdd); Assert.AreEqual(5000, tree.Length); Assert.AreEqual(5, tree.GetFirstByIndex(5)); Assert.AreEqual(5, tree.GetFirstBySegment(5)); Assert.AreEqual(1, tree.GetByIndex(5).Count()); foreach (var p in tree.AsStreaming()) { if (p == null) continue; p.Dispose(); } } }
public void PTreePushesLotsOfDuplicateEntities() { _testName = MethodInfo.GetCurrentMethod().Name.GetHashCode().ToString(); Cleanup(); var objs = TestResourceFactory.GetMockClassAObjects(5000).ToList(); var seedIndex = new Seed32(); var seedSegment = new Seed64(); objs.ForEach(o => o.Id = seedIndex.Increment()); var toAdd = objs.Select(o => new Tuple<MockClassA, long>(o, seedSegment.Increment())).ToList(); using (var tree = new PTree<int, MockClassA, long>("Id", _testName + ".index")) { tree.Load(); var ids = tree.AddOrUpdateRange(toAdd); Assert.AreEqual(5000, tree.Length); Assert.AreEqual(5, tree.GetFirstByIndex(5)); Assert.AreEqual(5, tree.GetFirstBySegment(5)); Assert.AreEqual(1, tree.GetByIndex(5).Count()); tree.AddOrUpdate(new Tuple<MockClassA, long>(TestResourceFactory.CreateRandom().WithId(seedIndex.Increment()), seedSegment.Increment())); Assert.AreEqual(5001, tree.Length); tree.AddOrUpdateRange(toAdd.Skip(100).Take(100).ToList()); Assert.AreEqual(5101, tree.Length); Assert.AreEqual(2, tree.GetBySegment(toAdd[101].Item2).Count()); } }