コード例 #1
0
ファイル: RepositoryTest.cs プロジェクト: xztaityozx/ptolemy
        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);
        }
コード例 #2
0
        /// <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}");
            }
        }