public void AggregateTest() { var entities = new List <ResultEntity>(); var r = new Random(DateTime.Now.Millisecond); for (var i = 0; i < 100; i++) { entities.Add(new ResultEntity { Sweep = i + 1, Seed = i % 3, Signal = i % 2 == 0 ? "A" : "B", Time = i % 2, Value = r.Next() }); } var tmp = Path.Combine(Path.GetTempPath(), "Ptolemy.Lib.RepositoryTest_AggregateTest"); var sqlite = Path.Combine(tmp, "sqlite.db"); Directory.CreateDirectory(tmp); using var repo = new SqliteRepository(sqlite); repo.BulkUpsert(entities); var ds = new List <Func <Map <string, decimal>, bool> > { m => m[LibraRequest.GetKey("A", 1)] <= r.Next(), m => m[LibraRequest.GetKey("B", 0)] >= r.Next(), m => m[LibraRequest.GetKey("A", 1)] > r.Next(), m => m[LibraRequest.GetKey("B", 0)] < r.Next() }; var filtered = entities.Where(s => s.Signal == "A" || s.Signal == "B") .Where(s => 1 <= s.Seed && s.Seed <= 2) .Where(s => 20 <= s.Sweep && s.Sweep <= 50) .AsEnumerable() .GroupBy(x => new { x.Sweep, x.Seed }) .Select(g => g.ToMap(k => LibraRequest.GetKey(k.Signal, k.Time), v => v.Value)) .ToList(); var expect = new long[ds.Count]; foreach (var item in ds.Select((d, i) => new { d, i })) { expect[item.i] = filtered.Count(item.d); } var actual = repo.Aggregate(new List <string> { "A", "B" }, (1, 2), (20, 50), ds, LibraRequest.GetKey, CancellationToken.None); Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert.AreEquivalent( expect, actual ); Directory.Delete(tmp, true); }
/// <summary> /// Start draco process /// </summary> public void Run() { Log.OnNext("Start Ptolemy.Draco"); Log.OnNext($"InputFile: {request.InputFile}"); Log.OnNext($"TargetDatabaseFile: {request.OutputFile}"); string[] document; try { Log.OnNext("Reading InputFile"); using var sr = new StreamReader(request.InputFile); document = sr.ReadToEnd() .Split("\n", StringSplitOptions.RemoveEmptyEntries) .Skip(1) .ToArray(); } catch (FileNotFoundException) { throw new DracoException($"file not found: {request.InputFile}"); } try { // input file's format // signalA signalB // 0. value value ... // ... // Get signal list var keys = document[0].Split(' ', StringSplitOptions.RemoveEmptyEntries); var writer = receiver.Buffer(request.BufferSize).Subscribe( r => { using var repo = new SqliteRepository(request.OutputFile); repo.BulkUpsert(r); WriteProgress.OnNext(Unit.Default); Log.OnNext($"Write {r.Count} records"); }, () => WriteProgress.OnCompleted()); token.Register(writer.Dispose); foreach (var line in document.Skip(1).SelectMany(line => { // Parse: time value value .... var rt = ResultEntity.Parse(request.Seed, request.Sweep, line, keys); ParseProgress.OnNext(Unit.Default); Log.OnNext($"Parsed: {line}"); return(rt); })) { token.ThrowIfCancellationRequested(); receiver.OnNext(line); } Log.OnNext($"Finished Parse"); receiver.OnCompleted(); ParseProgress.OnCompleted(); } catch (IndexOutOfRangeException) { throw new DracoException($"invalid file format: {request.InputFile}"); } catch (FormatException) { throw new DracoException($"データの数値に不正な値があります {request.InputFile}"); } catch (OperationCanceledException) { throw new DracoException("Canceled by user"); } catch (Exception e) { throw new DracoException($"Unknown error has occured\n\t-->{e}"); } }